news 2026/7/28 23:18:58

[学习资料] 软件框架设计好了,代码跨平台移植不再是噩梦

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[学习资料] 软件框架设计好了,代码跨平台移植不再是噩梦

做嵌入式产品的软件开发时,我们会经常遇到因为成本、交期或芯片资源紧张等原因更换MCU平台的情况,加上不同MCU厂商在芯片外设、寄存器和库函数接口等方面的命名规则和名称又不一样,这个时候就肯定会涉及到代码跨平台移植操作。其实,代码移植是一个比较耗费精力和磨性子的过程,可能会让人“发狂”;这个时候,如果你的代码框架在起初设计时就考虑了后续可能会出现的代码跨平台移植这个可能性,那你的代码移植工作量就会大大减少了。

那什么样的软件框架有利于代码移植呢?下面给出一个比较适用于刚出校门入职场的软件同仁们的参考框架,我们一起来看看吧!
代码一定要分层设计,切忌把全部文件放在同一个文件夹下面,最简单的就是区分一下代码层次:
应用层:主要实现业务逻辑,不涉及与MCU平台相关的操作;
MCU驱动层:可以称为BSP(板级支持包)层,主要实现MCU外设驱动代码;
外置芯片驱动层:主要实现与MCU通过总线等方式进行通信的芯片驱动代码;
固件库层:MCU芯片的固件库源文件;
协议层:如果有标准协议,可以单独建个文件夹存放。
根据以上描述,基本上可以按如下拓扑进行设计:

app文件夹下面以模块化的方式实现需要的应用功能,一个功能/模块对应一个源文件+一个头文件,可以用app_功能名称命名源文件和头文件:

main.c文件可以直接放到app文件夹下面。
bsp文件夹下面以区分外设的方式实现需要的芯片驱动,可以用bsp_外设名称命名源文件和头文件:

并且尽量用宏定义方式在头文件里申明GPIO和引脚配置信息,类似下面代码:

MCU芯片处理中断向量表的源文件也可以放到bsp文件夹下面。
driver文件夹下面以区分外置芯片的方式实现需要的芯片驱动,可以用芯片名称来命名源文件和头文件:

并且尽量用宏定义方式在头文件里申明与MCU平台相关的信息,包括GPIO和库函数操作等,后续移植时仅需要修改头文件即可,类似下面操作:


宏定义的越详细越具体,代码移植修改时会越简单越方便。
libraries文件夹下面存放固件库文件:

另外,在设计工程时,可以新建两个文件夹,把固件库文件区分开(外设文件+启动文件):


ethercat文件夹存放协议文件,直接用协议名称命名该文件夹即可,比如wifi、tcp_ip等:

通过以上的分层和解耦设计,在执行代码移植时,你只需要以下的几个操作步骤即可完成大部分的代码移植:
1、直接把固件库全部替换;
2、修改bsp相关文件,这块的工作量相对来说是最大的
3、修改driver里面的驱动头文件,其源文件不需要任何修改;
4、修改工程配置里的库文件包含信息。
通过以上的几个移植修改步骤,基本上就完成了代码跨平台移植,编译后可能还会出现个别报错,再修改修改就可以了,毕竟代码移植的第一步就是要让你的代码编译通过,然后再慢慢调试功能即可。
当然软件框架的设计还可以继续深入,比如把MCU底层配置抽象出来并形成一个独立的文件,这样外置芯片驱动的头文件可能都不需要修改了,而只需要修改MCU底层配置文件即可;或者把包括排序算法、滤波算法等通用的算法以API接口的方式封装起来并放到一个源文件里等等。
比如封装GPIO名称:
目前是在驱动代码头文件里按如下方式申明:
复制
  1. #define IS3980S_GPIO GPIOB
可以把GPIOB封装到单独的通用头文件(commonHeader.h)里,并按如下方式命名:
复制
  1. #define IS3980S_MCU_GPIO GPIOB
而驱动头文件里修改如下:
复制
  1. #define IS3980S_GPIO IS3980S_MCU_GPIO
如此操作后,代码移植时,只需要修改commonHeader.h文件即可。
其他宏定义的封装操作类似。
以上是作者针对如何降低代码跨平台移植的工作量的实操经验和拙见,希望对你有用!


---------------------
作者:dffzh
链接:https://bbs.21ic.com/icview-3457334-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 23:08:27

one-hot编码

我来详细介绍一下 one-hot 编码(独热编码)。什么是 One-Hot 编码?One-Hot 编码是一种将分类变量转换为二进制向量的技术,其中每个类别都表示为一个二进制向量,只有一个元素为1("热")&…

作者头像 李华
网站建设 2026/7/27 1:18:02

Agilent安捷伦8564EC-40g频谱分析仪

射频江湖的“老炮儿”:安捷伦8564EC,为何至今仍是传奇?156/2558//3328在射频工程师的实验室里,如果看到一个笨重但依然锃亮的“大铁盒子”,前面板布满实体按键和旋钮,屏幕或许有些发黄,但显示的…

作者头像 李华
网站建设 2026/7/28 10:48:57

提示工程架构师必读:Agentic AI技术生态标准化与开源社区发展报告

提示工程架构师必读:Agentic AI技术生态标准化与开源社区发展报告 引言:Agentic AI的“野蛮生长”与架构师的痛点 1. 从“工具化AI”到“Agentic AI”:一场范式革命 2023年以来,Agentic AI(智能体AI)成为AI领域最热门的方向之一。与传统“被动执行指令”的AI(如ChatG…

作者头像 李华
网站建设 2026/7/29 0:06:49

Pascal VOC数据集划分的致命陷阱与最佳实践:为什么99%的开发者都该以JPEGImages图片文件夹为基准,而不是Annotations XML?

划分基准推荐度优点缺点/风险适用场景JPEGImages(图片)★★★★★源头操作,保证每张有效样本必有图;通过相同 ID 加载标注天然同步;无图无标注可立即发现并清理;主流框架均以图片列表为准需额外检查标注文件…

作者头像 李华
网站建设 2026/7/28 19:58:29

Bugku--花点流量听听歌、图穷匕见、隐写2、look、、铁子,来一道

花点流量听听歌 打开是一个MP3音频文件,放入随波逐流里面发现flag.rar里面有flag.txt 用binwalk提取一下 解压发现flag.rar需要密码,随波逐流里面rar爆破 打开里面的flag.txt里面bugku{What_a_enjoyable_music} 图穷匕见 打开是一张jpg图片 先用01…

作者头像 李华