我在SCB论坛上问了这个问题,但没有得到回答。我正在尝试将一些项目从uVision ide移植到SCB。问题始于向量表的实现。例如,我有简单的C++代码
#define STACK_TOP 0x20000800
typedef void (*handler_ptr)();
void ResetHandler() { while (1); }
void NMIHandler() { while (1); }
void HardFaultHandler() { while (1); }
__attribute__ ((section("vectors"))) handler_ptr const vector_table[] = {
(handler_ptr) STACK_TOP,
ResetHandler,
NMIHandler,
HardFaultHandler,
};此代码无法编译,因为SCB库查找"int main(void)“声明。好的,我可以添加这个函数,但是SCB会忽略我的向量表实现并使用own (如果我调用VT中地址的函数,我会看到SCB虚拟处理程序)。
如何通过我的方式重写SCB VT实现?请不要使用特殊的SC3函数名(支持两个集成开发环境是不好的)或将向量表移动到另一个内存位置。
__attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void)来自Luminary Micro的"startup_gcc.c - Startup code for use with GNU tools“也没有效果
谢谢。
发布于 2012-03-27 01:16:24
当涉及到用于嵌入式支持的低级C扩展时,您不太可能为两个编译器提供单一的方法。即使是ARM的官方CMSIS发行版,对于每个支持的编译器仍然有单独的启动。
然而,可能比显式的表声明更好的是不包含它。只需声明您确实想要实现的处理程序;CMSIS初创公司通常将自己的存根标记为弱功能,因此您的将优先考虑。但是,您需要确保使用链接器期望的处理程序的标准名称(例如Reset_Handler、NMI_Handler、WWDG_IRQHandler等)。有关更多信息,请参阅CMSIS docs和源文件。
注意:要注意的一件事是,如果您正在编译为C++,请确保添加extern "C"标记-否则链接器将看不到您的处理程序。
https://stackoverflow.com/questions/9876285
复制相似问题