嵌入式架构的影响
- 好架构有利于移植
- 好架构有利于代码复用
- 好架构有利于驱动和应用的解耦
- 好架构有利于应用完全独立于驱动
- 嵌入式系统的基本架构
- 硬件架构
①嵌入式微处理器:体积更小,功耗,成本更低,可靠性高
②嵌入式微控制器:又称单片机,一般以某种微处理器内核为核心,整个系统集成到一块芯片,与嵌入式微处理器比最大特点是单片化
③嵌入式数字信号处理器:专门用于信号处理的处理器,DSP是芯片内部采用程序和数据分开的结构,具备专门的硬件乘法器,采用流水线操作,提供特殊DSP指令
④嵌入式片上系统:在一块芯片上集成很多功能模块的复杂系统,量产时成本远低于单片部件组成的系统。
- 软件架构(系统软(内核,驱动,BootLoader),支撑软件(UI库,数据库,网络库,虚拟机),应用软件(各类APP))
App职责1.熟悉网络,TCP/IP协议,IIC,SPI,USB,Serial协议
2.熟悉多线程管理,进程间童心,文件IO操作
3.了解shell编程
4.熟悉数据库操作
5.了解Qt或Android
驱动职责 1.熟悉uboot和内核,完成内核裁剪定制以及固件更新
2.熟悉Linux驱动模型
3.熟悉arm架构
4.熟悉基本的电路原理
- 嵌入式程序设计思路
释义:功能模块设计与分层/API分为驱动层和应用层API,不是都调用驱动API、APP按功能模块划分,并整体结构分层(算法模块,数据库模块,通信库模块),模块之上开发公共接口、驱动层提供公共接口供上层调用,各功能块可独立编译(如ANSIC可复用任意平台),或调用驱动层接口(文件库模块调用驱动读写flash),总之封装出功能独立可复用的功能模块
总体:硬件驱动层->功能模块层->应用接口层->业务逻辑层->应用层(例如Android架构)
应用层 | 调用不同的业务模块完成功能逻辑 | ||||||||||
业务逻辑层 | 卡处理业务 | 通信业务 | 公交业务 | 定时业务 | .... | ||||||
应用接口层 | 应用层API接口 | ||||||||||
功能模 块层 | 文件库模块 | 卡库模块 | 算法模块 | 通信模块 |
| 显示模块 |
| 银联模块 |
| ||
硬件驱动层 | NCOS |
|
|
|
|
|
|
|
|
|
|
System | IIC | PICC | USART | CAN | TCP、IP | FS | Voice | Screen | Flash | ||
LAN | USB | Flash | |||||||||
CPU片上内外设驱动(GPIO、Timer、USART、SPI等) |
- 应用层:总体流程运行框架,组织调用业务逻辑,可用EOS实现(定时任务,卡处理任务,菜单任务、通信任务)
- 业务逻辑层(CPU卡处理、交通部卡处理、银联卡处理,M1卡处理、通信记录上传,黑名单下载、票价参数下载等)
- 应用接口层:公共API接口供应用接口、上层调用,这些接口也可由下层功能模块开发APP接口层汇总
- 功能模块层:封装不同的功能模块(算法库、文件库、通信库、银联库、向上提供应用接口层的接口、向下调用驱动接口)
- 硬件驱动层(由各个驱动模块组成,向上提供统一接口)
基本约定:
①每个模块提供的接口要统一,后续只能增不能更改原来的接口
②模块之间相互独立,互不影响,不能相互调用,只能调用它下层的接口
③模块构成层,层之间不能跨级调用,如应用层中不能看到直接调用驱动层的代码
④模块中又可以继续分层,如接口层,驱动层,硬件层
- 一个引以为戒的实例
- 错误的示例:1文字化描述、2.只关注部分模块、3.层次理解不清晰、4.模块启动属于业务流程而不是硬件驱动层、5、总线读写不属于硬件驱动、6.应用参数初始化属于流程、7.数据处理属于通信不是独立模块
- 更改版基本框架图
基本框架 | ||||
应用层 | 调用不同的业务模块完成逻辑功能 | |||
业务逻辑 | 心跳业务 | 通讯业务 | 设备控制业务 | 报警处理业务 |
功能模块层 | API | |||
通信库模块 | 日志库模块 | 算法库模块 |
| |
电机库模块 | 加速机模块 | 升级模块 |
| |
硬件驱动层 | API | |||
Flash | UART | BC95 | RTC | |
加速度计 | 蓝牙 |
|
| |
CPU片内外设驱动(GPIO、TIMER、USART、SPI、IIC) |
释义:1.层与层之间不跨层调用,2.模块间无依赖,3.模块统一接口上层调用,内外接口分明,4.模块功能只增不减,5.模块还可以分层,例如接口层,驱动层,硬件层
四.给嵌入式代码也分层
- 遇到的问题
1)开发效率低(反复查询手册),2)代码重复较多led_init xtal_init太多,3)不易修改,代码中业务逻辑与SFR操作混合可读性差修改费劲儿
- 由网站分层引起的思考
- 数据接入层(DAL),2)业务逻辑层(BLL),3)用户界面层(UIL)
- 分层提高复用性和扩展性
- 嵌入式项目也来个分层
嵌入式开发核心即芯片,提供固定片内资源(IO,ISR,TIMER等,ADC,SPI等,不需要ADC采集芯片模拟SPI)供开发使用,主要特点就是不随项目需求变动,是底层支持
- 硬件抽象层(HAL)实现片内资源(定时器、ADC、中断、IO等)通用配置,隐藏SFR细节,提供简单接口
- 硬件驱动层(HDL)EEPROM/SPI/LCD,Sensor,Keyboard,Mouse等等封装芯片
- 功能模块层(FML)调用HAL实现各片外功能模块,隐藏细节为上层提供简单接口
- 应用程序层(APL)通过HAL与FML实现最终的应用,负责功能模块的使用和模块间逻辑关系处理等,例如用户交互界面应用可能需要的led,lcd,key等
- 硬件抽象层和硬件驱动层的主要区别
抽象层使用芯片内本身资源;
驱动层使用芯片本身不存在的资源,且需要编写代码才能实现的资源;
可以都归为抽象层
- 功能模块层和硬件抽象层、硬件驱动层的主要区别
功能模块层是按照项目需求提取的功能,需要硬件抽象层以及驱动层支持,他根据项目需求变化,抽象层则是根据项目工号等硬件需求变化,子功能增加需要增加硬件,也要更换驱动
应用程序层 | 交互界面 | |||||
功能模块层 | KEY | EEPROM | LED | 。。。 | 。。。 | 。。。 |
硬件驱动层 | W250128 | AT24C02 | TIA1041 | 。。。 | 。。。 | 。。。 |
硬件抽象层 | I/O | ADC | TIMER | SPI | CAN | USART |
FLASH |
|
|
|
|
| |
硬件层 |
|
|
|
|
|
|