以STM32裸机开发为例。

软件分层
应用层
驱动层
硬件层
固件层

①最底层为固件层,Firmware
这一层通常是官方给的库,库函数对寄存器进行操作,例如:

/*** @brief  Transmits a Data through the SPIx/I2Sx peripheral.* @param  SPIx: where x can be*   - 1, 2 or 3 in SPI mode *   - 2 or 3 in I2S mode* @param  Data : Data to be transmitted.* @retval None*/
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data)
{/* Check the parameters */assert_param(IS_SPI_ALL_PERIPH(SPIx));/* Write in the DR register the data to be sent */SPIx->DR = Data;
}

②往上一层为硬件层,Hardware。
这一层的函数是在库函数的基础上进一步封装,比如根据STM32 SPI的特性,SPI读写一个数据我们封装为一个函数,例如:

u8 SPI2_ReadWriteByte(u8 TxData)
{       u8 retry = 0;  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){retry++;if(retry > 200)return 0;}           SPI_I2S_SendData(SPI2, TxData); retry = 0;while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) {retry++;if(retry > 200)return 0;}                              return SPI_I2S_ReceiveData(SPI2);
}

这个函数的也只读写送一个数据,我们通常不会只读写一个数据,而是连续读写送N个数据,所以在这个函数的基础上再封装出一个函数,例如:

void SPI2_ReadWriteData(u8 *sendData, u8 *recvData, u32 length)
{u32 i = 0;for(i = 0; i < length; i++){recvData[i] = SPI2_ReadWriteByte(sendData[i]);}
}

③再往上一层是驱动层,drive。
前面两层都是对STM32进行操作,而这一层是对与STM32连接的元器件、模块、模组进行操作,通常称为调试驱动,比如调试STM32和外部FLASH W25Q128的SPI驱动。
这一层的函数通常是对W25Q128进行操作,例如:

u16 W25QXX_ReadID(void)
{u16 Temp = 0;   W25QXX_CS = 0;                   SPI2_ReadWriteByte(0x90);       SPI2_ReadWriteByte(0x00);       SPI2_ReadWriteByte(0x00);       SPI2_ReadWriteByte(0x00);                  Temp |= SPI2_ReadWriteByte(0xFF) << 8;  Temp |= SPI2_ReadWriteByte(0xFF);     W25QXX_CS = 1;                    return Temp;
}

④再往上一层是应用层,APP。
有很多人往往在main.c里面做功能应用,导致main.c内容又多又长,main函数又长又臭,大多数公司的代码规范要求是不允许的。最好把功能应用剥离出来,单独放在应用层,让main函数简洁清晰。
例如:

int main(void)
{   STM32_Sys_Init();W25Q128_Init();//如果这些初始化超过3个,就要考虑封装成一个函数UART_Init();//如果这些初始化超过3个,就要考虑封装成一个函数while(1){switch(g_main_process){case MAIN_UART_RECV_HANDLE://APP_func1();break;case MAIN_XXX_HANDLE://APP_func2();break;//.............default://APP_funcN();break;}}
}

总结:
用分层思想不仅提高代码阅读性(方便新员工接手辞职员工代码,而不是一团糟让人一头雾水),还提高可移植性,如果项目需要换一颗MCU,替换固件层,替换硬件层几个库函数即可,其他层不需要动。

单片机/嵌入式软件架构分层思想相关推荐

  1. 浅谈单片机程序设计中的“分层思想”

    "分层思想"并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用.看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种恍然大悟的感觉.如果说我 ...

  2. 浅谈单片机程序设计中的“分层思想”!

    浅谈单片机程序设计中的"分层思想",并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用.看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种 ...

  3. 嵌入式软件架构设计分层思路

    在正规的项目开发中,项目往往是并行开发的,也就是说硬件设计.底层软件设计.应用软件设计等是同步进行的.比如说在开发板上调试模块驱动,在其他平台上调试应用程序再移植到目前这个平台等. 嵌入式专栏 1 为 ...

  4. SoC嵌入式软件架构设计

    内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...

  5. SoC嵌入式软件架构设计之中的一个:系统内存需求评估

    内存是SoC(System on Chip,片上系统)集成设计的重要模块.是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必需要在成本和效率中取得平衡,做到 ...

  6. 嵌入式软件架构的六个步骤(二)软件基础设施

    软件架构这东西,众说纷纭,各有观点.在我看来,软件架构是软件系统的基本结构,包含其组件.组件之间的关系.组件设计与演进的规则,以及体现这些规则的基础设施.软件架构,从来不是一件容易事,它贯穿在产品的整 ...

  7. 【C/C++开源库】适合单片机/嵌入式的C语言单元测试库

    文章目录 一.为什么需要单元测试? 二.单片机/嵌入式中为什么很少听说单元测试? 三.Unity 什么是Unity 如何使用Unity 剖析Unity 四.单元测试究竟是什么?什么是适合单元测试的代码 ...

  8. 论分层思想在各行各业的应用

    On hierarchy.  论分层思想在各行各业的应用 查了下hierarchy这个词的含义.首先是等级制度, 特权阶级,然后是阶层,最后是层次,层级. 在中文中,有三种看似感情色彩不同的含义,而英 ...

  9. 面向对象写单片机程序-程序分层

    面向对象写单片机程序-程序分层 管理层 typedef struct InputDevice {char *name;int (*GetInputEvent)(PInputEvent ptInputE ...

最新文章

  1. PNAS前沿:迈向作为多层学习的进化理论
  2. Hadoop大数据——shuffle详解
  3. C# Stream 和 byte[] 之间的转换(文件流的应用)
  4. 程序员的职业病(职业素养)之一:动手写业务代码之前先考虑异常处理
  5. goldengate mysql_使用GoldenGate实现MySQL到Oracle的数据实时同步
  6. 自适应均衡器 matlab程序,基于lms自适应均衡器matlab仿真
  7. Node.js: 如何退出node命令或者node server
  8. sql server 高可用故障转移(6)
  9. SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一)
  10. 编程哲学之C#篇:02——学习思维
  11. BZOJ2795: [Poi2012]A Horrible Poem
  12. brew更新的时候不更新某个应用_可以不可以第六集剧情介绍,日剧可以不可以什么时候更新...
  13. WinServer2003秘笈放送
  14. 苹果7系统更新12无服务器,别再为苹果手机无法更新系统犯难,这几种方式帮你解决!...
  15. cad计算机绘图实操视频,cad工程制图教程视频
  16. 熊猫烟花集团完美见证异速联远程接入系统
  17. C:\Windows\System32\drivers\etc\hosts文件的作用说明
  18. 对“主数据”的一点吐槽
  19. android 符号表情显示乱码,android输入框限制输入法中的表情符号
  20. HTML5-VScode-常用标签的样式以及复合写法

热门文章

  1. Linux挂载多个文件夹读不出,FTP不显示Linux挂载文件夹怎么办?-处理FTP不显示Linux挂载文件夹的方案 - 河东软件园...
  2. 一文教你使用java开发一款推箱子游戏
  3. line-height 属性
  4. 开发辅助 | 阿里图标库iconfont入门使用
  5. redis 学习(18)-- AOF
  6. OO第二单元作业总结
  7. Vue中浏览器的的前进和后退
  8. 使用镜像源安装EASY_INSTALL和PIP教程
  9. SEO 百度后台主动推送链接
  10. Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解...