【问题标题】:Function block architecture in a C programC 程序中的功能块架构
【发布时间】:2018-11-30 08:11:30
【问题描述】:

我想创建一个软件,稍后可以在我的微控制器上对某些功能(或块)进行编程,而不必再次刷新整个软件(闪存将由通信接口完成,例如 SPI)。 新块都将具有相同的 API(例如,5 个字节作为参数,1 个字节返回)。

内存架构将如图所示组织:Block architecuture

目前,如果我只在新函数中使用局部变量,我认为没有任何问题,因为变量将被压入堆栈并且不会在 .bss 段中初始化。但是如果我想在我的函数中添加一个静态变量,我会遇到一些麻烦,因为启动代码不会在.bss(或.data)段中初始化这个变量。

我的问题是,该事件是否可以在 C 代码中实现这样的架构?如果是,我该如何调整我的启动代码来初始化我的新变量?你认为 C++ 更适合做这样的事情吗?

非常感谢!

【问题讨论】:

    标签: c architecture block microcontroller iar


    【解决方案1】:

    在 API 中包含一个初始化块的函数。主机必须在块的任何其他函数之前调用此函数。

    另外,请记住,如果您这样做,您还必须为块保留部分 RAM(除了闪存),主机不得触摸。这些变量通常标记为__no_init 或类似的东西,以防止链接器甚至尝试为.data 放置生成初始化数据。

    您使用的语言(C 或 C++)很可能无关紧要。内存放置不是这两种语言的特性,而是通过编译器扩展和链接器特性完成的,它们是特定于工具链的。

    【讨论】:

    • 非常感谢,这解决了我的问题。但现在我面临另一个问题。例如,如果我创建一个块并且我想使用 math.h 中的函数,当我编译时,我看到 math.h 函数被放置在我的应用程序扇区中,但我不想再更改应用程序扇区.有没有办法告诉链接器我的函数的全部内容应该放在我为这个函数分配的内存部分中?
    • @Stabilo 我不太明白你的意思。但既然这是一个新问题,你应该提出全新的问题。
    • 这是新问题 (stackoverflow.com/questions/53559377/…)。我希望它更不稳定:)
    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2021-11-04
    相关资源
    最近更新 更多