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)中时刻判断的定时标记,通过分散在时间条上,逐个定时来实现,从而把空闲的时间让单片机来休眠,达到省电的目的。

相关推荐
MSTcheng.1 小时前
【C语言】动态内存管理
c语言·开发语言·算法
如鱼得水不亦乐乎1 小时前
C Primer Plus 第十章练习
c语言·开发语言
芯岭技术2 小时前
PY32MD320单片机 QFN32封装,内置多功能三相 NN 型预驱。
单片机·嵌入式硬件
威哥爱编程2 小时前
C语言操作MySQL从入门到精通
c语言·数据库·mysql
迷迭所归处2 小时前
C语言 —— 愿文明如薪火般灿烂 - 函数递归
c语言·开发语言·算法
yyytucj2 小时前
C/C++通过SQLiteSDK增删改查
c语言·jvm·c++
柠檬鲨_5 小时前
C语言100天练习题【记录本】
c语言·数据结构·算法
zjoy_223313 小时前
【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分
java·c语言·开发语言·数据结构·c++·算法·排序算法
代码总长两年半13 小时前
STM32---FreeRTOS时间片调度实验
stm32·单片机·嵌入式硬件
A-花开堪折13 小时前
OpenMCU(二):GD32E23xx FreeRTOS移植
单片机·嵌入式硬件