侵权投诉

单片机固件的应用与驱动分离设计的方式

硬件攻城狮 2021-06-30 15:28 次阅读

今天跟大家找了一种常见的应用与驱动分离设计的方式,对于目前一些高性能MCU还是值得使用一下的,不过对于原本主频不够高、性能不太强的MCU不建议使用,毕竟这样的设计还是牺牲了一定的性能。在正规的项目开发中,项目往往是并行开发的,也就是说硬件设计、底层软件设计、应用软件设计等是同步进行的。比如说在开发板上调试模块驱动,在其他平台上调试应用程序再移植到目前这个平台等。

1

为何不见嵌入式软件架构师职位?

在招聘网站搜索架构师,会出现各种系统架构师:web架构师,后台服务端架构师等等,但是唯独很难看到嵌入式软件架构师。嵌入式软件不需要架构吗,驱动不需要架构吗?

答案当然是需要,不过为什么没有这方面的职位?

一般的人会说,小项目才用单片机,实现功能简单,无需太多人参与,所以无需注重软件设计。其实是很幼稚的观点(刚毕业时我也是这样认为的)。

目前国内的嵌入式开发主要分为嵌入式底层开发和嵌入式应用开发,嵌入式的底层开发一般叫做驱动开发,或者bsp开发,有时也有称之为linux内核开发,名字听着都很高大上的感觉。

而嵌入式上的应用开发,一般业务逻辑比较简单,被很多人忽略,所以招聘方也会感觉没必要招架构师级别的了。

2

嵌入式软件架构的好处

为什么有人觉得没必要有嵌入式软件架构设计,那可能你做的项目只是流水灯级别吧。

当然,不能说完全需要,至少对于大多数项目而言,都需要有一个软件架构设计,好处也是有很多,这里罗列一些:

1、应用的代码逻辑清晰,且避免重复的造轮子。

2、如果没有好的架构,移植将会是一件很痛苦的事情。

3、方便后期维护和升级。

4、最大限度的复用。

5、高内聚低耦合

3

嵌入式软件架构之驱动分离

经典的linux+arm配置属于资源比较丰富,高配的嵌入式系统,其操作系统本身就很强大,软件设计也变得水到渠成。本文所要提到的嵌入式,其实更偏向于单片机,结合一个案例给大家讲讲分层设计。以MCU + IAR为例,讲讲把底层软件和应用软件分开。

第一种方式:把底层软件生成一个静态库提供給应用。但是这样就会有一个问题,如果静态库改变了,得重新编译,然后提供給应用,应用程序也得重新编译一下,这显然是很麻烦的一种处理方式。另外一种方式:底层软件和应用软件是两个独立的bin文件,姑且叫libdev.bin和app.bin。

非操作系统的嵌入式是没有动态库.so这样一说的,不过底层软件这个可执行文件姑且就认为是app的.so吧。这两个bin文件通过配置icf,映射到不同的flash空间以及分配不同的RAM空间。显然,这两个bin文件的关系是app.bin会调用libdev.bin的实现。但是他们是独立的bin文件,如何关联起来呢。

这事就需要一个函数表告诉app.bin到哪里去调用libdev.bin里面的函数实现。要实现这个函数表,就需要有统一的函数接口才方便管理。这个函数表可用静态库.a实现(libdev.a)。libdev.a的功能就是要映射所有libdev的接口函数,使app调用某一接口函数时,可以跳转到libdev.bin里面执行。具体设计思路:1.函数表用结构体的方式实现,结构体元素为函数指针。

1struct libdev_ops{

2 int (*dev_PortOpen)(int PortNum, char *PortParm);

3};

2.在libdev.bin里面,对结构体里面的函数指针赋值。

1void libdev_ops_init(struct libdev_ops *ops){

2 ops-》dev_PortOpen = dev_PortOpen;//把函数地址赋给对应的函数指针

3}

3.程序启动时,先进入libdev.bin,然后再跳转到app.bin。在此需要一个地址跳转函数(在libdev.a里面)。

1struct libdev_ops ops;

2void call_app(int addr)

3{

4 int (*startup)(struct libdev_ops *ops);

5 startup = (int(*)(struct libdev_ops *))(addr);

6 libdev_ops_init(&ops);

7 startup(&ops);

8}

4.重新封装所有函数,如下:

1int dev_PortOpen(int PortNum, char *PortPara)

2{

3 return ops-》dev_PortOpen(PortNum,PortPara);

4}

5.实现libdev.bin需要跳转地址的函数(在app.bin)。

1void common_startup(struct libdev_ops *libdev_ops)

2{

3 。。。。。。

4 ops = libdev_ops;

5 dev_printf = ops-》printf;//printf为不定参函数,不能在步骤2中进行赋值,所以在静态库里进行初始化赋值。

6 main();//跳到app的main中

7}

6.app.bin程序的启动地址修改,修改 IAR配置

进入options--linker--library--勾选override default program entry,在Entry symbol 后面输入common_startup。

7.因为有两个.bin程序。所以就需要配置icf文件,并且call_app(addr)这个addr为app.bin里面common_startup函数的地址。因此需要编译app.bin后在output文件里面的app.map里面查看common_startup的地址是多少(由于这个函数是程序最先执行的函数,所以其地址为icf配置的起始地址)。

8.然后你在应用里面包含了dev_PortOpen函数的头文件就可以正常调用这个函数了。

因为libdev.bin和app.bin是同时运行的(app.bin调用的libdev函数的实现在libdev.bin里面),因此必须把RAM和ROM分成两份,不得重叠。

编辑:jq

原文标题:单片机固件的"驱动分离"式设计思想

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

【视频教程】单片机系列课程-14(pcb设计之之封装制作以及导入PCB)

该视频为单片机系列基础课程讲解,本期为第14集内容,欢迎大家观看,也可以留言讨论问题。 上期回顾: ...
发表于 09-28 20:39 32次 阅读

【原创分享】如何学好嵌入式系统中的C语言编程

1、真正深刻地认识存储器 冯.诺伊曼说过“程序等于算法加数据结构”。首先,算法是什么?算法是通过存储在存储器中的程序代...
发表于 09-28 20:37 0次 阅读
【原创分享】如何学好嵌入式系统中的C语言编程

呼啦圈免开发方案来了,在家就能瘦身

“后疫情时代”,居家健身正成为一条热门赛道。用户的健身热情与需求日益高涨,紧凑的都市生活也促使更多人倾向居家锻炼的健身产...
发表于 09-28 19:42 0次 阅读

喜迎国庆 | 启明云端携手8ms平台邀您--设计最美UI·晒出你心中的“中国红”

如果信念有颜色,那一定是中国红9月25日晚间21时50分,飞机稳稳降落,机场灯火通明,机身上的五星红....
的头像 杨杨 发表于 09-28 18:29 3次 阅读
喜迎国庆 | 启明云端携手8ms平台邀您--设计最美UI·晒出你心中的“中国红”

灵动微MCU产品MM32系列的特点及应用

市场应用 白色家电、医疗、打印机、智能锁、读卡器、电子标签、物品跟踪、智能零售、楼宇控制、工业机器....
的头像 杨娴 发表于 09-28 18:21 17次 阅读
灵动微MCU产品MM32系列的特点及应用

eFPGA能针对特定子市场或相邻市场量身打造SoC

嵌入式FPGA (eFPGA)由于可为人工智能(AI)工作负载提供支持与灵活度,这项业务正开始掀起波....
的头像 FPGA设计论坛 发表于 09-28 17:50 264次 阅读

重磅官宣!纽伦堡会展与博闻创意签署战略合作,德国嵌入式展2022年首次落户上海

万物智联浪潮中,全球嵌入式产业迅猛发展,越来越多优秀的中国嵌入式企业在此浪潮中脱颖而出。
发表于 09-28 17:22 179次 阅读
重磅官宣!纽伦堡会展与博闻创意签署战略合作,德国嵌入式展2022年首次落户上海

灵动微32位单片机MM32F0010A6T介绍

灵动微MM32F0010A6T采用内核M3的高性能32位单片机,工作频率最高可达48兆赫兹,内置高速....
发表于 09-28 16:54 7次 阅读

基于单片机的直流电机控制器的设计

基于单片机的直流电机控制器的设计(电源技术研讨会武汉)-该文档为基于单片机的直流电机控制器的设计讲解....
发表于 09-28 11:17 12次 阅读
基于单片机的直流电机控制器的设计

单片机的数字PID控制直流电机系统

单片机的数字PID控制直流电机系统(实用电源技术pdf)-该文档为单片机的数字PID控制直流电机系统....
发表于 09-28 11:15 7次 阅读
单片机的数字PID控制直流电机系统

企业应该如何应对单片机芯片短缺风波

从2020年的下半年开始至今,全球的企业遭遇了单片机芯片短缺的风波。再因疫情复发的情况下,也导致了单....
的头像 芯片逆向 发表于 09-28 10:37 146次 阅读

瑞萨RH850F1L(ADCA)系列单片机的AD转换操作实例

瑞萨RH850F1L(ADCA)系列单片机的AD转换操作实例(通信电源技术2020年22期)-瑞萨R....
发表于 09-28 10:07 5次 阅读
瑞萨RH850F1L(ADCA)系列单片机的AD转换操作实例

AVR单片机SPI的串行ADC接口的设计

AVR单片机SPI的串行ADC接口的设计(电源技术的新技术发展方向)-AVR单片机SPI的串行ADC....
发表于 09-28 10:02 5次 阅读
AVR单片机SPI的串行ADC接口的设计

单片机与上位机软件设计pdf(下)

单片机与上位机软件设计pdf(下)
发表于 09-28 09:55 11次 阅读

单片机与上位机软件设计pdf(上)

单片机与上位机软件设计pdf(上)
发表于 09-28 09:52 9次 阅读

单片机是如何采样电流的

单片机是如何采样电流的?能不能增大采样电阻呢?...
发表于 09-28 08:39 0次 阅读

如何利用linux来开发属于自己的嵌入式项目

如何利用linux来开发属于自己的嵌入式项目?有哪些流程?...
发表于 09-28 07:39 0次 阅读

如何使用DHT11和STM32单片机进行湿度和温度监控呢

DHT11是什么? 如何使用DHT11和STM32单片机进行湿度和温度监控呢? ...
发表于 09-28 07:26 0次 阅读

如何实现单片机和电脑之间的信息交互

如何实现单片机和电脑之间的信息交互? 怎样实现单片机串口调试助手发送的数据显示在数码管上? ...
发表于 09-28 07:13 0次 阅读

怎样用CubeMX创建第一个project

如何去安装CubeMX? 怎样用CubeMX创建第一个project? ...
发表于 09-28 06:15 0次 阅读

怎样去计算单片机的交流电压电流呢

如何计算出交流电压,交流电流? 怎样去计算单片机的交流电压电流呢  ?...
发表于 09-28 06:08 0次 阅读

如何拆焊Flash芯片以及制作PCB的两种不同方法

本文将介绍如何拆焊Flash芯片,设计及制作相应的分线板。了解对嵌入式设备的非易失性存储的简单有效攻....
的头像 STM32嵌入式开发 发表于 09-27 17:14 421次 阅读
如何拆焊Flash芯片以及制作PCB的两种不同方法

基于AT89S52单片机的无刷直流电机单片机控制调速系统设计

基于AT89S52单片机的无刷直流电机单片机控制调速系统设计(深圳市普德新星电源技术有限公司主要生产....
发表于 09-27 16:50 20次 阅读
基于AT89S52单片机的无刷直流电机单片机控制调速系统设计

MCS-51与DAC、ADC的接口讲解

MCS-51与DAC、ADC的接口讲解(通信电源技术官网)-该文档为MCS-51与DAC、ADC的接....
发表于 09-27 15:46 9次 阅读
MCS-51与DAC、ADC的接口讲解

单片机操作直流电机

单片机操作直流电机(电源技术研讨会武汉)-单片机操作直流电机,控制电机的转速,PWM控制
发表于 09-27 15:02 12次 阅读
单片机操作直流电机

用AVR单片机控制开关电源

用AVR单片机控制开关电源(通信电源技术2019第七期)-该文档为用AVR单片机控制开关电源简介文档....
发表于 09-27 15:00 11次 阅读
用AVR单片机控制开关电源

单片机DZ60的开关电源并联供电系统设计制作

单片机DZ60的开关电源并联供电系统设计制作(现代电源技术第二章答案)- 设计制作了基于单片机DZ6....
发表于 09-27 14:41 6次 阅读
单片机DZ60的开关电源并联供电系统设计制作

Arduino和STM32性能对比究竟谁更厉害

Arduino和STM32性能对比究竟谁更厉害呢?很多电子爱好者面对Arduino和STM32时都会....
的头像 STM32嵌入式开发 发表于 09-27 14:32 565次 阅读

采用AVR单片机的数字正弦逆变电源设计

采用AVR单片机的数字正弦逆变电源设计(电源技术教材)-该书为基于AVR单片机的数字正弦逆变电源设计....
发表于 09-27 13:05 7次 阅读
采用AVR单片机的数字正弦逆变电源设计

基于单片机交直流数字电压表的设计讲解

基于单片机交直流数字电压表的设计讲解(通信电源技术期刊封面)-该书为基于单片机交直流数字电压表的设计....
发表于 09-27 11:23 10次 阅读
基于单片机交直流数字电压表的设计讲解

宇凡微突破创新MCU方案开发,竞逐单片机芯片蓝海市场

MCU全称为Microcontroller Unit,即微控制器,也叫单片机,是一种广泛运用于家电、....
的头像 科讯视点 发表于 09-27 10:46 462次 阅读

解析MSP430系统时钟资源

解析MSP430系统时钟资源
发表于 09-26 11:39 12次 阅读

MSP430单片机C语言应用程序设计实例精讲图书

MSP430单片机C语言应用程序设计实例精讲图书
发表于 09-26 11:31 25次 阅读

STM32等单片机程序加密解密方法

单片机加密、解密 单片机(MCU)一般都有内部程序区和数据区(或者其一)供用户存放程序和工作数据(或....
的头像 STM32嵌入式开发 发表于 09-26 11:14 518次 阅读

基于飞凌FETMX8MP-C核心板的AGV小车

在科技日新月异的当今社会,5G和AI都是非常火爆的概念。随着5G的商用,5G技术在社会的普及程度逐步....
发表于 09-26 11:05 317次 阅读

致单片机程序总是跑飞怎么办

单片机中有看门狗,长时间不喂狗,程序就会复位。为什么长时间不喂狗呢?这是因为程序跑飞了,抛开外部因素....
的头像 嵌入式ARM 发表于 09-26 10:45 401次 阅读

单片机监测交流电压报警系统设计

单片机监测交流电压报警系统设计(新型电源技术作业答案)-单片机监测交流电压报警系统设计,该报警系统对....
发表于 09-24 17:29 20次 阅读
单片机监测交流电压报警系统设计

剖析C语言中scanf函数常见问题

在写C代码时难免对一些知识点不熟悉,导致犯错,今天分享几点小知识给大家。 空白符问题        ....
的头像 STM32嵌入式开发 发表于 09-24 16:45 165次 阅读

基于AVR单片机的直流无刷电机智能控制系统设计

基于AVR单片机的直流无刷电机智能控制系统设计(开关电源技术与设计潘永雄.pdf)-该文档为基于AV....
发表于 09-24 16:44 27次 阅读
基于AVR单片机的直流无刷电机智能控制系统设计

基于AVR单片机的直流无刷电机智能控制系统设计讲解

基于AVR单片机的直流无刷电机智能控制系统设计讲解(西工大现代电源技术)-该文档为基于AVR单片机的....
发表于 09-24 16:00 19次 阅读
基于AVR单片机的直流无刷电机智能控制系统设计讲解

基于AVR单片机的直流电机调速的方法

基于AVR单片机的直流电机调速的方法(2020空间电源技术学术研讨会)-该文档为基于AVR单片机的直....
发表于 09-24 15:40 18次 阅读
基于AVR单片机的直流电机调速的方法

基于AVR单片机的直流电动机的PWM调速系统设计

基于AVR单片机的直流电动机的PWM调速系统设计(ups电源技术协议范本)-该文档为基于AVR单片机....
发表于 09-24 15:04 18次 阅读
基于AVR单片机的直流电动机的PWM调速系统设计

Crypto算法库使用技巧之基于STM32 AES GCM应用提示

引言 X-CUBE-CRYPTOLIB 是基于 STM32 的 Crypto 算法库,支持对称密钥、....
的头像 STM32单片机 发表于 09-24 14:23 414次 阅读

如何快速将BootLoader与APP固件合并

1、前言嵌入式固件一般分为BootLoader和App,BootLoader用于启动校验、App升级....
的头像 嵌入式ARM 发表于 09-24 14:19 112次 阅读

基于ATmega单片机的直流电机调速器

基于ATmega单片机的直流电机调速器(开关电源技术与设计心得)-本毕业设计包括为基于ATmega单....
发表于 09-24 12:46 17次 阅读
基于ATmega单片机的直流电机调速器

OpenHarmony HDF传感器模型框架介绍与传感器驱动开发指导

作者介绍 刘飞虎(kevin),担任OpenHarmony社区SIG_DriverFramework....
的头像 OpenAtom OpenHarmony 发表于 09-24 11:21 145次 阅读
OpenHarmony HDF传感器模型框架介绍与传感器驱动开发指导

一篇让你看懂数字信号模拟信号

数电模电是电子信息类专业的专业基础课。但是由于比较难,所以很多人学的并不是很好,今天阿斌就来带大家先....
的头像 硬件攻城狮 发表于 09-24 10:57 2428次 阅读
一篇让你看懂数字信号模拟信号

嵌入式软件工程师在日常开发过程中的关键组件

大家好,周末快乐,我是小麦,今天分享一下CBUF。 循环缓冲区是嵌入式软件工程师在日常开发过程中的关....
的头像 Linux阅码场 发表于 09-24 10:47 103次 阅读
嵌入式软件工程师在日常开发过程中的关键组件

如何利用AI核心来开发极低功耗的AI应用

人工智能应用的市场份额稳步增长。为此,意法半导体提供广泛的产品组合,轻松实现多级别的人工智能应用。在....
的头像 意法半导体中国 发表于 09-24 09:56 149次 阅读

深度解读嵌入式视觉的几个典型应用

引言 如何做AI视觉应用的嵌入式部署分为硬件选型,软件框架和优化的选择,模型算法的设计三大板块。 A....
的头像 新机器视觉 发表于 09-23 16:38 204次 阅读

STM32等单片机程序加密有哪些方法

为了防止大家的程序不被剽窃,本文给大家分享单片机加密的方法。 另外关于解密的方法可以参考这篇文章如何....
的头像 STM32嵌入式开发 发表于 09-23 16:06 162次 阅读

嵌入式linux直流电机驱动程序的设计

嵌入式linux直流电机驱动程序的设计(深圳核达中远通电源技术股份有限公司怎么样)-3.1 安装Re....
发表于 09-23 13:44 24次 阅读
嵌入式linux直流电机驱动程序的设计

一种基于AVR单片机的直流电源监控系统

一种基于AVR单片机的直流电源监控系统(电源技术离线作业答案)-该文档为一种基于AVR单片机的直流电....
发表于 09-23 13:01 18次 阅读
一种基于AVR单片机的直流电源监控系统

80C196KC单片机开关稳压电源的设计

80C196KC单片机开关稳压电源的设计(开关电源技术讲座)-该文档为80C196KC单片机开关稳压....
发表于 09-23 12:27 20次 阅读
80C196KC单片机开关稳压电源的设计

单片机与芯片有什么区别

最近一直有很多小白用户会问我单片机是什么,跟芯片有什么区别。 单片机其实也是芯片的一种,芯片包括各种....
的头像 芯片逆向 发表于 09-23 11:42 401次 阅读

C++中const以及this指针的使用

const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer ....
的头像 C语言编程学习基地 发表于 09-23 11:39 177次 阅读

事实证明8位MCU并没有消亡,它正在茁壮成长

对于经常表达的 8 位微控制器正在衰落的想法,可能也是如此。现实情况似乎是,尽管面临来自低成本、低功....
的头像 物联网评论 发表于 09-23 11:11 2013次 阅读

IP知识百科之URL过滤

URL过滤 URL过滤是一种针对用户的URL请求进行上网控制的技术,通过允许或禁止用户访问某些网页资....
的头像 华为产品资料 发表于 09-23 11:08 130次 阅读

简述单片机常见的打印输出方式及区别

作者 |strongerHuang 微信公众号 | 嵌入式专栏 单片机开发中,打印输出比较常见,也比....
的头像 strongerHuang 发表于 09-23 09:58 142次 阅读
简述单片机常见的打印输出方式及区别