Sourcery CodeBench ARM Cortex-M矢量表实现

时间:2012-03-26 16:50:17

标签: arm cortex-m3

我在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忽略了我的向量表实现并使用自己的(如果我在VT中调用函数哪个地址,我看到SCB虚拟处理程序)。

我如何通过我的重写SCB VT实现? 请不要使用特殊的SC3函数名称(不支持2个IDE)或将向量表移动到另一个内存位置。

__attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void)
来自Luminary Micro的“startup_gcc.c - 用于GNU工具的启动代码”的

也没有效果

谢谢。

1 个答案:

答案 0 :(得分:1)

对于嵌入式支持的低级C扩展,对于两个编译器而言,您不太可能采用单一方法。甚至ARM的官方CMSIS发行版仍然为每个支持的编译器提供单独的启动。

但是,可能比显式表声明更好的功能不包括它。只需声明您想要实现的处理程序; CMSIS初创公司通常将自己的存根标记为WEAK功能,因此您的优先权将被优先考虑。但是,您需要确保使用链接器所期望的处理程序的标准名称(例如Reset_HandlerNMI_HandlerWWDG_IRQHandler等等。有关详细信息,请参阅CMSIS docs和源文件。

注意:要注意的一件事是确保在编译为C ++时添加extern "C"标记 - 否则链接器将无法看到您的处理程序。