单片机裸机程序 —— 设计模式

news2024/10/20 13:28:32

目 录

  • 软件设计模式的用途
  • 一、轮询模式
  • 二、前后台模式
  • 三、时间片模式
  • 四、状态机模式


软件设计模式的用途

专业的程序员不会在知道需求后,马上脑热地去敲代码,然后一边调试一边修复bug。好习惯是把前期工作做好再开始敲键盘,比如选定一个合适的设计模式,画好流程图等,正所谓磨刀不误砍柴工。

软件设计模式的重要性体现在以下几点:

一、提高软件质量

  1. 增强可靠性:设计模式经过了大量实践的检验,遵循设计模式可以使软件结构更加稳定,减少潜在的错误和漏洞。例如,使用单例模式可以确保一个类只有一个实例,避免了多个实例可能导致的资源冲突和数据不一致问题。
  2. 提升可维护性:良好的设计模式使得软件代码更易于理解和修改。当软件需要进行功能扩展或修复 bug 时,开发人员可以更快速地定位问题所在,并进行有效的修改。比如,采用策略模式可以将不同的算法封装在独立的策略类中,当需要更换算法时,只需修改少量的代码,而不会影响到整个系统的结构。

二、提高开发效率

  1. 加速开发过程:开发人员可以直接应用成熟的设计模式,而不必从头开始设计解决方案。这大大节省了开发时间,特别是在面对复杂问题时。例如,在开发一个图形界面应用时,使用观察者模式可以轻松实现界面元素与数据模型的同步更新,无需为每个界面元素单独编写更新逻辑。
  2. 促进团队协作:设计模式提供了一种通用的语言和方法,使得团队成员之间能够更好地沟通和协作。大家对设计模式的理解和应用可以使代码风格更加统一,降低了团队协作的难度。

三、增强软件的可扩展性

  1. 轻松应对变化:随着业务需求的不断变化,软件需要不断进行功能扩展和改进。设计模式使得软件具有更好的扩展性,能够更容易地适应新的需求。例如,使用装饰器模式可以在不修改原有代码的基础上,为对象动态地添加新的功能,满足不断变化的业务需求。
  2. 支持软件的进化:软件在其生命周期中会不断发展和演变,设计模式为软件的进化提供了坚实的基础。通过合理地应用设计模式,可以使软件在面对新的挑战和机遇时,能够更加灵活地进行调整和改进。

四、实现软件的可复用性

  1. 代码复用:设计模式本身就是一种可复用的解决方案,开发人员可以在不同的项目中复用相同的设计模式。这不仅提高了开发效率,还减少了代码的重复编写,降低了出错的可能性。例如,工厂模式可以根据不同的条件创建不同类型的对象,在多个项目中,如果都有创建对象的需求,就可以复用工厂模式的代码。
  2. 设计复用:设计模式所代表的设计思想也可以被复用。开发人员可以借鉴设计模式的理念,应用到新的问题领域中,创造出更加优秀的软件设计。

一、轮询模式

这是一种简单直接的设计模式,从上往下,一步一步来执行,必须等待上一步执行结束才到这步执行。程序不断地循环检查各个输入设备或事件源的状态,当检测到特定条件满足时,执行相应的处理操作。

void main(void)
{
	while(1)//轮询程序
	{
		led();
		key();
		...
	}
}

通常每个裸机程序的主程序都有一个while循环,这个循环的主要作用是什么?

保持程序持续运行

单片机在启动后需要持续执行特定的任务。如果没有 while 循环,主程序在执行完一次后就会结束,无法实现对外部事件的持续监测和响应。例如,在一个温度监测系统中,单片机需要不断读取温度传感器的数据并进行处理。如果没有循环,程序只会读取一次温度值后就停止运行,无法持续监测温度变化。

等待中断事件

在很多情况下,单片机需要等待外部中断事件的发生。while 循环可以让程序处于一种等待状态,直到中断被触发。当中断发生时,单片机将暂停当前的主程序执行,转而去处理中断服务程序。处理完中断后,又会回到主程序的 while 循环继续等待下一个中断。例如,当有按键按下时产生中断,单片机可以在中断服务程序中进行相应的处理,如改变某个输出状态或执行特定的操作。

实现周期性任务

通过在 while 循环中设置适当的延迟或定时器,可以实现周期性的任务执行。例如,每隔一定时间发送一次数据、刷新显示屏或者进行传感器数据采集等。这样可以确保系统按照预定的时间间隔进行操作,保证系统的稳定性和可靠性。

便于程序调试和扩展

有了 while 循环,程序的执行流程更加清晰,便于调试和修改。开发人员可以在循环中设置断点,逐步跟踪程序的执行过程,找出问题所在。同时,在需要添加新功能时,可以方便地在 while 循环中插入相应的代码,而不会对整个程序的结构造成太大的影响。

轮询模式的优缺点:

优点 —— 实现简单,容易理解和调试。
缺点 —— 效率较低,当需要处理多个事件时,可能会因为频繁的循环检查而浪费 CPU 资源。还有如果某一步执行耗时长,其它步执行周期得不到保证。


二、前后台模式

单片机可以响应外部中断请求。当特定的外部事件发生时,如定时器溢出、按键按下等,会触发中断,那么优先去中断服务程序执行相应的处理。这种模式可以及时响应外部事件,提高系统的实时性。

void main()
{
    while (1)
    {
        // 后台程序
        led();
    }
}
 
// 前台程序
void 按键_中断()
{
    key();
}

中断模式的优缺点:

优点 —— 能够快速响应紧急事件,不占用 CPU 资源在等待事件发生上。
缺点 —— 中断处理程序需要尽量简洁,否则可能会影响系统的稳定性。比如,中断程序要是执行过长,将会导致迟迟离不开中断,并且要是创建多个中断还会出现抢占优先级的情况。


三、时间片模式

时间片模式采用定时器驱动,是前后台模式的一种,可以按照不用的频率执行各种任务函数。

void main()
{
    while (1)
    {
        // 后台程序
    }
}
 
// 前台程序: 每1秒触发一次中断
void 定时器_中断()
{
    static int cnt = 0;
    cnt++;
    if (cnt % 2 == 0)
    {
        led();
    }
    else if (cnt % 5 == 0)
    {
        beep();
    }
}

时间片模式的优缺点:

优点 —— 比较适用于严格调用周期性的函数,并且每一个函数执行的时间不能超过一个定时器周期。
缺点 —— 函数之间互相影响,比如周期性函数执行时间长影响另一个周期性函数的执行。


四、状态机模式

将系统或功能模块的运行状态抽象为不同的状态,根据不同的输入和当前状态进行状态转移,并执行相应的操作。例如,一个简单的流水灯控制系统可以分为不同的状态,如灯亮、灯灭、闪烁等,根据按键输入或定时器事件进行状态转移。

typedef enum {
    OFF_STATE,
    ON_STATE
} LightState;

void controlLight(bool buttonPressed) {
    static LightState state = OFF_STATE;
    switch (state) {
        case OFF_STATE:
            if (buttonPressed) {
                state = ON_STATE;
                // 打开灯的操作
            }
            break;
        case ON_STATE:
            if (buttonPressed) {
                state = OFF_STATE;
                // 关闭灯的操作
            }
            break;
    }
}

状态机模式的优缺点:

优点 —— 结构清晰,易于理解和维护,特别适合处理复杂的逻辑流程。
缺点 —— 对于状态较多的系统,状态转移图可能会变得复杂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解锁文本数据可视化的无限可能:Wordcloud库全解析

文章目录 **🌟解锁文本数据可视化的无限可能:Wordcloud库全解析🔐**1. **背景介绍**2. **Wordcloud库是什么?**3. **如何安装Wordcloud库?**4. **Wordcloud库的基本函数使用方法**5. **实际应用场景**6. **常见问题及解…

VUE 仿神州租车-开放平台

项目背景: 神州租车是一家提供汽车租赁服务的公司,其API开放平台为开发者提供了访问神州租车相关服务和数据的接口。用VUE技术来仿照其开发平台。 成果展示: 首页: API文档: 关于我们:

MyBatis实践:提高持久层数据处理效率

文章目录 1 Mybatis简介1.1 简介1.2 持久层框架对比 2 快速入门2.1 准备数据库2.2 项目搭建2.3 依赖导入2.4 准备MyBatis配置文件2.5 实体类准备2.6 准备Mapper接口和MapperXML文件2.7 运行和测试 3. 核心配置文件4. MyBatis进阶使用4.0 以包为单位,引入所有的映射文…

算法Day-4

24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,…

Windows10去掉隐藏文件仍找不到hosts文件的解决办法

正常情况下hosts文件在目录C:\Windows\System32\drivers\etc中,最近新装的Windows10系统发现该目录下没有hosts文件。 执行如下命令hosts文件出现: 执行 for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\drivers\etc &am…

ubuntu 20.04 网卡启用后,只有ipv6 没有 ipv4 无法上网

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…

JS | JS之深入理解客户区尺寸client系列属性

目录 一、客户区大小 clientHeight clientWidth clientLeft clientTop 二、页面大小 三、注意事项 关于元素尺寸,一般地,有偏移大小offset、客户区大小client和滚动大小scroll。前文已经介绍过偏移属性,后文将介绍scroll滚动大小&…

责任链模式下,解决开闭原则问题实践

前言 在现代软件工程中,设计模式是解决常见问题的有效工具之一。它们吸收了前人的经验,不仅帮助开发者编写更清晰、更可维护的代码,还能促进团队之间的沟通和协作。责任链模式(Chain of Responsibility Pattern)作为一…

C语言 | Leetcode C语言题解之第485题最大连续1的个数

题目&#xff1a; 题解&#xff1a; int findMaxConsecutiveOnes(int* nums, int numsSize) {int maxCount 0, count 0;for (int i 0; i < numsSize; i) {if (nums[i] 1) {count;} else {maxCount fmax(maxCount, count);count 0;}}maxCount fmax(maxCount, count);…

最近网站频繁跳转到黑产网站,怀疑是51.la统计代码的问题

最近我的几个网站&#xff0c;都出现了一个问题&#xff0c;就是访问的时候会莫名其妙的跳转到黑产网站。 通过排查了网页代码&#xff0c;发现网页都有一个共同点&#xff0c;就是使用了51.la统计。为什么会怀疑是51la统计代码问题&#xff1f;因为我的网页只有统计代码外没有…

Vulnhub打靶-jangow

基本信息 靶机下载&#xff1a;https://www.vulnhub.com/entry/jangow-101,754/ 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09;& 192.168.20.138&#xff08;kali&#xff09; 提示信息&#xff1a;这个框的秘密是枚举&#xff01; 靶机…

汽车票预订系统:SpringBoot框架的优势

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

软考(网工)——网络安全

文章目录 &#x1f550;网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552;Hash …

证件照小程序源码,前后端稳定运行

演示&#xff1a;证寸照制作 运行环境: Linux Nginx PHP >5.6 MySQL>5.6 安装步骤: 1.下载源码上传至你的服务器宝塔面板 2.直接添加站点选择源码目录&#xff0c;新建数据库 3.设置代码执行目录为/web 4.在浏览器中输入你的域名&#xff0c;会提示安装&#xff0c;填写…

Flink消费Kafka实时写入Doris

本文模拟实际生产环境&#xff0c;通过FileBeat采集日志信息到Kafka&#xff0c;再通过Flink消费Kafka实时写入Doris。 文章目录 Filebeat采集日志到KafkaFlink消费Kafka实时写入Doris总结 Filebeat采集日志到Kafka 常见的日志采集工具有以下几种&#xff1a;Flume、Logstash和…

自动机器学习(AutoML)

utoML是PAI的提供的自动寻找超参组合的机器学习增强型服务。您在训练模型时&#xff0c;如果超参组合复杂度过高&#xff0c;需大量训练资源和手工调试工作&#xff0c;可以使用AutoML来节省模型调参时间&#xff0c;提升模型调优效率和模型质量。 基础概念 超参数&#xff1a;…

Spring 获取URL中的参数

PathVariable 获取多个变量参数重命名 获取 URL 中的 Id&#xff0c;可以根据 Id 到数据库中筛选相应的内容 Id 的类型是可以定义的&#xff0c;这里定义为 Integer 类型 并且在 RequestMapping中需要定义路径 {articleId} PathVariable 从路径中获取 变量 获取多个变量 参数…

【软件运行类文档】项目试运行方案,试运行计划书(word原件)

一、 试运行目的 &#xff08;一&#xff09; 系统功能、性能与稳定性考核 &#xff08;二&#xff09; 系统在各种环境和工况条件下的工作稳定性和可靠性 &#xff08;三&#xff09; 检验系统实际应用效果和应用功能的完善 &#xff08;四&#xff09; 健全系统运行管理体制&…

jmeter发送post请求

在jmeter中&#xff0c;有两种常用的请求方式&#xff0c;get和post.它们两者的区别在于get请求的参数一般是放在路径中&#xff0c;可以使用用户自定义变量和函数助手等方式进行参数化&#xff0c;而post请求的参数不能随url发送&#xff0c;而是作为请求体提交给服务器。而在…

打开游戏提示丢失(或找不到)XINPUT1_3.DLL的多种解决办法

xinput1_3.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它在Windows操作系统中扮演着重要的角色。该文件作为系统库文件&#xff0c;通常存放于C:\Windows\System32目录下&#xff08;对于32位系统&#xff09;或C:\Windows\SysWOW64目录下&#xff08;对于…