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

相关推荐
从零开始的嵌入式之旅1 小时前
day32
linux·c语言·经验分享·笔记·嵌入式硬件
集芯微电科技有限公司1 小时前
低压功率MOSFETs选型手册
人工智能·单片机·嵌入式硬件·神经网络·生成对抗网络
一条破秋裤1 小时前
C-数据类型
c语言·开发语言·chrome
xx~t1 小时前
嵌入式学习——进程与线程2
linux·c语言·学习·进程与线程
Messy create2 小时前
【BMS-AFE-分压采样电路】
单片机·能源
z落落2 小时前
C# WinForm NModbus 串口通信+WinForm Modbus4 串口通信
开发语言·单片机·c#
sramdram2 小时前
基于MCU单片机的电推剪控制解决方案
单片机·嵌入式硬件·mcu·mcu单片机
单片机仿真设计3 小时前
【proteus仿真】基于 STM32 超声波传感器自动泊车系统 设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
三佛科技-187366133973 小时前
HN8220A是什么芯片?大功率非隔离电源芯片HN8220A深度解析
单片机·嵌入式硬件
张海森-1688203 小时前
cv610_flash 烧录两个rootfs操作,记录
单片机