코드중에 위와 같은 코드가 있는데 저 이름들을 찾아보니 선언된 변수가 아니고 그냥
#define GAFR1_L 0x5C 이런식으로 되어있는데 이렇게 해서 하드웨어에 직접 값을 넣을수 있는건가요?
일반 PC에서는 저런 코드가 안되는걸로 알고있는데요.. 참고로 장비는 하이버스사의 "어쩌구255"이었습니다
MMU가 꺼져 있어 physical address로 접근하는 경우에는 됩니다.
MMU가 켜져 있더라도, 접근하려는 virtual address에 해당하는 physical address가 제대로 맵핑되어 있고, permission이나 alignment 문제가 없으면 접근이 됩니다. PC의 경우, 일반적으로 사용자 application은 MMU가 켜진 상태에서 HW 주소에 대한 permission이 없는 상태로 수행되므로 안되는거죠. 자세한 내용은 ARM Architecture Reference Manual의 Chapter B3 MMU를 참조하시기 바랍니다.
MMU가 꺼져 있어
MMU가 꺼져 있어 physical address로 접근하는 경우에는 됩니다.
MMU가 켜져 있더라도, 접근하려는 virtual address에 해당하는 physical address가 제대로 맵핑되어 있고, permission이나 alignment 문제가 없으면 접근이 됩니다. PC의 경우, 일반적으로 사용자 application은 MMU가 켜진 상태에서 HW 주소에 대한 permission이 없는 상태로 수행되므로 안되는거죠. 자세한 내용은 ARM Architecture Reference Manual의 Chapter B3 MMU를 참조하시기 바랍니다.
자삭
자삭합니다
소스 다시
소스 다시 보시지요.
적으신 대로라면 동작이 문제가 아니라 컴파일 에러가 나야 마땅합니다.
OTL
에러 안나는데요?
에러 안나는데요?
소스를 잘 못
소스를 잘 못 보셨다는 말입니다.
OTL
갑자기
갑자기 아리까리하네요. 원래 C언어에서 lvalue는 변수가 와야하는데 그냥 16진수값이 오면 자동으로 메모리로 가는건지..
헤더 파일에는 요런것들이 선언되어 있습니다
#define GAFR1_L
코드를 잘 못 보신듯, 포인터 연산이네요..
흐음...
Memory Mapped I/O 를 찾아보세요.
Memory Mapped I/O에서는 칩에 특정 레지스터에 주소값을 가집니다.
#define GPIO_BASE 0x40E00000
이 부분은 연결된 코어의 기본 주소입니다.
이 주소를 기준으로 주소 번지에 따라 각 기능을 하는 레지스터를 컨트롤 할 수 있는 것입니다.
예를 들어
// GP39, GP40, GP41À» UART(10)·Î »ç¿ëÇÑ´Ù.
GAFR1_L |= 0x000A8000;
GPDR1 |= 0x00000380;
의 경우는 GPIO 39번과 41번을 세팅하는 부분이 되겠지요. 스펙이 어떻게 되는지는 모르겠지만 기본적으로 해당 Bit를 1 혹은 0으로 세팅함으로써 GPIO pin이 I/O 전압에 따라 High 또는 Low가 되겠죠.
#define GAFR1_L 0x5C
는 Base address에서 해당 레지스터의 offset 값입니다. Base address에서 해당 offset까지 이동한 위치의 레지스터를 세팅하는 동작을 하겠지요.
칩의 레지스터를 컨트롤한다고 생각하면 될 것 같습니다.
댓글 달기