裸机单片机适用的软件架构

单片机通常分为三种工作模式,分别是

1、前后台顺序执行法                        2、操作系统                         3、时间片轮询法              

1、前后台顺序执行法

        利用单片机的中断进行前后台切换,然后进行任务顺序执行,但其实在很多时候都是处于一种浪费资源的使用,因为大部分时候都要去查看事件是否发生,并且其实时性低,由于每个函数或多或少存在毫秒级别的延时,即使是1ms,也会造成其他函数间隔执行时间的不同,虽然可通过定时器中断的方式,但是前提是中断执行函数花的时间必须短。当程序逻辑复杂度提升时,会导致后来维护人员的大脑混乱,很难理清楚该程序的运行状态。

其也就是大轮训进行执行while里面的函数

2、操作系统

        嵌入式操作系统EOS(Embedded OperatingSystem)是一种用途广泛的系统软件,过去它主要应用于工业控制和国防系统领域,而对于单片机来说,比较常用的有UCOS、FreeRTOS、RT-Thread Nano和RTX 等多种抢占式操作系统(其他如Linux等操作系统不适用于单片机)

        操作系统和“时间片轮询法”,在任务执行方面来说,操作系统对每个任务的耗时没有过多的要求,需要通过设置每个任务的优先级,在高优先级的任务就绪时,会抢占低优先级的任务;操作系统相对复杂,因此这里没有详细介绍了。

3、时间片轮询法 

      时间片轮询法是介于前后台顺序执行法和操作系统之间的一种程序架构设计方案。任务函数无需时刻执行,存在间隔时间(比如按键,一般情况下,都需要软件防抖,初学者的做法通常是延时10ms左右再去判断,但10ms极大浪费了CPU的资源,在这段时间内CPU完全可以处理很多其他事情)。

        该设计方案需要使用一个定时器,一般情况下定时1ms即可(定时时间可随意定,但中断过于频繁效率就低,中断太长,实时性差),因此需要考虑到每个任务函数的执行时间,建议不能超过1ms(能通过程序优化缩短执行时间则最好优化,如果不能优化的,则必须保证该任务的执行周期必须远大于任务所执行的耗时时间),同时要求主循环或任务函数中不能存在毫秒级别的延时。

时间片轮询法的实现(指针方式)

首先定义一个结构体,用于存储一个任务的所有信息,如下所示:

typedef struct
{uint8_t  u8_runflag;		/*程序是否运行标志    TASK_OFF_RUN:不运行   TASK_ON_RUN:运行*/uint16_t u16_timer;			/*计时器*/uint16_t u16_itvTime;		/*运行间隔时间,也就是多久运行一次*/void (*p_TaskHook)(void);	/*任务*/
}Task_InfoType;

然后创建一个具有绑定关系的任务数组:

static Task_InfoType Task_Info[TASK_MAX] = {{TASK_OFF_RUN,TASK_200ms,TASK_200ms,logic_task},//逻辑任务{TASK_OFF_RUN,TASK_1000ms,TASK_1000ms,led_task}	//LED任务
};

        从上图中可以看出,这里创建了两个任务,一个逻辑任务200ms执行一次,另外一个则是1000ms执行一次的LED任务,根据任务的情况,可以自己添加自己需要的。

        有了关系之后,那么就需要让这个小系统跑起来了,下面两个函数分别是函数标志位修改函数和函数执行函数。其实这个小系统也就是一个计时,到时间,则打开标志位,去执行对应的函数,标志位没有打开则跳过。

/*任务标志处理函数定时器1ms中断处理
*/
void Task_Remarks(void)
{for(int i=0;i<TASK_MAX;i++){if(Task_Info[i].u16_timer){Task_Info[i].u16_timer--;if(TASK_TIME_ON == Task_Info[i].u16_timer){//定时器计数到后,打开函数运行标志位Task_Info[i].u16_timer = Task_Info[i].u16_itvTime;Task_Info[i].u8_runflag = TASK_ON_RUN;}}}
}
/*任务函数运行处理放入主函数的循环中
*/
void Task_Process(void)
{for(int i=0;i<TASK_MAX;i++){if(Task_Info[i].u8_runflag == TASK_ON_RUN){Task_Info[i].p_TaskHook();Task_Info[i].u8_runflag = TASK_OFF_RUN;}}
}

弄完这些后,只需要去配置一个1ms定时器,将计时函数放入其中,即可

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *hitm)
{if(hitm->Instance == TIM7){Task_Remarks();}
}

到这里,这个小系统就完成了一大半了,在这里还需要添加一个打印函数,但是如何做到控制这个打印函数,只需要改变宏定义就可以实现关闭所以的打印呢,在实际的项目中,都会使用这种方式来进行系统的调试。

宏定义控制printf-CSDN博客

STM32关于UART的接收方式_stm32中huart1-CSDN博客

关于STM32CubeIDE使用printf串口打印_stm32cubeide printf-CSDN博客

这些都是跟调试有关的一些文章,可以查看。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【产品】Axure入门

Axure入门 一、Axure概述1.1 简介1.2 优点1.3 安装1.4 汉化 二、Axure的使用2.1 菜单栏2.1.1 菜单栏-文件2.1.2 菜单栏-视图 2.2 发布2.2.1 预览2.2.2 生成html代码 一、Axure概述 1.1 简介 Axure是一款专业的快速原型设计工具&#xff0c;全名为RP Axure。它是美国Axure Sof…

TypeScript 常用高级类型

目录 前言&#xff1a; TypeScript 常用高级类型 基本概念 高级类型 1. 交叉类型&#xff08;Intersection Types&#xff09; 2. 联合类型&#xff08;Union Types&#xff09; 3. 映射类型&#xff08;Mapped Types&#xff09; 4. 条件类型&#xff08;Conditional…

【51单片机系列】文字取模软件使用

软件链接&#xff1a;https://pan.baidu.com/s/1k-ND9vJReW_KHMWx8uwpcQ?pwdgz8w 提取码&#xff1a;gz8w 双击打开软件&#xff0c;选择【基本操作】->【新建图像】&#xff0c;设置图像的宽度和高度为8。点击确定后将在显示窗口出现一个8x8的白色格子&#xff0c;类似于…

简单的 u-popup 弹出框

uniapp中的popup组件可以用于弹出简单的提示框、操作框、菜单等。它可以通过position属性控制弹出框的位置&#xff0c;不同的position值会使得弹出框呈现不同的弹出形式 目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 …

python:五种算法(HHO、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、五种算法简介 1、哈里斯鹰优化算法HHO 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、粒子群优化算法PSO 5、遗传算法GA 二、5种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolutionary programming …

宝塔PostgreSQL设置数据库远程访问

宝塔PostgreSQL设置数据库远程访问 宝塔的PostgreSQL1. 添加数据库2. 打开PostgreSQL设置界面3. 修改配置4. 重载配置/重启数据库 Docker的PostgreSQL1. postgresql.conf2. pg_hba.conf3. 重启数据库 注意其他问题 宝塔PostgreSQL设置数据库远程访问&#xff1f;docker容器Post…

解决夜神模拟器与Android studio自动断开的问题

原因&#xff1a;夜神模拟器的adb版本和Android sdk的adb版本不一致 解决办法&#xff1a; 1.找到android的sdk &#xff08;1&#xff09;File--->Project Structure (2)SDK Location:记下sdk的位置 2.找到sdk中的adb文件 SDK-->platform-tools-->adb.exe 3.复制…

AttributeError: module ‘scrapy‘ has no attribute ‘Filed‘

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

IDEA 2023.3 start failed 启动失败修复

发现是 RestfulToolkit 插件有冲突导致的&#xff0c;删除插件后成功启动 open ~/Library/Application\ Support/JetBrains/IntelliJIdea2023.3/plugins参考&#xff1a;https://youtrack.jetbrains.com/issue/IDEA-340080/Critical-startup-error-after-upgrading-to-Intelli…

产品<Axure的安装以及组件介绍

Axure介绍&#xff1a; Axure是一款用户体验设计工具&#xff0c;可以用于创建交互式原型、线框图和设计文档。它支持快速原型开发、界面设计、信息架构、流程图和注释等功能&#xff0c;可以帮助设计师快速地创建和共享交互式原型&#xff0c;从而更好地与客户和团队协作。 …

FastAPI之表单数据

FastAPI 表单数据处理教程 FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;它用 Python 3.6类型提示的特性旨在方便和快速地设计和构建 APIs&#xff0c;并且减少代码的冗余与错误。下面将介绍如何在 FastAPI 中处理…

紧固件的标准有哪些

紧固件的行业标准 紧固件是一个涉及几乎所有结构、机械和人们日常使用的产品的稳定性、安全性和结构完整性的广泛话题。紧固件作为一种功能强大、高效的机械设备&#xff0c;其功能和特性的规格多种多样&#xff0c;根本无法低估。由于紧固件是工程和机械的支柱&#xff0c;因此…