2011-03-01 2 views
0

이것은 내 첫 번째 질문입니다 :).vxWorks 6.8에서 가상 메모리로 실제 매핑

지금 성공하지 Vx 웍스 6.8에서 가상 메모리를 실제 메모리를 매핑하는 동안 위해 노력

이 내가 "vmMap"기능을 사용하기 위해 노력하고있어하지만 어떻게 든 돌아 유지와 :

의 errno = 0x30065 S_taskLib_NAME_NOT_FOUND .

내 코드는 다음과 같습니다

int page_size=0; 
PHYS_ADDR GPIO_BASE_VIRTUAL_ADDR = 0x40E00000; 
VIRT_ADDR VIRTUAL_ADDR=0; 

page_size =vmPageSizeGet(); 
if((VIRTUAL_ADDR = (VIRT_ADDR)memalign(page_size,page_size*2))==NULL)// allocate 2 pages 
{ 
    printf("error in memalign() errno = 0x%x\n",errnoGet()); 
} 

if(vmMap(NULL,VIRTUAL_ADDR,GPIO_BASE_VIRTUAL_ADDR,(page_size*2))== ERROR) 
{ 
    printf("Error mapping memory errno = 0x%x%\n",errnoGet()); 
} 

어떤 도움은 매우, 감사

모세 감사 할 것이다.

+0

아직 알아 냈습니까? 일부 vxWorks 함수는 실패 할 때 errno를 설정하지 않으므로 errno가 실제로 vmMap에 있는지 확인하기 전에 함수를 호출하기 전에 0으로 설정할 수 있습니다. –

+0

안녕, 그래 나는 BSP \t {/ * MAP GPIO */ 에서의 sysLib.c 파일 (.... 0x160 ... 그리고 0x40E) 같은 방식으로 모두 주소를, 그것을 해결 \t (VIRT_ADDR) 0x40E00000/* 가상 어드레스 */ \t (PHYS_ADDR) 0x40E00000/물리 어드레스 * */ \t가 0x1000, \t \t \t \t \t \t/* 길이 후 초기 상태 */ \t VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE, \t VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT \t}, 필요한 "할당 크기"와 및 가상하고, 이 필요한 오프셋 (offset) 인 것처럼 "평면"으로 요청 된 주소로 포인터를 사용했다. –

답변

0

나는 이미 오래 전에이 문제를 해결하지만, 다른 누구든 희미한 & 먼 미래에이 방법을 비틀 수있는 내가 어떤 빵 부스러기를 떠날 줄 알았는데 볼 ..

당신이 rtPS 서비스를 수행하지 않는 한 좋은있다 MMU가 주소를 번역하지 않을 가능성이 있습니다. 즉, 실제 주소 공간에 0x7fc00400이 표시되면 해당 값을 포인터로 캐스팅하여 사용할 수 있습니다.

*((short *) 0x7fc00400) = foo; // write 16 bits! 

그리고 네, 제안 거의 신성 모독 요즘 (AB) 이런 식으로 포인터를 사용하지만, 난 당신이 Vx 웍스 커널 공간 코드를하고 있다면, 당신은 베어 메탈에 실질적으로 걸 지적 할 것 어쨌든, 왜 안돼?

관련 문제