STM32偷师Linux内核!单片机启动代码竟能这样写?

小麦大叔 2025-05-19 07:50

点击上方,选择“置顶/星标公众号”

福利干货,第一时间送达

大家好,我是麦鸽。

Linux中有很多编程思想可以学习,很多大佬把这些思想、机制运用到单片机的编程上,STM32 模拟Linux kernel自动初始化流程。

通常我们写程序都是按照这个套路,一个函数一个函数按照顺序逻辑一个一个的执行下去。
图片


如果逻辑非常复杂,涉及的模块比较多,那么这种顺序执行的代码就会比较臃肿,各模块耦合非常紧密。Linux kernel 中,有各种外设驱动,想按照一个顺序逻辑执行下去,几乎是不可能的。

而kenrel 代码能有这么大的代码量,大而不乱,把各层次,各模块有效的分离,而大量的代码又有逻辑的组织在一起,和这个initcall 有至关重要的作用。
通过模仿这种方式,最后把图片中main函数代码清空,分离这种逻辑,又实现同样的功能。

如何能实现这样的功能了,需要一些背景知识:

1,程序代码的组织

2,链接脚本相关的知识。

3,函数指针的应用。
图片


代码的组织,如图片需要知道变量a,b及函数指针 f,f2是存放在程序的哪些段中,可以去看一下这篇stm32 启动代码 实现|C语言,上述的a,f都是存放在bss 段中,b,f2是存放在data段中,因为已经给定了初始值,而实现这个intcall会把需要自动初始化的数据放到一个自定义的段中去,如.initcall。

如何放到特定的段中了,就需要用到了attribute((section)) 关键字来改变的数据存放段了。
目前的程序编译出来用到了这些个段,除了.isr_vector也是添加的,其他都是编译器默认的。
图片
先加段代码:
图片


当然这还不够,还需要告诉连接器(LD) 要把 .initcall 段也链接到程序中,所以也需要这段修改。

图片


这段按8字节对齐,定义两个全局变量,及按0-5顺序的链接这些数据,这样的两处修改,再来看一下程序各段的情况。

如图片:
图片


已经多出红色框框为.initcalls段,这段总共是8个字节,从0x80005a8除开始。

在来看一下具体的这一段的情况,用readelf 工具。
图片


和上面的size工具是匹配的,而绿色框框的地址就是SystemInit(0x08000231,小端模式。)

图片


所以通过attribute及修改链接脚本,就把函数指针变量放到了.initcall 段中。

那么如何来调用这个函数了,和之前的初始化data段数据类似,遍历这个段,然后取出这个函数地址,然后强制把段中的地址,转成函数指针,再直接调用即可。
图片


图片


实现的这张图片,就是从.initcall段中取出函数地址,然后直接调用,非常容易把函数的地址及这个函数指针变量的地址搞混。

代码这么修改,需要自动初始化函数的确是可以调到了,但是每次都写这么长长的一段static initcall_t __ attribute__(( __ used__,__ section__(".initcall.0.init"))),就是不舒服. linux kernel中通过宏来修改。
这个也一样。
图片
添加按照程序逻辑顺序执行的一些宏
0,low_level_init 比如放始化系统基本时钟
1,arch_init 比如放CPU架构d如初始化NVIC的一些初始化。
2,dev_init 外设模块初始化,比 i2c, flash, spi等。
3,board_init 做具体硬件板及的一些设置。
4,os_init 操作系统的一些设置如,文件系统,网络协议栈等。
5,app_init 最后跑用户程序。
把自己的程序也做一下修改,用宏代替。这样子掉调用do_initcalls 就会按照0,1-到5的顺序执行了。
图片


图片


最后在来看一下initcall 段:

图片
图片


图片
图片


这样只要在需要自动初始化函数加上类似于dev_init(),app_init() 就可以了,就会自动调用到,而不需要main 函数中一个一个的顺序执行。
比如i2c控制的初始化放到dev_init 中,下面挂了很多i2c的从设备,只要分别给个从设备用app_init 初始化就行,即使来了一个新的,也用这app_init初始化就行,也不需要更改原来的,高度的分离模块间的耦合度。
这样模拟Linux kenerl 初始化验证成功,最后上库。
原文地址: gitee.com/android_life/stm32_freertos_opensource
获取源码,公众号后台回复【initcall 
最后

🫵兄弟们!一个人单打独斗确实能冲得挺快,但要想走得更远、更稳,还得靠一群志同道合的伙伴啊!

👊 麦鸽的知识星球现在已经聚集了一波人,大家都在这里互相学习、共同进步。


如果你也想找个靠谱的学习圈子

赶紧 戳链接 🔗 加入我们吧!


在这里,你能读到星球专栏的干货,优质教程,练手项目,随时向麦鸽提问,还能帮你定制学习计划。别犹豫了,兄弟,一起冲!💪



往期推荐



收到大厂发来的一块神秘板子,直接让我的万用表都慌了!小体积大功率的25A电源模块开箱

嵌入式C语言冷知识!枚举最后的"end"竟是这个作用

血泪警告,嵌入式开发者滥用全局变量的几个"致命陷阱",第3个坑过所有新人!

从编译下载到运行:STM32到底是如何通过程序控制硬件

小麦大叔 一位热衷技术的攻城狮,懂点技术,会讲故事,交个朋友?
评论
  • 夸克发布首个高考志愿大模型,为考生提供了智能化、个性化的志愿填报服务,这一创新对考生群体和传统报考机构产生了截然不同的影响。对于考生而言,夸克高考志愿大模型无疑是一大利好。该模型整合了教育官网、省招生办官网等权威信息源,确保数据准确可信,同时将高校毕业生就业信息、产业趋势等纳入知识库,为考生提供更全面的参考。通过深度搜索、志愿工具和志愿报告三大服务,夸克能精准理解考生需求,提供从专业适配性、地域优势到就业前景的全方位分析,并生成专属志愿报告和多种填报策略。这种智能化、个性化的服务大大减轻了考生和
    curton 2025-06-12 17:24 6451浏览
  • FPU 是“Floating Point Unit”的缩写,中文意思是“浮点运算单元”。它是一种专门用于处理浮点数运算的硬件组件,通常集成在计算机的处理器(CPU)中,也可以是一个独立的芯片。以下是关于 FPU 的一些详细信息:  1. 功能    浮点数运算 :FPU 主要用于执行浮点数的加、减、乘、除等基本运算,以及更复杂的数学运算,如平方根、对数、三角函数等。    提高计算效率 :与整数运算相比,浮点运算在处理小数和高精度计算时更加高效。
    丙丁先生 2025-06-13 09:33 39浏览
  • 随着游戏和影音需求的快速增长,市场上越来越多屏幕主打「高刷新率」,号称能为用户带来更流畅的视觉体验。不论是追求实时反应的游戏玩家,还是偏好画面清晰稳定的影视爱好者,高刷新率屏幕都成为热门的选择。然而,流畅的画面不只取决于刷新率,常被忽略的掉帧(Frame Drop)也是影响用户体验的关键因素。若PC系统无法稳定输出对应的FPS(每秒帧数),即使具备高刷新率,画面仍然会因掉帧而导致卡顿、撕裂、延迟等问题,让用户感受大打折扣。掉帧问题影响到游戏流畅示意图本次案例是笔电厂商,近期推出的一款支持高刷新率
    百佳泰测试实验室 2025-06-12 18:02 43浏览
  • 贞光科技作为业内知名的车规及工业元器件供应商,现已成为紫光国芯存储芯片的授权代理商。在半导体存储芯片国产化的关键时期,这一合作为推动DRAM等关键器件的国产替代开辟了新的渠道。紫光国芯在存储芯片领域的技术积累,加上贞光科技在车规和工业应用方面的专业优势,正在为客户提供更可靠的国产化解决方案。产品技术实力:从DDR到LPDDR的全面布局紫光国芯在存储芯片方面的技术积累确实令人印象深刻。该公司的DRAM产品覆盖标准SDR、DDR、DDR2、DDR3、DDR4和移动用LPDDR、LPDDR2、LPDD
    贞光科技 2025-06-13 16:01 44浏览
  • 本文教你从开发到部署,用 Docker 将 Python Flask 应用容器化,引入反向代理 Nginx,实现 HTTPS 支持、环境隔离与持续部署准备,是现代开发者必备的实战技能。https://txc.qq.com/products/732159/blog/1106857 https://txc.qq.com/products/732159/blog/1106856 https://txc.qq.com/products/732160/blog/1106855 https://txc
    小菜菜编程 2025-06-12 16:36 169浏览
  • 在金融 AI 赛道一路疾驰的百融云创,向来是资本市场的焦点。2021年上市以来,其营收曾一路高歌猛进,从2021年的16.23亿元,到2022年的20.54亿元,再到2023年的26.81亿元,增长率颇为亮眼。净利润也随之水涨船高,分别为1.41亿元同比增长76%、2.94亿元同比增幅108%、3.4亿元同比增长42%。不曾想,2024年风云突变,百融云创虽营收达29.29亿元,仍有 9% 的增长,但净利润却骤降至2.66亿元,同比下滑21.82%,上市以
    用户1742991715177 2025-06-15 21:36 426浏览
  • 0.6"HDMI单目方案 在 AR 产业浪潮席卷全球的当下,Micro OLED 凭借高分辨率、低延迟等特性成为显示技术新宠。从消费级智能设备到专业级行业应用,Micro OLED 商业化进程也在全速推进。面对瞬息万变的市场环境,终端应用厂商亟需高效解决方案加速产品验证与落地。冠显光电最新推出的0.6"HDMI单目驱动板方案,以小型化设计和灵活开发能力,助力企业抢占市场先机。方案组成 该方案主要包括0.6”硅基显示屏,HDMI单目显示屏驱动板。驱动板以 Micro HDMI
    冠显光电MicroOLED代理视涯 2025-06-13 13:54 351浏览
  • 全球第一大PC厂商联想Lenovo,近期发布Lenovo Air X AI元启版,Lenovo YOGA 360 14 Aura Al元启翻转轻薄本、Lenovo YOGA 360 14 AI元启版、Lenovo YOGA Air 15 Aura Al元启版等多款笔记本电脑,均INBOX标配65W 49cc氮化镓快充充电器,这是迄今为止联想笔记本电脑最小体积的65W INBOX电源适配器。据悉,该款产品得益于镓未来G1N65R150PB-N GaN方案以及平面变压器模块的加持,设计得相当小巧,尺
    电子热文焦点 2025-06-13 14:17 55浏览
  • 随着数据中心对于网络带宽和延迟的要求日益增长,传统的TCP/IP网络已无法满足性能要求,RDMA网络则凭借其高带宽、低延时的特性脱颖而出。相较于传统TCP/IP协议,RDMA具有零拷贝、不需要CPU接入、消息基于事务等特点 。RDMA协议与传统TCP/IP协议在通信过程中的区别如图1所示。图1TCP/IP协议与RDMA协议区别图在图1中,左侧部分为传统TCP/IP协议的通信过程,当需要发送数据包时,应用程序将要传输的数据拷贝到TCP/IP协议栈的BUFFER中,TCP/IP协议栈组包后,再经由驱
    zzbwx_326664406 2025-06-14 23:28 61浏览
  • 《从磁能管理到开关电源设计》+认识电感 很幸运能获得这次《从磁能管理到开关电源设计》试读机会。让我能通过这本书更全面的了解电感,了解电感的生产,应用。更全面的了解电感。是的,电感,电阻,电容在电路应用中是基本的三大被动器件。在各领域都有所应用。 电感在开关电路中应用较为常见,是不可或缺的器件,他把电路中的电能转化为磁能阻碍电流的变化。电感的单位是H,它不同于磁珠。磁珠是应用在高频电路中,高频下成电阻产生热降低EMI.而电感式工作在低频中。在电源输入有差分电感,共模电感,等等不同种类。对EMI有各
    zhusx123 2025-06-14 20:29 383浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦