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

news2024/11/20 0:45:57

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

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.coloradmin.cn/o/1302309.html

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

相关文章

windows错误事件 98、41、7000、55、153解决办法

事件错误&#xff1a;98、55、153 疑难解答清单 在系统事件日志中&#xff0c;搜索新技术文件系统 (NTFS) 和磁盘相关的警告和错误。 例如&#xff0c;事件 ID 55、153 或 98。 管理员身份打开CMD&#xff0c;运行命令 chkdsk /scan 并检查结果。 该 chkdsk /scan 命令是只读…

SpringMVC项目出现404

目录 问题讲解&#xff1a; 解决方案&#xff1a; 1、处理器映射器和处理器适配器以及视图解析器没有配置好 2、Controller的包扫描没有加或者包扫描的配置是错误的 3、当然也有说jar包没有 4、请求地址是错误的 5、还有一种解决办法说web.xml配置DispatcherServlet的时…

有病但合理的 ChatGPT 提示语

ChatGPT 面世一年多了&#xff0c;如何让大模型输出高质量内容&#xff0c;让提示词工程成了一门重要的学科。以下是一些有病但合理的提示词技巧&#xff0c;大部分经过论文证明&#xff0c;有效提高 ChatGPT 输出质量&#xff1a; ​1️⃣ Take a deep breath. 深呼吸 ✨ 作用…

直流电和交流电

直流电&#xff08;Direct Current&#xff0c;简称DC&#xff09;和交流电&#xff08;Alternating Current&#xff0c;简称AC&#xff09;是电流的两种基本形式。 1. 直流电 直流电是指电流方向始终保持不变的电流。在直流电中&#xff0c;电子只能沿着一个方向移动。直流电…

力扣17. 电话号码的字母组合(java 回溯法)

Problem: 17. 电话号码的字母组合 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 题目给定一串数字&#xff0c;要求我们找出所有可能的字母组合&#xff0c;即我们可以穷举出所有可能的结果&#xff0c;而涉及到穷举我们自然可以想到利用回溯来解决问题&#xff0c…

Win10操作系统安装Python

1 Python解释器下载 1.1 安装环境 Windows 10 专业工作站版22H2 python-3.9.6-amd64.exe 1.2 下载地址 Python官网&#xff1a;Welcome to Python.org Python镜像&#xff1a;CNPM Binaries Mirror 2 Python解释器安装 2.1 Install Python 3.9.6 (64-bit)界面 双击运行下…

1个电子书模板网站!分分钟制作出精美电子书

随着互联网的发展&#xff0c;电子书已经成为了越来越多人的选择。想要制作一本精美的电子书&#xff0c;却苦于没有专业的技能和工具&#xff1f;别担心&#xff0c;小编向大家推荐一个电子书模板网站&#xff0c;让你分分钟制作出精美电子书&#xff01; 这个网站叫做[FLBOOK…

.net 安装Postgresql驱动程序ngpsql

.net 安装Postgresql驱动程序ngpsql 最近搞一个物联网项目&#xff0c;需要采集fanuc数控机床的数据&#xff0c;厂家提供的API只支持windows&#xff0c;所以就决定C#开发&#xff0c;数据库用postgresql&#xff0c; 安装数据库驱动一波三折。 作为一个讨厌微软的老程序猿&…

宝塔面板部署Apache服务器搭建本地站点发布到公网可访问【内网穿透】

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…

CTF比赛中web安全题型讲解

在CTF&#xff08;Capture The Flag&#xff09;竞赛中&#xff0c;Web安全题目是测试参赛者对Web应用漏洞利用和防御能力的重要环节。以下是30道Web类题型及其标准答案&#xff0c;对初次打比赛的网安人员来说&#xff0c;还是有一些帮助的&#xff0c;喜欢可以收藏。 题目及…

六级高频词组1

目录 词组 参考链接 词组 1. abide by&#xff08;be faithful to &#xff1b;obey&#xff09;忠于&#xff1b;遵守。 2. be absent from… 缺席&#xff0c;不在 3. absence or mind&#xff08;being absent-minded&#xff09; 心不在焉 4. absorb&#xff08;take …

POJ - 2528 Mayor‘s posters

本题注意离散化的时候可能会出现区间串联情况&#xff0c;比如 [1,10] [5,10] [1,4] 和 [1,10] [6,10] [1,4] 直接离散化的话两者一样&#xff0c;但是实际上是不一样的 解决办法是你在相邻的差不是1的数对中再插一个数就好了 离线区间染色 查询根节点 #include<iostrea…

LeetCode力扣每日一题(Java):21、合并两个有序链表

一、题目 二、解题思路 1、我的思路 两个有序链表的合并已经是老生常谈的话题了&#xff0c;大家肯定并不陌生 依次比较两链表结点的值&#xff0c;将值小的添加到新链表的末尾&#xff0c;并将指针后移&#xff08;因为之前学C语言说说惯了指针&#xff0c;不知道在java中…

【Android开发-25】Android中多线程编程用法介绍

1&#xff0c;线程基本用法 在Android中&#xff0c;线程的使用主要有两种方法&#xff1a;一种是扩展java.lang.Thread类&#xff0c;另一种是实现Runnable接口。 1.1以下是一个简单的Android线程继承Thread的用法示例&#xff1a; public class MyThread extends Thread {…

ffmpeg过滤器filter理论与实战

文章目录 前言一、DirectShow1、简介2、程序基本结构3、架构 二、过滤器1、视频过滤器 -vf2、音频过滤器 -af3、过滤器链&#xff08;Filterchain&#xff09;4、过滤器图&#xff08;Filtergraph&#xff09;①、基本语法②、Filtergraph 的分类 5、结构体间的关系图 三、过滤…

手动搭建Magento电商网站

Magento是一个用PHP编写的开源电子商务平台。它的架构是可扩展和模块化的&#xff0c;使其成为构建大中型网站的绝佳选择。Magento支持从5.6到7.1的PHP版本&#xff0c;并利用MySQL数据库进行数据存储。本文将为您介绍如何在CentOS 7操作系统的ECS实例上搭建Magento电商网站。 …

如何优雅使用 vue-html2pdf 插件生成pdf报表

使用 vue-html2pdf 插件 业务背景&#xff0c;老板想要一份能征服客户的pdf报表&#xff0c;传统的pdf要手撕&#xff0c;企业中确实有点耗费时间&#xff0c;于是github上面看到开源的这个插件就…废话不多说&#xff0c;直接上教程 1.使用下面命令安装 vue-html2pdf npm i…

牛客算法心得——买卖股票的最好时机三(dp)

大家好&#xff0c;我是晴天学长&#xff0c; 一个找状态的经典题&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .买卖股票的最好时机&#xff08;三&#xff09; 假设你有一个数组prices&#xff0c;…

【深度学习】AlexNet网络实现猫狗分类

【深度学习】AlexNet网络实现猫狗分类 AlexNet简介 AlexNet是一种卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;模型&#xff0c;它在2012年的ImageNet图像分类挑战赛中取得了重大突破&#xff0c;引发了深度学习在计算机视觉领域的热潮…

【C知道】帮我答疑解惑:java的entity字段是map,如何映射到数据库

目录 一、问题场景描述 二、跟【C知道】第一次沟通 &#xff08;1&#xff09;我问 &#xff08;2&#xff09;他答 &#xff08;3&#xff09;我说 三、跟【C知道】第二次沟通 &#xff08;1&#xff09;我问 &#xff08;2&#xff09;他答 &#xff08;3&#xff0…