arm-none-eabi-gcc 工具链自带的 libstdc++ 库会将 throw 的异常对象创建在堆上
本文展示了通过重载new运算符和重写malloc函数,将STM32H743的堆内存分配到FMC的SDRAM区域(0xC0000000起始的256MiB空间)。通过异常处理测试,捕获异常对象地址0xC000D560并转换为16进制字符串输出,证实异常对象确实被创建在指定的堆内存区域。实验结果表明内存重定向方案成功实现,为嵌入式系统内存管理提供了参考方案。
·
我通过重载全局的 new 运算符和重写 malloc 函数,将堆放在 stm32h743 的 FMC 的 SDRAM 区域,即 0xC0000000 起始的 256MiB 大小的区域。
通过下面的测试代码抛出异常,捕获到异常后,取得异常对象的地址,然后转为 16 进制字符串打印出来。一同打印的还有代码位置信息。
try
{
throw std::runtime_error{"测试异常"};
}
catch (std::exception const &e)
{
base::console().WriteLine(CODE_POS_STR + base::ToHexString(&e));
}

输出如下
打印出来的地址是 0xc000d560 。这说明异常对象被创建在堆上了。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)