目录
前言
嵌入式系统低功耗管理的目的在于满足用户对性能需求的前提下,尽可能降低系统能耗以延长设备待机时间。高性能与有限的电池能量在嵌入式系统中矛盾最为突出,硬件低功耗设计与软件低功耗管理的联合应用成为解决矛盾的有效手段。-----RTThread 文档中心
背景
由于裸机上面低功耗在逻辑上实现较简单,但面对庞大的操作的系统,需要考虑多个线程之前的逻辑。所以研究RTT之初想到的是解决功耗问题,以下是实现简单的RTThread Nano版 PM组件对低功耗的管理。
移植
IDE: MDK5.28
RTOS内核版本:rtthread 3.1.3 nano版
硬件平台:STM32L051C8
NANO版本移植使用PM组件步骤:
1、文件拷贝
在完整版的rtthread 3.1.3上面拷贝以下文件到一个可以点灯的rtthread nano版工程:
pm.c
pm.h
rtdevice.h
2、宏定义
在rtconfig.h中添加以下定义:
#define RT_USING_DEVICE //设备驱动
#define RT_USING_PM //PM组件
3、添加底层驱动文件
drv_pm.c 附件如下:
该文件实现低功耗具体实现的方法,如stm32芯片进入stop模式,那么在_drv_pm_enter函数中添加实现(由于文件较长,不允许添加附件,故上传至CSDN下载资源,链接:https://download.csdn.net/download/qq_34672688/12234833):
_drv_pm_enter 函数在drv_pm_hw_init被引用
4、OS TICK补偿
如需定时器补偿OS tick , 那么在drv_pm.c文件中实现该驱动。该方法实现的前提是进入对应的低功耗模式后该定时器仍然可用,不会被关闭时钟。如stm32下的LPTIM可用于低功耗模式下的计数或唤醒。第三步附件中实现的驱动并没有实现OStick补偿。
注意:若使用定时器补偿,请打开注释:
timer_mask = 1UL << PM_SLEEP_MODE_TIMER;
// PM_SLEEP_MODE_TIMER:该宏为对应的低功耗模式,若未使用,请置0,未初始化至0调试时发现导致硬中断:tidle
5、调用方法:
static void pm_mode_init(void)
{
rt_pm_release(PM_SLEEP_MODE_NONE);
rt_pm_release(PM_SLEEP_MODE_IDLE);
// rt_pm_request(PM_SLEEP_MODE_DEEP);
}
void task(void)
{
pm_mode_init();
while (1)
{
/* USER CODE END WHILE */
LED_XOR();
static uint8_t count = 0;
char *p = rt_malloc(128);
rt_memcpy(p, "123456\r\n", 8);
rt_kprintf("p:%s\r\n", p);
rt_free(p);
if(count++ >10)
{
rt_kprintf("perpare enter low power\r\n");
rt_pm_request(PM_SLEEP_MODE_DEEP);
count = 0;
}
rt_thread_delay(500);
}
}
实现效果
注意事项
- 根据外围电路,检查设备是否处于合理状态,避免出现外设漏电的情况; 根据产品自身情况,关闭相应休眠模式期间不使用的外设和时钟。
2. 测试时切勿直接开机进入低功耗,否则若板子无复位按键会出现无法烧录的情况。出现该情况,参考文章解决:https://blog.csdn.net/Geekjin/article/details/79232405