03-单片机商业项目编程,从零搭建低功耗系统设计

一、本文内容

上一节《02-单片机商业项目编程,从零搭建低功耗系统设计-CSDN博客》引出了伪时间片的概念,这也是再低功耗系统设计中必须使用的程序设计逻辑,本文着重来讲解如何利用伪时间片来设计伪多任务,以及伪时间片多任务内核设计构思。

二、伪时间片多任务

像ucos、freeRTOS常在单片机中使用的实时操作系统,他们属于真正的多任务,而对于性能较弱的单片机往往也想有类似的结构,那么我们就把每个任务都划分为不同的时间段去执行。比如有个按键检测的任务,它并不需要1ms来检测依次用户的操作,可能100ms检测一次即可,那我们就可以创建一个100ms周期的任务,来专门做按键检测;当然类似的还有液晶屏幕数据的刷新,可能500ms才需要刷新一次等等。

时间调度要做的事情也很简单,就是不断的看指定时间有没有到,如果时间到了,就以事件的形式向上层传递,上层执行对应的任务,执行结果有必要再以回调的形式反馈给更上层。

三、低功耗伪时间片多任务调度

通过伪时间片多任务的事件调度功能,如果我们不考虑低功耗,那么哪怕是个初学者,这种事件调度的逻辑也能轻而易举的实现吧;如果考虑低功耗,那么问题就变得也没有很复杂,哈哈哈。

首先我们设计一个全局变量g_sys_tick=0,从单片机运行开始,就不断的计数,为了方便讲解,我们暂且认为它可以计数到无限大,不用考虑归零的事情,在0时刻,我们要创建3个事件,实际上就是设置3个比较值,当g_sys_tick达到对应比较值,则触发对应的事件去执行对应的任务。

现在问题来了,g_sys_tick从0~99ms,是谁在给它计数复制,是谁时时刻刻在让if(g_sys_tick==100ms)做比较呢?答案当然就是定时器中断了,而不是让我们的程序去时刻的判断。

1、从0时刻开始,定时器只需要选择最近的时刻做一个100ms定时,进入休眠状态;

2、到了100ms,再创建一个140ms定时(即0时刻的那个240ms任务),但此时又来了一个定时600ms任务,则再100+600=700ms处增加一个标记,进入休眠状态;

3、到了240ms,再创建一个260ms定时(即0时刻的那个500ms任务),进入休眠状态;

4、到了500ms,再创建一个200ms定时(即100ms时刻的那个600ms任务),进入休眠状态;

5、永远这么持续下去,实际上定时器每次只做一次定时,担任到点叫醒单片机的任务,其它时间都在睡大觉。

四、总结

低功耗的任务调度思路就是把本身需要单片机while(1)中时刻判断的定时标记,通过分散在时间条上,逐个定时来实现,从而把空闲的时间让单片机来休眠,达到省电的目的。

相关推荐
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
搬砖的小码农_Sky6 小时前
C语言:数组
c语言·数据结构
ahadee10 小时前
蓝桥杯每日真题 - 第19天
c语言·vscode·算法·蓝桥杯
Theliars10 小时前
C语言之字符串
c语言·开发语言
Reese_Cool10 小时前
【数据结构与算法】排序
java·c语言·开发语言·数据结构·c++·算法·排序算法
lantiandianzi10 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
哔哥哔特商务网11 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式11 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件
搬砖的小码农_Sky11 小时前
C语言:结构体
c语言·数据结构
东芝、铠侠总代1361006839312 小时前
浅谈TLP184小型平面光耦
单片机·嵌入式硬件·物联网·平面