打印
[其他ST产品]

基于GCC编译器的initcall在STM32如何实现?

[复制链接]
853|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2024-10-21 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于GCC编译器的initcall在STM32如何实现?

使用特权

评论回复
沙发
公羊子丹| | 2025-1-25 09:36 | 只看该作者
如果想在STM32中实现initcall机制,可以借助GCC的section属性,把函数放在特定的段中,然后在启动代码里统一调用这些函数。

使用特权

评论回复
板凳
周半梅| | 2025-1-25 09:38 | 只看该作者
我在STM32上试过类似的实现,用__attribute__((section(".initcall")))把函数标记到指定段中,然后编译生成的链接文件会按照段顺序执行。

使用特权

评论回复
地板
帛灿灿| | 2025-1-25 09:39 | 只看该作者
实现initcall的核心就是定义一段特殊的内存段,并让函数集中放进去,你可以在链接脚本里自定义.initcall段,然后用ld文件管理它的起止位置。

使用特权

评论回复
5
童雨竹| | 2025-1-25 09:40 | 只看该作者
如果是GCC的话,可以通过__start_和__stop_符号来定位initcall段的起止地址,启动代码里循环调用这些地址之间的函数。

使用特权

评论回复
6
万图| | 2025-1-25 09:41 | 只看该作者
STM32上可以通过修改链接脚本,添加类似.init_array的段,和PC上实现C++构造函数初始化的方式有些类似,核心就是利用段表。

使用特权

评论回复
7
Wordsworth| | 2025-1-25 09:43 | 只看该作者
你也可以参考Linux内核的initcall机制,虽然复杂,但思路一致。用段属性加上排序规则,让initcall按照优先级执行。

使用特权

评论回复
8
Bblythe| | 2025-1-25 09:44 | 只看该作者
STM32使用GCC实现initcall还需要注意内存的对齐问题,尤其是在ARM架构下,确保initcall函数的地址对齐是很关键的。

使用特权

评论回复
9
Pulitzer| | 2025-1-25 09:45 | 只看该作者
如果是裸机环境,推荐在Reset_Handler里手动调用initcall段的函数;如果用了RTOS,可以把这些函数的调用放在任务初始化流程中。

使用特权

评论回复
10
Uriah| | 2025-1-25 09:46 | 只看该作者
我实现initcall时,遇到的一个坑是链接脚本里段的定义范围不对,导致标记的函数没被执行,你可以检查一下编译后的map文件确认段是否生效。

使用特权

评论回复
11
Clyde011| | 2025-1-25 09:47 | 只看该作者
需要注意的是,initcall段的使用虽然灵活,但过多的初始化逻辑可能会拖慢系统启动时间,建议在实际项目中根据需求调整优先级。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2113

主题

8015

帖子

11

粉丝