2011-03-09 4 views
0

내장 된 장치의 메모리를 64 비트 초기화해야하는 기능을 작성했습니다. 이 기능이이 작업을 수행 할 사람이 누구인지 말해 줄 수 있습니까?C에서 64 비트 쓰기 연산입니까

void write64BitValueTo(void* address, U_INT64 pattern) 
{ 

    int i; 

    U_INT64 size = (0x20000000/sizeof(U_INT64)); 

    //printf("Size = 0x%8X \n",size); 
    U_INT64 *ptr = (U_INT64 *) address; 

    for(i = 0; i< size; i++) 
    { 
     *ptr = pattern; 
     ptr++; 
    } 
} 
+0

가능하지만 그렇다고해도 크기 0x20000000을 인수로 전달해야합니다. – stijn

+0

지정된 주소에서 시작하여 512MB 이상의 패턴을 씁니다. 그게 원하는거야? –

+0

그래, 이건 그냥 크기가 항상 동일 테스트 기능입니다. – JohnB

답변

0

그것은 한 address이 제대로 아키텍처 64 비트 워드를 저장 할 수 있도록 정렬로 작동합니다.

궁금 해요 :

for(i = 0; i < size; i++) 
    *ptr++ = pattern; 

이 간단하고 쓰기 쉽게 읽을 때 왜

for(i = 0; i< size; i++) 
{ 
    *ptr = pattern; 
    ptr++; 
} 

쓸 수 있습니까?

1

ptrvolatile U_INT64 *ptr으로 선언해야 컴파일러가 *ptr = pattern 할당을 최적화 할 수 있습니다.

패턴이 실제로 데이터 캐시뿐만 아니라 메모리에 기록되는 것이 중요하다면 나중에 캐시를 플러시해야합니다. 그렇지 않으면 코드가 정상적으로 보인다.

+0

어 ... 어떻게 컴파일러 가능한 멀리 그것을 최적화 ??? – AnT

+0

컴파일러가 저장된 값이 이후에 사용되지 않는다고 판단하면 휘발성 한정자를 사용하지 않으면 컴파일 된 값을 최적화 할 수 있습니다. 이 경우에는 함수가 정적으로 선언되지 않으므로 가능성이 희박합니다. – Frederico