주소값을 가지고 셋팅 하는 부분에서...
글쓴이: paeksj98 / 작성시간: 화, 2008/08/19 - 5:29오후
두가지 질문을 드리겠습니다..^^
1.
addr_1 = 0x8000 0000 이고
addr_2 = (addr_1 / sizeof(unsigned long)) * sizeof(unsigned long);
제가 보기에는 1과 2는 같은거라고 생각되는데 구지 2로 했는지 이해가 가질.....^^
2.
addr_1 = 0x8000 0000 이고
ungigned long addr_2 = *(volatile unsigned long*) addr_1
2번과 같이 주소를 넘겨주면 제생각에는 0x8000 0000이 그대로 넘어가야 할듯한데.
addr_2에 들어가는 값은 다른값이 들어가네요...
2번은 잘이해가 되질.....ㅠㅠ
제가 질문을 제대로 드린건지......
소스를 막상 받고 혼자 이해를 하려니 생각보다 막히는게 많아서 이렇게 질문을 올립니다.
그럼 수고하세요.
Forums:
1번은 주소 정렬에 관련된 문제입니다.
1번은 임의의 숫자에 대한 배수를 만들 때 사용하는 방법입니다. (2의 배수라면 mask로 간단히 처리할 수 있습니다만... 아마도 컴파일러의 최적화 능력을 믿고 저렇게 한 듯 싶습니다) addr_2에는 unsigned long의 크기의 배수만큼 정렬된 주소가 들어가게 됩니다. (unsigned long이 4바이트라면 4 바이트의 배수로 정렬됩니다) 원리는 간단합니다. 정수를 나누면 몫만 결과로 남게 됩니다. 이 몫에 나눈 숫자를 곱하면 원래의 숫자에서 나머지가 사라진 값을 구할 수 있습니다.
2번은 addr_1에 든 주소의 값을 읽으려고 했기 때문에 그렇게 되는 겁니다. 그냥 포인터를 unsigned long 형으로 바꾸고 싶다면 addr_2 = (unsigned long)addr_1; 으로 충분합니다.
댓글 달기