【发布时间】:2017-02-24 16:59:22
【问题描述】:
我在 STM32F0 (ARM Cortex-M0) 上运行代码。我定义了一个指向nested function的函数指针:
void My_Async_Func(void *handle, void (*complete)(bool success)) {
/*
* \/ A nested function \/
*/
void receiveHandler(void) {
// This function lies at an even-numbered address
}
/* ... */
uart->rxDoneHandler = &receiveHandler;
Go(uart);
}
嵌套函数似乎搞砸了。稍后当我调用 rxDoneHandler 指针时,它会尝试分支到 0x8c0c6c0c 并且我得到一个 UsageFault。根据ARM docs,这是因为我在仅支持 Thumb 指令集的处理器上跳转到 偶数 地址,这需要您只跳转到 odd-编号的地址。
我正在使用 GCC arm-none-eabi 4.9.3。我的 CFLAGS 是:
arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -O0 -g3 -Wall -fmessage-length=0 -ffunction-sections -c -MMD -MP
我尝试过的事情
我尝试按照here 的建议使用-mthumb-interwork 调用gcc。结果一样。
我尝试使用类似
的属性手动设置函数的对齐方式__attribute__((aligned(16))) void receiveHandler(void) {
}
同样的结果。
当我调用它时,我尝试手动将 1 添加到指针
(uart->rxDoneHandler + 1)();
同样的结果。
是我做错了什么,还是编译器中的错误?
【问题讨论】:
标签: pointers gcc arm cortex-m thumb