2012-09-11 2 views
0

커스텀 HW의 임베디드 리눅스 환경에서 TMS320DM368을 사용하여 비동기 외부 메모리 인터페이스 (AEMIF)를 읽어야합니다. 레오파드 보드 368에서 vala 코드 (아래)를 테스트하기 위해 실제로 하드웨어가 아직 없습니다. 첫 번째 AEMIF는 부트 로더가 nand 플래시를 읽는 데 사용됩니다. 코드에서 두 번째 AEMIF를 사용하여 표범 게시판에 있지 않지만 사용자 지정 HW에있는 SRAM을 읽으려고합니다. 분할 된 오류가 보호 된 메모리에 액세스하려고한다는 사실 때문에 발생했다고 생각됩니다. 실제 사용자 정의 HW에는 읽어야하는 SRAM이 여러 개 있지만이 테스트 코드에서 256 바이트 읽기를 읽으려고합니다. 아래 테스트 코드로 인한 세그먼테이션 오류를 어떻게 해결할 수 있습니까? 커널에 드라이버를 추가해야합니까? 가능한 경우 커널을 사용하지 마십시오. 특정 주소 범위를 보호하지 않는 것으로 구성하거나 선언 할 수있는 임베디드 리눅스 방법이 있습니까?세그먼테이션 오류를 복구하는 방법은 무엇입니까?

uint8 * source = (uint8 *)0x04000000; // AEMIF Data (CE1) 
uint32 * pA2CR = (uint32 *)0x01D10014; // AEMIF 2 Config Reg (CS3 space) 
const uint32 READ_SETUP = 1; // Read setup: EMIF clock cycles - 1 
*pA2CR = (READ_SETUP << 13); 
const size_t size = 256; 
var dest = new uint8[size]; 
memset(dest, 0, size); 
memcpy(dest, source, size); 
+2

segfault는 보호 위반이 아니지만 단순히 실제 메모리에 매핑되지 않은 사용자 메모리에 액세스 할 수 있습니다. 단기적인 해결책은 SRAM 대신에 파일을'mmap()'하는 것입니다. 'mmap()'은 사용할 가상 주소를 제공 받거나 가상 주소를 반환합니다. BTW "custom HW"가 있다면, "커널을 망쳐야 만합니다". 또한 http://stackoverflow.com/questions/11500291/access-nor-memory-from-userspace/12138057#12138057 – sawdust

+0

@ 톱밥을 참조하십시오. 사용자 정의 HW는 Leopoardboard와 거의 동일합니다.이 SRAM IF는 유일한 출발 일 수 있습니다 . 커널을 변경해야한다면 그렇게 할 것입니다. – jacknad

+1

Vala 측에서 약간의 메모 만 남았습니다. memset이 필요하지 않습니다 (Vala는 새 버퍼를 0으로 초기화합니다). 또한, 'unowned uint8 [] source = (uint8 []) 0x04000000;'과 같은 일을하는 것이 더 쉬울 것입니다. 그러면 배열 슬라이싱을 사용하여 원하는 데이터를 얻을 수 있습니다 (예 :'var dest = source [ 0 : 256];). Vala에서 원시 포인터를 사용할 필요는 거의 없습니다. 일부 바인딩 (특히 libxml2 및 posix)이 그렇게하도록 유혹 할지라도 말입니다. – nemequ

답변

2

저는 DM386에 익숙하지 않지만 DM6446에서 작업했습니다. DM6446에서는 DM368에서도 같은 것을 기대하지만 실제 주소는 다시 매핑됩니다.

나는 당신의 시나리오를 모르지만 miscdevice를 사용하여 드라이버를 작성하고 사용자 공간 프로그램에 대한 읽기 및 쓰기 작업을 지원할 수 있다고 생각합니다.

내 커널 모듈에서 재 매핑을 수행하고 레지스터에 액세스하려면 IO_ADDRESS 매크로를 사용합니다. 당신에게 예를 제공하기 위해 :

REG_PINMUX0 &= ~(0x01000000); 

같은

#define REG_PINMUX1  (*((volatile unsigned long *) (IO_ADDRESS(PINMUX1)))) 

다음 코드에서 내가 가진 명령을 그래서 난 당신이 잘못된 포인터를 가지고 있기 때문에 당신이 세그먼트 폴트를 받고 있다고 생각. 그리고 커널 모듈없이 사용자 공간 프로그램에서 hw 레지스터에 액세스하려고 시도하는 것은 좋은 전략이 아닙니다.

관련 문제