这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 嵌入式架构到底有多重要?看完惊呆了

共1条 1/1 1 跳转至

嵌入式架构到底有多重要?看完惊呆了

高工
2020-03-22 14:04:02     打赏

01嵌入式系统的基本架构

嵌入式系统一般由软件和硬件两个部分组成,基中嵌入式处理器、存储器和外部设备构成整个系统的硬件基础。嵌入式系统的软件部分可以分为三个层次,分别是系统软件、支撑软件和应用软件,其中系统软件和支撑软件是基础,应用软件是最能体现整个嵌入式系统的特点和功能部分。

硬件架构

嵌入式系统的核心部件是各种类型的嵌入式处理器(1)嵌入式微处理器:在功能上跟普通微处理器基本一致,但是它具有体积小、功耗低、成本低及可靠性高的优点。(2)嵌入式微控制器:双称单片机,一般以某一种微处理器内核为核心,整个计算机系统都集成到一块芯片中,与嵌入式微处理器相比,最大特点是单片化。(3)嵌入式数字信号处理器:一种专门用于信号处理的处理器,DSP(Digital Signal Processor)是芯片内部采用程序和数据分开的结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP指令。(4)嵌入式片上系统:一种在一块芯片上集成很多功能模块的复杂系统,在大量生产时,生产成本也远远低于单片部件组成的电路板系统。


image.png

大多数人参与的是嵌入式软件设计,更多的是接触的是上层软件系统部分,可以分为两大类型嵌入式软件应用工程师以及嵌入式驱动工程师。

image.png


前者主要负责 linux APP 设计,负责应用层业务开发,主要具备如下几个专业技能:

1.熟悉网络编程、TCP/IP协议、IIC、SPI协议

2.熟悉多线程管理、进程间通信、文件IO操作

3.了解基本的shell编程

4.熟悉数据库操作

5.了解QT或者Android

后者负责驱动开发,更加涉及底层。

1.熟悉uboot和Linux内核,完成Linux内核裁剪定制以及系统的固件更新

2.熟悉Linux驱动模型

3.熟悉ARM架构

4.熟悉基本的电路原理

02
嵌入式程序设计思路

现在的小朋友都爱玩搭积木的游戏,一个模块一个模块的拼装起来,快速组成各种不同的模型。现在的产品设计也很少从零开始。大都复用现有成熟的模块,专注于某个擅长领域。

我的嵌入式应用架构思路来源与此,即功能模块设计与分层。

把API分为驱动层和应用层API,而不是所有程序都调用驱动层API。(整个应用中都调用驱动层API会导致应用中驱动调用随处可见,无法移植和最大限度的复用)

先把一个应用进行功能模块划分,并对整体结构进行分层,然后设计出功能独立的各个模块(如算法模块,文件库模块,通信库模块),在模块之上开放公共接口。

驱动层提供出公共接口供上层调用。各个功能模块可以独立编译(如算法模块纯ANSI C,可在任意平台复用),或者调用驱动层接口(文件库模块调用了驱动读写Flash),总而言之,言而总之,封装出各个功能独立的可复用的功能模块。

总体分:硬件驱动层-->功能模块层-->应用接口层-->业务逻辑层-->应用层

总体结构示意框图:

image.png

应用层,为程序的总体的运行框架,组织调用业务逻辑。可以用某种嵌入式操作系统实现几种任务 。如定时任务,卡处理任务,菜单任务,通信任务。


业务逻辑层,如CPU卡处理,交通部卡处理,银联卡处理,M1卡处理,通信记录上传,黑名单下载,****价参数下载等。

应用接口层,提供公共的api接口供应用接口供上层调用。这些接口也可由下层的功能模块开放出来,应用接口层负责汇总。

功能模块层,可以封装不同的功能模块。如算法库,文件库,通信库,银联库,向上提供应用接口层的接口,向下调用驱动接口。

硬件驱动层,由各个驱动模块组成,向上提供统一的接口。

遵循一些约定:

1.每个模块提供出的接口要统一,后续只能增,不能改原来的接口。

2.模块与模块之间相互独立,互不影响,不能相互调用,只能调用它下层的接口。

3.由模块构成层,层与层之间不能跨级调用。如在应用层中不能看到直接调用驱动层的代码。

4.模块中又可以继续分层,如接口层,驱动层,硬件层。

如果驱动变动了,或者换不同平台,只需更改驱动层,应用层不受影响。
如果功能模块变动了,只需升级功能功能模块,其他的模块不受影响,应用层也不受影响。

按照这种逻辑设计好之后,主要的工作就是在业务逻辑层。应用层则为程序的总体流程和框架,主要调用业务逻辑层实现不同的功能。

我们现在的代码结构,基本是按这个思路来的。

硬件驱动层-->功能模块层-->应用接口层-->业务逻辑层-->应用层。

看看以下两种风格的代码,你更喜欢哪个。

image.png

另一种风格:

image.png       同样是保存参数,非要拆成 AlgCRC16  ,WritePraFlash( (unsigned char *)&NetPra , NETPRA_ADDR , sizeof(_NetPra) )两步吗?

还有AH_Para_Verify这个,在应用层中真是多余啊,检测失败又从Flash读取。关于参数,一开机就应该检测合法性了。image.png

既然都是要保存参数,就应该做个封装,如上图所示,把系统用到的不同参数做个规划。应用层调用APP_Open_UseFile 或者APP_Read_UseFile,


而不是直接的去读写Flash。

来看看赫赫有名的谷歌的android架构,虽然很复杂,但从框图上看,也像是搭积木,各个功能模块独立,层次分明。最低层建立在linux Kernel基础上,然后是各个组件库libraries,再往上是应用框架和应用。

image.png

以NC_FileLib,文件库模块为例,如果要用在其他平台,如EH0918手持机设备,只需要移植几个硬件层接口即可。

转帖自网络



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]