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

相关推荐
晓蛋4 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
不悔哥4 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
傲世仙尊4 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
牵猫散步的鱼儿4 天前
重载、重写(覆盖)、重定义区别
c语言
phltxy4 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
phltxy4 天前
C 语言中的数据存储:从类型到二进制位
c语言
深圳老胡4 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
女神下凡4 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9664 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片