Exception handling 在XP上使用MinGW处理内存访问异常

Exception handling 在XP上使用MinGW处理内存访问异常,exception-handling,windows-xp,mingw,avr-gcc,freertos,Exception Handling,Windows Xp,Mingw,Avr Gcc,Freertos,我试图在XP上使用MinGW GCC工具链,其中包含一些来自嵌入式项目的供应商代码,该项目访问高内存(>0xFFFF0000),我认为这超出了XP中“民用”进程允许的虚拟mem地址空间 我希望自己以某种方式处理内存访问异常,以允许在异常后的指令处继续执行,即忽略它。有没有办法和MinGW一起做?还是使用MS toolchain 因此,大大简化的图片是: ///////////// // MyFile.c MyFunc(){ VendorFunc_A(); } /////////////

我试图在XP上使用MinGW GCC工具链,其中包含一些来自嵌入式项目的供应商代码,该项目访问高内存(>0xFFFF0000),我认为这超出了XP中“民用”进程允许的虚拟mem地址空间

我希望自己以某种方式处理内存访问异常,以允许在异常后的指令处继续执行,即忽略它。有没有办法和MinGW一起做?还是使用MS toolchain

因此,大大简化的图片是:

/////////////
// 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工具链在Atmel AVR32平台上与freeRTOS一起开发一个嵌入式项目。开发/调试独立于硬件(和慢速avr32模拟器)的高级应用程序代码是可取的。各种gcc、makefile和宏技巧允许我在MinGW/Win32 freeRTOS端口环境中构建Avr32/freeRTOS项目,并且我可以在eclipse/gdb中进行调试。但是(供应商提供的)Avr32代码中的高mem HW访问导致MinGW exe崩溃(由于mem访问异常)

我正在考虑将这些方法结合起来:

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

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

3) 函数调用的有条件编译会导致highMem/HW访问,或更多的宏技巧,从而最小化“真实”HW目标代码中的代码错误。(本项目还有其他开发商。)

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

这个页面是正确的,但是看起来过于复杂,C++是我想避免的。但如果没有其他建议,我可能会尝试一下。


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

我最近遇到了类似的问题,这是我解决的解决方案:

首先,您需要找到一种方法将这些地址范围(可能是一些未定义/定义的组合)重新映射到一些可用内存。如果你不能做到这一点,也许你可以钩住一个seg错误,自己处理写操作

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