2011-05-04 2 views
0

가상 메모리 주소 공간을 초과하는 높은 메모리 (> 0xFFFF0000)에 액세스하는 임베디드 프로젝트의 일부 공급 업체 코드로 XP에서 MinGW GCC 툴체인을 사용하려고합니다. XP에서 '민간인'프로세스에서 허용됩니다.XP에서 MinGW로 메모리 액세스 예외 처리

나는 메모리 접근 예외를 어떤 식 으로든 직접 처리하여 예외 다음의 명령어, 즉 무시할 수 있도록한다. MinGW로 할 수있는 방법이 있습니까? 아니면 MS 툴체인이 있습니까?

광대하게 단순화 된 그림

따라서이다 :

///////////// 
// MyFile.c 
MyFunc(){ 
    VendorFunc_A(); 
} 

///////////////// 
// VendorFile.c 
VendorFunc_A(){ 
    VendorFunc_DoSomeDesirableSideEffect(); 
    VendorFunc_B(); 
    VendorFunc_DoSomeMoreGoodStuff(); 
} 

VendorFunc_B(){ 
    int *pHW_Reg = 0xFFFF0000; 
    *pHW_Reg = 1; // Mem Access EXCEPTION HERE 
    return(0);  // I want to continue here 
} 

더 자세히 : 내가 freeRTOS이 AVR32-GCC 툴체인을 사용과 아트멜 AVR32 플랫폼에 포함 된 프로젝트를 개발하고있다. 하드웨어 (및 느린 avr32 시뮬레이터)와 독립적으로 상위 레벨 애플리케이션 코드를 개발/디버깅하는 것이 바람직합니다. 다양한 gcc, makefile 및 매크로 트릭을 통해 MinGW/Win32 freeRTOS 포트 환경에서 Avr32/freeRTOS 프로젝트를 빌드하고 Eclipse/gdb에서 디버깅 할 수 있습니다. 그러나 (공급 업체가 제공 한) Avr32 코드에서 높은 mem HW 액세스는 Mem 액세스 예외로 인해 MinGW exe를 충돌시킵니다.

1) SW의 액세스 예외 관리 :

나는 이러한 방법의 조합을 고민하고있다. 이상적으로는 일종의 HW 시뮬레이터를 만들 겠지만 어렵고 복잡한 조립 코드가 필요합니다. 예외의 대부분은 무시 될 가능성이 있습니다. HW에 사용자 프로세스 주소 공간으로 # 정의 레지스터 (가상 메모리 공간의 해당 영역 commmit 일부 구조체와 링커 부분)

을 만들 이주하도록 AVR32 헤더 파일의 수정 카피를 작성

2

) 3) "실제"HW 대상 코드의 코드 크래프를 최소화하기 위해 highMem/HW 액세스 또는 alernatively 더 많은 매크로 트릭을 초래하는 함수 호출의 조건부 컴파일. (이 프로젝트에 다른 개발자가 있습니다.)

어떤 제안이나 도움이되는 링크가 제공됩니다.

이 페이지는 올바른 경로에 있지만 지나치게 복잡하게 보이고 C++로 피하고 싶습니다. 하지만 다른 제안이 없다면 아직 시도해 볼 수 있습니다. http://www.programmingunlimited.net/siteexec/content.cgi?page=mingw-seh

답변

1

처음에 주소 0xFFFF0000에 1을 작성하고이 동작을 에뮬레이트하는 사용자 지정 VendorFunc_B() 함수를 작성해야하는 이유를 알아야합니다. 0xFFFF0000은 쓰여질 때 특별한 것을 할 하드웨어 레지스터 일 가능성이 있습니다 (예를 들면 직렬 포트의 보드 율을 변경하거나 레이저를 켜거나 ...). 대상 하드웨어에서이 레지스터에 쓸 때 어떤 일이 발생하는지 알 때 Windows 코드에서 적절한 것을 수행하도록 공급 업체 코드를 다시 작성할 수 있습니다 (예 : 문자열 "Starting Laser"를 로그 파일에 쓰십시오). Windows XP에서 0xFFFF0000 주소로 1을 쓰는 것이 옳은 일이 아니라고 가정하고 Windows XP 메모리 보호 시스템이이를 감지하고 프로그램을 종료한다고 가정하는 것이 안전합니다.