单片机/嵌入式软件架构分层思想
以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 为 ...
- SoC嵌入式软件架构设计
内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...
- SoC嵌入式软件架构设计之中的一个:系统内存需求评估
内存是SoC(System on Chip,片上系统)集成设计的重要模块.是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必需要在成本和效率中取得平衡,做到 ...
- 嵌入式软件架构的六个步骤(二)软件基础设施
软件架构这东西,众说纷纭,各有观点.在我看来,软件架构是软件系统的基本结构,包含其组件.组件之间的关系.组件设计与演进的规则,以及体现这些规则的基础设施.软件架构,从来不是一件容易事,它贯穿在产品的整 ...
- 【C/C++开源库】适合单片机/嵌入式的C语言单元测试库
文章目录 一.为什么需要单元测试? 二.单片机/嵌入式中为什么很少听说单元测试? 三.Unity 什么是Unity 如何使用Unity 剖析Unity 四.单元测试究竟是什么?什么是适合单元测试的代码 ...
- 论分层思想在各行各业的应用
On hierarchy. 论分层思想在各行各业的应用 查了下hierarchy这个词的含义.首先是等级制度, 特权阶级,然后是阶层,最后是层次,层级. 在中文中,有三种看似感情色彩不同的含义,而英 ...
- 面向对象写单片机程序-程序分层
面向对象写单片机程序-程序分层 管理层 typedef struct InputDevice {char *name;int (*GetInputEvent)(PInputEvent ptInputE ...
最新文章
- PNAS前沿:迈向作为多层学习的进化理论
- Hadoop大数据——shuffle详解
- C# Stream 和 byte[] 之间的转换(文件流的应用)
- 程序员的职业病(职业素养)之一:动手写业务代码之前先考虑异常处理
- goldengate mysql_使用GoldenGate实现MySQL到Oracle的数据实时同步
- 自适应均衡器 matlab程序,基于lms自适应均衡器matlab仿真
- Node.js: 如何退出node命令或者node server
- sql server 高可用故障转移(6)
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一)
- 编程哲学之C#篇:02——学习思维
- BZOJ2795: [Poi2012]A Horrible Poem
- brew更新的时候不更新某个应用_可以不可以第六集剧情介绍,日剧可以不可以什么时候更新...
- WinServer2003秘笈放送
- 苹果7系统更新12无服务器,别再为苹果手机无法更新系统犯难,这几种方式帮你解决!...
- cad计算机绘图实操视频,cad工程制图教程视频
- 熊猫烟花集团完美见证异速联远程接入系统
- C:\Windows\System32\drivers\etc\hosts文件的作用说明
- 对“主数据”的一点吐槽
- android 符号表情显示乱码,android输入框限制输入法中的表情符号
- HTML5-VScode-常用标签的样式以及复合写法
热门文章
- Linux挂载多个文件夹读不出,FTP不显示Linux挂载文件夹怎么办?-处理FTP不显示Linux挂载文件夹的方案 - 河东软件园...
- 一文教你使用java开发一款推箱子游戏
- line-height 属性
- 开发辅助 | 阿里图标库iconfont入门使用
- redis 学习(18)-- AOF
- OO第二单元作业总结
- Vue中浏览器的的前进和后退
- 使用镜像源安装EASY_INSTALL和PIP教程
- SEO 百度后台主动推送链接
- Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解...