首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sourcery CodeBench ARM Cortex-M向量表实现

Sourcery CodeBench ARM Cortex-M向量表实现
EN

Stack Overflow用户
提问于 2012-03-27 00:50:17
回答 1查看 906关注 0票数 0

我在SCB论坛上问了这个问题,但没有得到回答。我正在尝试将一些项目从uVision ide移植到SCB。问题始于向量表的实现。例如,我有简单的C++代码

代码语言:javascript
复制
#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函数名(支持两个集成开发环境是不好的)或将向量表移动到另一个内存位置。

代码语言:javascript
复制
__attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void)

来自Luminary Micro的"startup_gcc.c - Startup code for use with GNU tools“也没有效果

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-27 01:16:24

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9876285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档