以前我一直觉得只有做纯软件的程序员才需要注意程序框架的设计,上了韦东山老师的课之后才觉得做单片机的程序开发注意框架设计也是很必要的事情。要在单片机开发的过程中引入面向对象的思想,这样的代码更容易扩展,可读性更强,将硬件层和应用层分开,降低了代码的耦合性。
以按键点灯程序为例:
void main(void)
{
GPIO_PinState key;
while (1)
{
key = HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_6);
if (key == GPIO_PIN_RESET)
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_SET);
}
}
常规的轮询方法就是如上所示,想要读懂这段代码就要有硬件知识、需要有HAL库知识,才能理解这个程序。无法扩展且代码无法复用。
所以要设计良好的程序框架,做到高内聚低耦合,对程序进行分层设计:将程序分为驱动层、中间层以及应用层。结构如下:

1.驱动层:对硬件进行调用以及封装,对每个按键以及led灯进行封装,实现需要的函数如对按键进行初始化(init_key)以及读取按键的值(read_key),同时为了将每个按键都区分开,采用结构体实现每个按键的函数,通过函数指针的方式,将每个按键都封装在一个结构体内,这样便于对程序的管理,同时做到了模块化的设计理念。驱动层的主要任务就是构造一个个结构体,实现该部分的函数。结构体如下所示
typedef struct key {
char *name;
void (*init)(struct key *k);
int (*read)(struct key *k);
}key, *p_key;

2.中间层:如何管理驱动层的代码呢?就需要中间层来实现。在中间层构造一个结构体数组或链表,将驱动层构造好的结构体注册进中间层,应用层调用中间层构造好的数组。
3.应用层:应用层即最终实现函数功能的部分,在应用层的代码中不应看到具体的驱动层的函数细节,只需要调用中间层以注册的结构体,实现相应的功能。
通过对程序框架的学习,也能更好的理解Linux程序的设计思想,在平常的学习中,也要多注意使用面向对象的设计思想实现单片机的程序开发,写出低耦合,易于扩展的代码对于未来进入公司也是很有帮助的。

百问网七天物联网课程学习笔记——程序框架设计相关推荐

  1. 百问网--七天物联网课程学习笔记(4)

    FreeRTOS源码下载(官方网址:www.freertos.org) 用户手册下载: 移植步骤 1.将"FreeRTOS-LTS\FreeRTOS\FreeRTOS-Kernel" ...

  2. 百问网七天物联网课程学习笔记——单片机时钟

    学习了百问网的智能家居实战训练营之后,对单片机的时钟树又有了更深刻的了解. 在现代的计算机操作系统中必定有一个时钟,在stm32f103系列的单片机中,时钟源有内部时钟源和外部时钟源之分,外部时钟源采 ...

  3. 百问网七天物联网课程学习笔记——单片机中断的使用

    学习了百问网的智能家居实战训练营之后,对单片机的中断又有了更深刻的了解. 中断,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中断(中止)当前程序的执行,而转去为事件服务,待服 ...

  4. 百问网七天物联网课程学习笔记——单片机开发模式

    单片机有几种不同的开发模式,即:寄存器开发.C语言裸机开发以及使用实时操作系统进行. 1.使用寄存器开发单片机程序,分为使用汇编指令操作寄存器以及使用C语言操作寄存器两种.该方法有着无与伦比的效率提升 ...

  5. 百问网--七天物联网课程学习笔记(7)

    问题1:在写WIFI模块测试程序的时候,发AT命令没反应 原因分析:使用串口输出信息,命令发送是没有问题的,命令接收也是没有问题的,使用上位机发送命令就有反应,单片机发送命令WIFI模块就是不理睬.然 ...

  6. 百问网七天物联网课程学习笔记——嵌入式

    首先谈谈什么是嵌入式,官方的定义是这样的:嵌入式系统是以应用为中心,以现代计算机技术为基础,能够根据用户需求(功能.可靠性.成本.体积.功耗.环境等)灵活裁剪软硬件模块的专用计算机系统.在我看来,嵌入 ...

  7. 百问网七天物联网课程课后笔记(第五天提高课)

    基础概念QOS0:最多发一次 QOS1:至少发一次 QOS2:只发一次 MQTT的客户端: 一个使用MQTT协议的应用程序或者设备,总是建立到服务器的网络连接 发布其他客户端可能会订阅的消息 订阅其他 ...

  8. 百问网七天物联网课程笔记(第七天)

    在第七天的课程中,分别使用单任务和多任务展示了基于stm32的mqtt通信控制led灯的操作.以下是之前我不会但是通过课程了解,觉得有比较记录的内容. 如何在keil5中,一个启动项对应多个项目? 右 ...

  9. 百问网七天物联网课程(第二天)

    前言 今天的课程基础主要讲了单片机最小系统的构成,内部flash的构成,如何下载st官方资料,如何构建一个项目. 提高部分讲解了程序的需求分析,程序流程图,裸机/RTOS的软件框架. 基础部分 基础部 ...

最新文章

  1. try catch finally
  2. 熊猫多模式站群 模型handlers流程图
  3. 设置cookie存活时间_Cookie的存活时间
  4. mysql常量,变量,循环语句,存储过程,触发器,分隔符
  5. 设计oa系统mysql数据库设计_企业办公自动化OA系统的设计与实现(MyEclipse,MySQL)
  6. 飞思卡尔单片机RAM与flash相关问题
  7. 三面网易,四面阿里,五年开发经验程序员剑指大厂,稳拿P7offer
  8. 开源 cocos2dx 五彩连珠.
  9. Slider网站欣赏
  10. 初恋失败让我学会推销自己
  11. 安装运行太极框架Android搞机操作root
  12. android 全局悬浮按钮,Android自定义APP全局悬浮按钮
  13. onHover(perform:) 悬停(SwiftUI 中文手册文档教程)
  14. 数据库关系代数中除运算讲解和SQL语句的实现
  15. NIOS II 软核中EPCS配置芯片的存储操作
  16. delete和delete[ ]、exit和return
  17. 菜鸟学机器学习,Sklearn库主要模块功能简介
  18. android8.1新建分区并挂载,Android8.1 MTK Vendor分区大小调整无效分析
  19. ARM芯片、内核、架构、指令集的联系与区别
  20. java sql 基础_Java SQL基础

热门文章

  1. 拯救关键业务上线:DBA 的惊魂24小时
  2. 医院挂号预约管理系统 计算机毕设源码69733
  3. 技术哪家强?来认识一下这六位百万美元
  4. 八进制转为二进制算法
  5. C语言,进制转换之八进制转二进制,完整代码
  6. 微博API:获取用户发布的微博
  7. C++ vector构造函数
  8. 盘点23个提高开发效率和美观性的 VSCode 插件
  9. matlab自带滤波器,数字滤波 - MATLAB Simulink - MathWorks 中国
  10. 上证50ETF期权在的开户条件