1

我正在开发 MCU(STM32F4)。在当前系统中,所有的中断处理程序都在链接文件中声明为弱符号,如果我们想使用一个,我们只需在 C 中声明一个同名的函数,并在链接时替换弱符号。

我正在尝试将我的系统转换为 C++,我设想一个系统,其中实例化某种中断类型将在模块中声明相应的 C 函数。

考虑到成员函数禁止使用 extern "C",我不知道如何实现这一点。

任何想法或替代方案?我的目标是尝试静态检查一些东西并尝试在该领域使用一些现代 C++。

这是C中的当前情况。我有一个包含这个东西的程序集文件:

g_pfnVectors:
.word  _estack
.word  Reset_Handler
(...)
.word  SysTick_Handler
(...)
/*******************************************************************************
*
* Provide weak aliases for each Exception handler to the Default_Handler. 
* As they are weak aliases, any function with the same name will override 
* this definition.
* 
*******************************************************************************/
(...)
.weak      SysTick_Handler
.thumb_set SysTick_Handler,Default_Handler   

在我的 C 代码中,我有:

main() {
    (...)
    SysTick_Config(SystemCoreClock / cncMemory.parameters.clockFrequency);

    while (1);
}
void SysTick_Handler(void) {
    cncMemory.tick++;
}

我设想这样的事情:

int main() {
    MCU<mySystickHandler, ...> mcu;
    mcu.start();
}

static void mySystickHandler(void) {
    cncMemory.tick++;
}

或接近的东西(可能没有仍然全局功能,但我尝试将问题分开)。

4

1 回答 1

1

我对此一无所知。

如果您想留在该语言中,您将不得不查看扩展,因为编译器已经提供了编译指示和属性来控制这些事情很长一段时间。在 gcc 的情况下,asm 标签似乎是为这个问题设计的。我没有使用过它,而且我先验地认为它不能与模板一起使用,除非是明确的专业化。

另一种选择显然是使用链接器级别的技巧。

  • 如果弱符号是对象提供的唯一符号,则AFAIK不会使对象文件提供从静态库中提取的对象文件。您可以安排从 C 提供给您的模板的目标文件还提供您想要的实例化所需的另一个唯一符号。

  • 链接器脚本有很大的力量,如果自从我上次处理嵌入式系统以来事情没有太大变化(那是很久以前他们必须改变,我只是不知道他们是否在这方面发生了变化)自定义链接器脚本在该领域仍然是非常强制性的。

于 2013-10-06T11:55:54.033 回答