0

我正在尝试在 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 代码中的高内存硬件访问会使 MinGW exe 崩溃(由于内存访问异常)。

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

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

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

3) 函数调用的条件编译导致 highMem/HW 访问,或者更多的宏技巧,以最大限度地减少“真实”硬件目标代码中的代码混乱。(这个项目还有其他开发人员。)

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

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

4

2 回答 2

1

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

于 2011-08-07T19:53:23.273 回答
0

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

在使用 MinGW 构建的标准可执行文件中捕获内存访问

首先,您需要找到一种方法将这些地址范围(可能是一些 undef/define 组合)重新映射到一些可用内存。如果你不能这样做,也许你可以通过 seg-fault 挂钩并自己处理写入。

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

于 2019-02-28T12:46:19.760 回答