【问题标题】:Sourcery CodeBench ARM Cortex-M vector table implementationSourcery CodeBench ARM Cortex-M 向量表实现
【发布时间】:2012-03-26 16:50:17
【问题描述】:

我在 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 工具一起使用的启动代码”也没有效果

谢谢。

【问题讨论】:

    标签: arm cortex-m3


    【解决方案1】:

    当涉及嵌入式支持的低级 C 扩展时,您不太可能对两种编译器都采用单一方法。即使是 ARM 的官方 CMSIS 发行版,每个受支持的编译器仍然有单独的启动。

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

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

    【讨论】:

    • 伊戈尔,谢谢。你说的对。最好的解决方案是每个编译器都有一个单独的头文件。我在链接器文件中找到正确的部分名称 - “.cs3.interrupt_vector”,但链接器将我的向量声明放在 SCB 生成之后。
    • 我已经设法获得了一个 C++ 项目,它与 Keil ARM 6.6 和 Cortex M7 的 GCC 6 相同的“vectors.c/h”文件。由于 Keil 编译器(通过 uVision 调用 - 需要专门的 rant-)具有预定义的部分(例如 RESET),我更改了 GCC 链接器脚本以匹配。更难的部分是将堆栈设置为相同。还没有完全解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2015-03-10
    • 2015-04-20
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多