2013-07-08 7 views
1

8052 임베디드 플랫폼에서 응용 프로그램 코드에 대한 CRC32를 계산하려고합니다.주소를 포함하는 변수에 대한 포인터

다음은 CRC 계산에 가이드로 제공됩니다 다음

void TestChecksum() 
{ 
    unsigned short calc = 0; 

    /* Run the checksum algorithm */ 
    calc = slow_crc16(0, (unsigned char *) ChecksumStart, (ChecksumEnd - ChecksumStart+1)); 

    /* Rotate out the answer */ 
    unsigned char zeros[2] = {0, 0}; 
    calc = slow_crc16(calc, zeros, 2); 

    etc... 
} 

경우의 예와

unsigned short slow_crc16(unsinged short sum, unsigned char *p, unsigned int len) 
{ 
    while (len--) 
    { 
     int i; 
     unsigned char byte = *(p++); 

     for (i = 0; i < 8; ++i) 
     { 
      etc... 
     } 
} 

문제는 내가 CODE 후 해요 반면 포인터가 자동으로 XDATA를 가리키는 것입니다 . CRC를 계산할 코드의 주소를 알고 있습니다 (0x2000에서 0x2FFF까지).

uint8_t __code *Ptr; 

을 그리고 주소에 전달하는 CRC 함수에 UINT32로,의에 0x2000을 :

는 말과 같은 포인터를 정의 할 수 있습니까?

는 기본적으로 나는 포인터가 실제로 변수에 저장되어있는 주소를 가리 키도록하는 방법을 알아 작동하지 않을 수 있습니다.

도움이된다면, 이것이 가능할 지 모르겠다.

+0

을 그 값 : Ptr = 0x2000; – Magn3s1um

답변

0

포인터는 정수이고; 다른 포인터 (또는 숫자)와 섞여서 멈추는 특별한 유형이 있습니다. 많은 아키텍처에

당신은 아무것도 잃지 않고 다시 번호에 대한 포인터를 변환 할 수 있습니다

char *ptr = (char *)0x2000; 
int address = (int)ptr; 

[포인터의 "정수"일반 int "에 다른 크기 곳이 아키텍처에서 작동하지 않습니다 정수". 당신은 거의 확실도에 대한 상관 없어 몇 가지 다른 이국적인 경우가 있습니다]

는 사실, 유일한 방법은 그것을 역 참조에있는 포인터가 "정수가 될"이외의 아무것도 할 얻을 :.

char c = *ptr; 

이나, 똑같은 사용하여 배열 표기법 :

: ptrstruct 유형에 대한 포인터 인 경우에만

char c = ptr[0]; 

또는,

이 모든 경우에 주소로 포인터를 사용하고 메모리에서 참조 된 데이터를 가져옵니다.

마지막으로, 당신은 을 얻을 수있는 "주소의"연산자 (일명 "참조"연산자)를 사용하여 변수에 대한 포인터 : 당신이 시작 주소를 알고, 그냥 포인터를 설정

char c = 'Z'; 
char *ptr = &c; 
관련 문제