嵌入式架构的影响

  1. 好架构有利于移植
  2. 好架构有利于代码复用
  3. 好架构有利于驱动和应用的解耦
  4. 好架构有利于应用完全独立于驱动

 

  • 嵌入式系统的基本架构
  1. 硬件架构

 ①嵌入式微处理器:体积更小,功耗,成本更低,可靠性高

 ②嵌入式微控制器:又称单片机,一般以某种微处理器内核为核心,整个系统集成到一块芯片,与嵌入式微处理器比最大特点是单片化

 ③嵌入式数字信号处理器:专门用于信号处理的处理器,DSP是芯片内部采用程序和数据分开的结构,具备专门的硬件乘法器,采用流水线操作,提供特殊DSP指令

 ④嵌入式片上系统:在一块芯片上集成很多功能模块的复杂系统,量产时成本远低于单片部件组成的系统。

  1. 软件架构(系统软(内核,驱动,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等)

 

  1. 应用层:总体流程运行框架,组织调用业务逻辑,可用EOS实现(定时任务,卡处理任务,菜单任务、通信任务)
  2. 业务逻辑层(CPU卡处理、交通部卡处理、银联卡处理,M1卡处理、通信记录上传,黑名单下载、票价参数下载等)
  3. 应用接口层:公共API接口供应用接口、上层调用,这些接口也可由下层功能模块开发APP接口层汇总
  4. 功能模块层:封装不同的功能模块(算法库、文件库、通信库、银联库、向上提供应用接口层的接口、向下调用驱动接口)
  5. 硬件驱动层(由各个驱动模块组成,向上提供统一接口)

基本约定:

 ①每个模块提供的接口要统一,后续只能增不能更改原来的接口

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

 ③模块构成层,层之间不能跨级调用,如应用层中不能看到直接调用驱动层的代码

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

 

  • 一个引以为戒的实例
  1. 错误的示例:1文字化描述、2.只关注部分模块、3.层次理解不清晰、4.模块启动属于业务流程而不是硬件驱动层、5、总线读写不属于硬件驱动、6.应用参数初始化属于流程、7.数据处理属于通信不是独立模块
  2. 更改版基本框架图

   

基本框架

应用层

调用不同的业务模块完成逻辑功能

业务逻辑

心跳业务

通讯业务

设备控制业务

报警处理业务

功能模块层

API

通信库模块

日志库模块

算法库模块

 

电机库模块

加速机模块

升级模块

 

硬件驱动层

API

Flash

UART

BC95

RTC

加速度计

蓝牙

 

 

CPU片内外设驱动(GPIO、TIMER、USART、SPI、IIC)

释义:1.层与层之间不跨层调用,2.模块间无依赖,3.模块统一接口上层调用,内外接口分明,4.模块功能只增不减,5.模块还可以分层,例如接口层,驱动层,硬件层

四.给嵌入式代码也分层

  1. 遇到的问题

    1)开发效率低(反复查询手册),2)代码重复较多led_init xtal_init太多,3)不易修改,代码中业务逻辑与SFR操作混合可读性差修改费劲儿

  1. 由网站分层引起的思考
  2. 数据接入层(DAL),2)业务逻辑层(BLL),3)用户界面层(UIL)
  3. 分层提高复用性和扩展性
  4. 嵌入式项目也来个分层

    嵌入式开发核心即芯片,提供固定片内资源(IO,ISR,TIMER等,ADC,SPI等,不需要ADC采集芯片模拟SPI)供开发使用,主要特点就是不随项目需求变动,是底层支持

  1. 硬件抽象层(HAL)实现片内资源(定时器、ADC、中断、IO等)通用配置,隐藏SFR细节,提供简单接口
  2. 硬件驱动层(HDL)EEPROM/SPI/LCD,Sensor,Keyboard,Mouse等等封装芯片
  3. 功能模块层(FML)调用HAL实现各片外功能模块,隐藏细节为上层提供简单接口
  4. 应用程序层(APL)通过HAL与FML实现最终的应用,负责功能模块的使用和模块间逻辑关系处理等,例如用户交互界面应用可能需要的led,lcd,key等
  • 硬件抽象层和硬件驱动层的主要区别

抽象层使用芯片内本身资源;

驱动层使用芯片本身不存在的资源,且需要编写代码才能实现的资源;

可以都归为抽象层

  • 功能模块层和硬件抽象层、硬件驱动层的主要区别

功能模块层是按照项目需求提取的功能,需要硬件抽象层以及驱动层支持,他根据项目需求变化,抽象层则是根据项目工号等硬件需求变化,子功能增加需要增加硬件,也要更换驱动

应用程序层

交互界面

功能模块层

KEY

EEPROM

LED

。。。

。。。

。。。

硬件驱动层

W250128

AT24C02

TIA1041

。。。

。。。

。。。

硬件抽象层

I/O

ADC

TIMER

SPI

CAN

USART

FLASH

 

 

 

 

 

硬件层