2013-02-14 1 views
0

기본 주소와 최상위 주소로 지정된 메모리 블록에 패턴을 쓰는 코드 (FPGA에서 실행 됨)를 작성 중입니다. 데이터 폭은 64 비트이고 주소 공간은 32 비트입니다. 내 시스템에서 longs는 32 비트이고 long long은 64 비트입니다. 코드는 다음과 같은 :32 비트 주소 공간에 64 비트 정수 반복기를 사용합니까?

unsigned long base_addr = 0xC0000000; 
unsigned long high_addr = 0xFFFFFFFF; 
unsigned long long i; 

for(i = base_addr; i <= high_addr; i += 4){ 
    *((unsigned long *) i) = some_pattern; 
} 

모든 것이 잘 작동하지만 컴파일러에서 경고 "다른 크기의 정수에서 포인터로 캐스트"는 얻을. 32 비트 반복자 변수를 사용하면 반복기가 0xFFFFFFFC를 히트하고 0으로 다시 오버플로되기 때문에 코드가 무한 루프됩니다.

더 좋은 방법이 있나요? 32 비트 이터레이터를 문제없이 사용하는 방법이 많이 있다는 것을 알고 있습니다. (오버플로를 예측/예측하여 high_addr에서 3을 뺍니다.)하지만이 코드는 가장 간단하고 읽기 쉽습니다. 알려진 컴파일러 오류가있는 코드를 작성하는 것이 좋지 않은 스타일로 간주됩니까?

답변

2

iunsigned long long으로 선언하고 있습니까? 그것의 요점은 무엇입니까?

본인이 말했듯이 플랫폼의 주소는 32 비트입니다. base_addrhigh_addr과 같이 iunsigned long으로 설정하십시오. 경고가 사라집니다.

한편 "데이터 폭은 64 비트"란 의미는 무엇입니까? 데이터 (및 패턴)이 실제로 다음

또한
for (i = base_addr; i <= high_addr; i += 8){ /* or i += sizeof(unsigned long long) */ 
    *((unsigned long long *) i) = some_pattern; 
} 

했음 64 비트 인 경우, 액세스, 예를 들어, i가 반복 동안 high_addr가되고, 경우,주기 체 여전히 실행할 유의 high_addr을 넘어 7 여분의 바이트. 그것이 의도였습니까? 그것을 할 수있는 더 좋은 방법의

2

내 생각 :

unsigned long long *base_addr = (unsigned long long *)0xC0000000; 
unsigned long long *high_addr = (unsigned long long *)0xFFFFFFFF; 
unsigned long long *i; 

for (i = base_addr; i < high_addr; ++i) { 
    *i = some_pattern; 
} 

포인터 (I)에주의 할 필요가있다 랩 어라운드, i < base_addr 경우도 for 루프를 중단하여.