0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式应用开发应用架构有什么作用?嵌入式程序设计的一些思路

Q4MP_gh_c472c21 来源:未知 作者:易水寒 2018-08-12 10:49 次阅读

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

如果没有好的架构,复用是最大的难题,没法更大限度的复用原有的代码。

如果没有好的架构,一旦驱动改了,所有的地方都要改,费时费力且很容易出错。

如果没有好的架构,应用层中穿插着硬件驱动层的代码,看着会是一片混乱,逻辑不清,代码维护起来会很困难。

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

要做到嵌入式应用的代码逻辑清晰,且避免重复的造轮子,没有好的应用架构怎么行!

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

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

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

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

总体结构示意框图:

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

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

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

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

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

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

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

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

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

如果驱动变动了,或者换不同平台,只需更改驱动层,应用层不受影响。

如果功能模块变动了,只需升级功能功能模块,其他的模块不受影响,应用层也不受影响。

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

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

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

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

另一种风格:

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

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

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

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

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

NC_FileSys文件库,跟硬件相关的接口在Hook文件夹,重新实现以下几个函数即可:void HW_FRAM_Init( void )unsigned int HW_FRAM_Read( unsigned int addr,unsigned int size,unsigned char *buffer)unsigned int HW_FRAM_Write( unsigned int addr,unsigned int size,unsigned char *buffer )//擦除FLASH一页 (FLASH擦除的最小单元)unsigned int HW_Flash_PageErase( unsigned int page )unsigned int HW_Flash_Read( unsigned int addr, unsigned int size, unsigned char *buffer )unsigned int HW_Flash_NotEraseWrite( unsigned int addr, unsigned int size, unsigned char *buffer )//擦除FLASH一页 (FLASH擦除的最小单元)unsigned int HW_Flash_PageErase( unsigned int page )

按照以上模块化设计思想,很容易实现一模拟pos机:

以开发一个智能pos应用为例:一个智能pos涉及到的功能模块有:读写卡功能,保存与读取消费记录,查找保存黑名单,界面显示,菜单显示,通信下载参数上传记录等。

电脑上实现一模拟pos用到的功能模块有 文件存储模块,卡处理模块,算法模块,银联库模块。我把这些模块移植到电脑上。

只是功能上的实现,完成刷卡消费,记录存储,记录上传,黑名单,票价下载等功能。界面为Dos窗口。后续如果用QT把界面也做出来,就是一功能齐全的模拟POS机,不过得把荒废多年的C++重新拾起来了。可以继续完善做一个上位机模拟pos,改变编译器在上位机仿真调试并交叉编译后运行在真实POS上。

关于卡处理模块的实现,由于电脑上没读卡头,于是用外接读卡器。把读卡器串口接电脑上。电脑上做一读写卡服务,提供TCP接口的读写卡接口。

移植文件库,嵌入式程序中是操作的flash,在电脑上把文件库中用到的接口用读写文件的形式替换。

移植算法库,算法库都是c写的,直接用gcc在windows平台重新编译即可。

各个功能模块,又可以进一步细分为子模块。

拿通信库举例:嵌入式设备都需要支持各种不同的通讯模块。比如硬件设备有A701、A801、B502等,通讯模块有GL868、MG323、MC8630、N710、ZIGBEE等,这些设备分别支持全部或部分通讯模块。

整体架构分为如下:

驱动大致分为三层:1、接口层:为用户提供统一的接口,比如:Connect、TxData、RxData、Disconnect等。2、驱动层:向接口层暴露统一的接口,这些接口用于完成实际的连接断开和数据收发等,比如:DevConnect、DevTxData、RxData、Disconnect等。该层只会和支持的通讯模块相关,不会直接访问任何硬件功能,包括串口通讯、GPIO控制全部通过底层的设备层实现。3、设备层:向驱动层提供统一的接口,这些接口通过访问物理硬件来实现和模块的通讯,比如:XXXPowerOn、SerialSend、SerialReceive等,并定义该设备支持哪些模块。

对于部分编写通讯模块驱动常用的功能,模块中提供了一系列的辅助函数,避免重复劳动。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19013

    浏览量

    303130
  • API
    API
    +关注

    关注

    2

    文章

    1484

    浏览量

    61807
  • 程序
    +关注

    关注

    116

    文章

    3775

    浏览量

    80836

原文标题:搞嵌入式应用开发,没有好的应用架构怎么行?高手分享嵌入式程序设计的一些思路

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式开发教程之程序设计开发维护

      干货来了,本文创客学院嵌入式linux培训讲师和学员分享嵌入式程序设计和系统开发与维护的相关知识点。希望对学习嵌入式开发的学员有所帮助。
    发表于 05-26 14:59

    【转】嵌入式系统原理及应用教程- -嵌入式程序设计基础

    嵌入式系统原理及应用教程- -嵌入式程序设计基础 l
    发表于 12-02 22:20

    主流的嵌入式CPU架构-ARM架构详解

    简单聊聊  上篇,介绍到了什么是嵌入式,以及嵌入式与单片机、PC机的区别,简单聊了聊有关嵌入式软件学习的一些内容。这
    发表于 12-13 06:05

    嵌入式一些日常小技巧分享

    杂记–算法学习日志+关于实验室部门架构的思考+嵌入式一些日常小技巧分享算法学习日志因为从初中到现在直是学习嵌入式
    发表于 12-21 08:07

    嵌入式系统的C程序设计

    嵌入式系统的C程序设计
    发表于 04-07 22:42 86次下载
    <b class='flag-5'>嵌入式</b>系统的C<b class='flag-5'>程序设计</b>

    嵌入式系统的C程序设计

    嵌入式系统的C程序设计
    发表于 11-10 08:59 54次下载

    嵌入式系统的c程序设计

    嵌入式系统的c程序设计
    发表于 02-11 09:21 65次下载
    <b class='flag-5'>嵌入式</b>系统的c<b class='flag-5'>程序设计</b>

    嵌入式系统的C程序设计

    嵌入式系统的C程序设计 需要的朋友下来看看
    发表于 12-29 17:56 1次下载

    嵌入式系统的C程序设计

    嵌入式系统的C程序设计,感兴趣的小伙伴们可以看看。
    发表于 07-26 10:26 42次下载

    嵌入式系统与C程序设计

    嵌入式系统与C程序设计
    发表于 10-30 10:20 13次下载
    <b class='flag-5'>嵌入式</b>系统与C<b class='flag-5'>程序设计</b>

    嵌入式系统的一些基础知识

    本文主要介绍嵌入式系统的一些基础知识,希望对各位帮助。
    的头像 发表于 02-18 10:44 2269次阅读

    ARM嵌入式系统BSP的程序设计总结

    ARM嵌入式系统BSP的程序设计总结(嵌入式开发模式称为)-该文档为ARM嵌入式系统BSP的程序设计总结文档,是
    发表于 08-04 10:37 4次下载
    ARM<b class='flag-5'>嵌入式</b>系统BSP的<b class='flag-5'>程序设计</b>总结

    嵌入式开发):嵌入式开发新手入门

    本篇文章整理下嵌入式开发一些入门的基础技能,都是根据以往的工程经验整理,适用于之前没做过嵌入式开发的新手。嵌入式开发流程般如下,
    发表于 10-14 10:58 79次下载
    <b class='flag-5'>嵌入式开发</b>(<b class='flag-5'>一</b>):<b class='flag-5'>嵌入式开发</b>新手入门

    C语言嵌入式培训 嵌入式C语言程序设计基础

      学习嵌入式的基础语言是C语言,因此先掌握C语言对于后续嵌入式的学习有着非常大的意义。下面讲解下嵌入式C语言程序设计基础,尤其是C语言的一些
    发表于 11-03 21:06 32次下载
    C语言<b class='flag-5'>嵌入式</b>培训  <b class='flag-5'>嵌入式</b>C语言<b class='flag-5'>程序设计</b>基础

    嵌入式系统设计师学习笔记二十六:嵌入式软件程序设计①——嵌入式应用开发的过程

    嵌入式系统设计师学习笔记二十六:嵌入式软件程序设计①——嵌入式应用开发的过程
    发表于 11-04 10:06 18次下载
    <b class='flag-5'>嵌入式</b>系统设计师学习笔记二十六:<b class='flag-5'>嵌入式</b>软件<b class='flag-5'>程序设计</b>①——<b class='flag-5'>嵌入式</b>应用<b class='flag-5'>开发</b>的过程