본문 바로가기

[AVR]/AVR_EVM

WINAVR에서 long type shift 연산 버그 및 해결법



WINAVR에서 long type으로 시프트연산을 사용하면 0으로되는 현상을 발견했다.
이것때문에 3시간이상 고생했다.
결국 memcpy함수를 이용해서 변수를 복사 하는방법을 해결하였다.

unsigned long GetFileSize(void)
{
 unsigned char buffer[4] = {0x00, 0x24, 0x3d, 0x2a};
 unsigned long size = 0;

 printf("%02x ", buffer[0]);
 printf("%02x ", buffer[1]);
 printf("%02x ", buffer[2]);
 printf("%02x ", buffer[3]);

 printf("\r\n");

//Shif연산 사용
 size = (buffer[3]<<24) | (buffer[2]<<16) | (buffer[1]<<8) | buffer[0];
 printf("1]size=0x%lx\r\n", size);
 
//memcpy 함수 사용
 memcpy((unsigned char *)&size, (unsigned char *)&buffer[0], 4);
 printf("2]size=0x%lx\r\n", size); 

 return size/512;


출력결과
AVR Test Program1
00 24 3d 2a
1]size=0x2400 <- Shif연산 사용
2]size=0x2a3d2400 <-memcpy 함수 사용

반응형