在XP上使用MinGW进行内存访问异常处理

时间:2011-05-04 07:13:14

标签: exception-handling windows-xp mingw avr-gcc freertos

我正在尝试在XP上使用MinGW GCC工具链,其中一些供应商代码来自访问高内存(> 0xFFFF0000)的嵌入式项目,我相信这超出了“民用”流程中允许的虚拟内存空间XP

我想以某种方式处理内存访问异常,这将允许执行在异常后的指令处继续,即忽略它。有没有办法用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
}

更多细节: 我正在使用AVR32-gcc工具链使用freeRTOS在Atmel AVR32平台上开发嵌入式项目。希望独立于硬件(和慢速avr32模拟器)开发/调试高级应用程序代码。各种gcc,makefile和宏技巧允许我在MinGW / Win32 freeRTOS端口环境中构建我的Avr32 / freeRTOS项目,我可以在eclipse / gdb中调试。但是(供应商提供的)Avr32代码中的高内存HW访问会导致MinGW exe崩溃(由于mem访问异常)。

我正在考虑这些方法的一些组合:

1)管理SW中的访问异常。理想情况下,我会创建一种硬件模拟器,但我认为这很难并涉及一些粗糙的汇编代码。很多例外都可能被忽略。

2)创建Avr32头文件的修改副本,以便将HW寄存器#defines重新定位到用户进程地址空间(并创建一些提交虚拟内存空间区域的结构和链接器部分)

3)有条件地编译导致highMem / HW访问的函数调用,或者更多宏观技巧,以便最小化“真实”HW目标代码中的代码残缺。 (该项目还有其他开发人员。)

任何建议或有用的链接都将不胜感激。

这个页面是正确的,但似乎过于复杂,而且我想避免使用C ++。但我可能会尝试,但没有其他建议。 http://www.programmingunlimited.net/siteexec/content.cgi?page=mingw-seh

2 个答案:

答案 0 :(得分:1)

您需要弄清楚为什么供应商代码首先要写1到地址0xFFFF0000,然后编写一个模拟此行为的自定义VendorFunc_B()函数。 0xFFFF0000很可能是硬件寄存器,在写入时会做一些特殊的事情(例如,改变串口上的波特率或启动激光器或......)。当您知道在目标硬件上写入此寄存器时会发生什么情况时,您可以重写供应商代码以在Windows代码中执行适当的操作(例如,将字符串“Starting laser”写入日志文件)。可以安全地假设在Windows XP上将1写入地址0xFFFF0000是不正确的,Windows XP内存保护系统会检测到并终止您的程序。

答案 1 :(得分:0)

我最近有一个类似的问题,这是我确定的解决方案:

Trap memory accesses inside a standard executable built with MinGW

首先,您需要找到一种将那些地址范围(可能是一些undef / define组合)重新映射到某些可用内存的方法。如果您不能执行此操作,也许您可​​以通过段错误进行处理并自己处理写操作。

对于某些已经编写的代码,我还使用它来“模拟”单个可执行文件中的某些特定硬件行为。但是,就我而言,我找到了一种尽早重新定义所有寄存器访问宏的方法。