当前位置: 首页 > news >正文

嵌入式里的“移植”概念

这里因为最近一年看到公司某项目很多代码上有直接硬件的操作,这里有感而发,介绍移植的概念。

一、硬件

先上一个图:

f1f6cafe96f18599dac3273b1082a786.png

举个例子,大学里应该都买过开发板,例如st的,这里三个层次,

内核:例如上图 cortex-M3,这个由ARM公司设计的。

soc:例如上图的stm32f103zet6,arm公司将其授权给芯片厂商 ST,ST在其外围加入一些必要的硬件单元,如时钟,中断控制器之类。例如ST卖的soc里内核为cortex-M3里还有其他型号。

board: 图中的board,板级,理解为板子吧,st自己也会画板子验证芯片,然后作为demo板给其他买st的芯片的设备厂商做参考,例如公司跟某家芯片的代理商购买芯片同时也会买官方的demo板会来参考设计硬件。再例如原子卖的什么阿波罗,野火卖的什么指南者霸道者之类,都理解为板级。

二、软件

到这里有个概念了,内核和soc相关的软件代码由半导体厂商提供,例如你买原子的资料都会提供一份原厂的sdk,而sdk里的demo由的则是基于他们的板子编写一些参考代码,可以直接在上面跑起来。

由于st的demo板硬件和原子他们之间有区别,所以会根据实际做修改,扩展,例如我们做产品的时候为了在我们板子跑起来也会做一些修改,都是属于板级的代码。所以一些移植工作其实就是根据实际的硬件,对半导体厂商提供的参考软件做修改。

2.1、操作系统

例如移植一些系统的时候,都是拿半导体商官方移植好的来修改,也就是上面的一套:内核+soc+board,主要是内核和soc这部分,因为最熟悉的还是半导体厂商他们自己的软件工程师,就算soc没有找到相同型号的代码也要找内核为一样的,这样能大大减少工作量。

工作中常见的如系统移植,像Rtos,以上面图片里的stm32f103无论哪家教程他们也是找官方移植好的下载下来参考,这里其实主要还是板级的移植,根据硬件的区别做修改,soc和内核那部分的适配原厂已经做好了,工作量不大,因为本来就是能跑起来的。

假如没有,例如你要用rt-thread,但是官方没有rt-thread的移植,这时候你就可以看看官方有没有移植好其他系统的代码,例如有freertos。那你的移植就得了解freertos和rt-thread代码,对比去做移植,将soc,内核相关的代码参考freertos做适配(例如freertos这部主要是在port那部分)。这里的工作量就是你对原厂做好的那份能跑freertos的了解和对rt-thread的了解。

这个思路放在其他系统也是一样的,例如linux的移植,像野火和原子的imx6ull教程也是参考官方的代码做板级上的区别做修改,野火的板子烧录nxp官方移植好的uboot、linux内核、文件系统是可直接跑起来的,然后根据实际硬件的区别做一些修改,后面工作量就是根据具体瑕疵问题做修改,所以这里linux的移植的工作量,还是对 uboot、linux内核的代码和使用有一定了解,出了问题可以定位需要修改的地方。linux里对板级的适配提供了一套组件,加载内核的时候同时也要加载设备树文件,就是说把板级的差异提取成以配置文件的形式,可以更加方便板级这部分的修改。

2.2 其他纯软件组件

纯软件的就不多说,根据实际的组件需要的接口做适配即可,例如算法。但是还是需要对你用的组件代码有一定了解,例如用的组件他是基于32位系统的,但是你现在跑的soc是8位的;或者说你用的这份软件用到了浮点数操作,但是用的soc却不支持浮点数的使用。笔者曾经用过汇顶的脉率模块,就平时手环经常看到的功能,当时工作量是:汇顶提供的软件库文件,然后我这在我们的代码上提供控制这个模块用的i2c接口就跑起来了。

类似的例如GUI,工作量还是适配一些需要的软件接口如堆管理接口,刷屏接口,如果还用到了触摸,则提供触摸状态、坐标读取接口。

三、得到的启发

到这里可以明白为什么强调软件要分层了吧?分层做的合适,代码就是可移植的,只要适配好下层接口,把硬件相关,平台相关的代码都抽出来,必要的时候加一些配置项,那代码就是可移植的,做类似的新项目,或者项目换方案的时候,可以快速的验证。

http://www.lryc.cn/news/500035.html

相关文章:

  • 深入探讨 AF_PACKET 套接字
  • Redis的哨兵机制
  • CSS系列(1)-- 选择器体系详解
  • 用Python开发打字速度测试小游戏
  • 基于gitlab API刷新MR的commit的指定status
  • 服务器数据恢复—LINUX下各文件系统删除/格式化的数据恢复可行性分析
  • Spark on Yarn安装配置,大数据技能竞赛(容器环境)
  • 遣其欲,而心自静 -- 33DAI
  • No.25 笔记 | 信息收集与Google语法的实践应用
  • GitLab基础环境部署:Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册
  • SpringBoot3配置文件
  • 【机器学习】任务十二:循环神经网络
  • 【返璞归真】-切比雪夫不等式(Chebyshev‘s Inequality)
  • 【Django】在view中调用channel来主动进行websocket通信
  • 18.[极客大挑战 2019]BabySQL1
  • Python快速入门二:Python3 基础语法
  • 1-1 C语言链表
  • [0629].第29节:配置中心业务规则与动态刷新
  • mac: docker : Command not found解决
  • Django drf基于APIView 快速使用
  • 【MarsCode】每日一题数组 之 数字分组求偶数和
  • 解决:error: subprocess-exited-with-error 的问题
  • 使用腾讯混元(HunYuanVideo)视频模型FP8量化版本来生成绅士动画,模型体积30G,8G甜品卡可玩,2秒视频需要15分钟
  • 使用Ancona安装node,安装vue
  • 如何“安装Android SDK“?
  • 天童教育:提升孩子的语言表达能力
  • Node.js中JWT的token完整生命周期管理:从生成到销毁
  • Kotlin报错:lateinit property xxx has not been initialized
  • debian编译失败
  • flink-connector-mysql-cdc:03 mysql-cdc常见问题汇总