2013-07-01 2 views
3

에서 원자 숫자 저장 /로드 ARM Cortex-A9 MPCore 구현에서 32 비트 정수를 할당하고 액세스하는 것이 원자 연산이며 할당 된 값이 모든 코어와 동기화된다고 가정하는 것이 안전합니까? C 컴파일러 보증ARM Cortex-A9 MPCore

uint32_t *p; 
*p = 4711; 

uint32_t *p; 
return *p; 

은 어셈블러에 원자 작업으로 변환하는 것?

+0

항상 개체 파일을 분해하고 직접 확인할 수 있습니다. –

+0

@ JoachimPileborg, 절대하지 마세요. 빌드 구성에 따라 결과가 달라질 수 있습니다. – sh1

답변

4

"원자"및 "모든 코어와 동기화"는 서로 다른 요구 사항입니다. 시중의 모든 ARM 코어는 원자 적으로 32 비트 연산을 구현합니다 (즉, 나머지는 쓰지 않는 단어의 "일부"를 결코 볼 수 없다). 아니요 모두 코어간에 캐시 일관성이 있으며 세부 정보 (특히 big.LITTLE와 같은 더 복잡한 구성의 경우)가 복잡합니다.

OS 동기화 프리미티브를 사용하십시오. 이러한 복잡성은 추상적으로 디자인 된 것입니다.

2

아니요. 이유는 strex/ldrex입니다. 코어 내에서 정상적인 str과 ldr은 괜찮지 만, 다른 코어에 대한 액세스를 확보하려면 strex/ldrex를 사용해야하며 (그리고 이들을 지원하는 메모리 시스템이 있어야합니다.)