STM32使用UCOSII支持低功耗模式
在不在系统的裸奔的软件中,使用RTC+STOP模式很容易实现低功耗模式,但是在UCOS之类的操作系统,实现这一模式就有点麻烦,最大的问题是任务切换是无法控制的,经常出现唤醒之后程序跑飞的情况。
首先,要把休眠的代码段放在低优先级任务中,不一定是系统自带的空闲任务,也可以是用户自定义的最低优先级的任务。
其次,在休眠代码的前后加上两个指令:
//===================================================================================
OSSchedLock(); //禁止任务调度
while(1)
{
.....//休眠代码RTC+STOP
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
....//判断是否退出休眠
}
....//重新初始化系统时钟及GPIO
....//OS_CPU_SysTickInit();//systick重新初始化 非常重要的,否则跑飞
OSSchedUnlock();//允许任务调度
//===================================================================================
其实只需要增加一下两个指令就可以解决任务切换问题。
做低功耗是可以做到从中断中唤醒的,外中断ISR,按照正常的ISR处理。在UCOS的任务里直接停机。在中断ISR里,响应中断唤醒后,向停机的任务发一个消息出来。
我测试了下,能正常工作啊,ucos也可以恢复啊 |
真要完全睡眠,在自己线程中关其他所有中断,只开一个唤醒中断并设置为最高优先级。唤醒ISR中RCC_Configuration(),再开OS等中断后返回。
ucos-ii从低功耗模式退出的一个普遍问题,唤醒后没能正确运行程序,系统时间SysTick引起的,重新初始化一下的UCOS Tick就可以。
上一篇: STM32 低功耗
下一篇: Android 天地图定位
推荐阅读
-
Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号
-
STM32的3种低功耗模式
-
STM32低功耗,停机模式,IAP
-
STM32使用UCOSII支持低功耗模式
-
stm32的低功耗模式
-
ESP8266学习笔记之:使用AT命令操作ESP8266的低功耗模式
-
STM32单片机基础06——使用USART发送和接收数据(查询模式)
-
STM32单片机基础07——使用USART发送和接收数据(中断模式)
-
STM32单片机基础08——使用USART发送和接收数据(DMA模式)
-
Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号