关于RTT对低功耗的支持

发表在 PM2017-7-2 01:12 [复制链接] 5 3085

情况是这样的,由于历史原因,公司的不同产品分别在使用不同的OS平台,我是RTT的忠实FANS,现在手上的一个产品就用RTT在开发,一直向公司和同事推荐使用RTT作为新产品的统一开发平台,这样配合RTT的驱动和工具代码,我们自己编写的代码也会更通用些,而不是拿之前的产品代码来改,改得心好累。。。. |1 E2 U/ S& ~' ?+ G: `
但是同事讲,我们做的是物联网产品,特别要考虑低功耗,像RTX(MDK自带的CMSIS-OS)和FreeRTOS都有低功耗设计的考虑,让我了解一下RTT对于低功耗的管理,我初步看了下,设备驱动那边有个RT_DEVICE_CTRL_RESUME和RT_DEVICE_CTRL_SUSPEND,其他好像就没有对低功耗的支持了。我看FreeRTOS和RTX实现了类似这样的两个接口:获取可以休眠的tick,恢复系统tick,可以在空闲线程中调用。
6 e; Z- j9 q7 X下面这个图是FreeRTOS对低功耗的处理模板:$ X; {+ f% F: G3 Z$ f) [3 `
QQ图片20170702004153.png
; K1 J( I0 ~* I3 v( `5 @, ^使用RTX,我们这样处理低功耗:
  1. void idel_call(void) {
  2.        
  3.         /* 挂起OS, 并返回可以执行低功耗的时长 */
  4.         sleep = osKernelSuspend ();
  5.        
  6.         if (sleep)
  7.         {
  8.                 //设置自动唤醒定时中断和其他唤醒中断
  9.                 //睡眠N个tick(关闭了滴答定时器,可被其他中断事件唤醒)
  10.                 //恢复软硬件信息
  11.         }
  12.        
  13.         /* 恢复调度 */
  14.         osKernelResume (sleep);   
  15. }
复制代码
我又看了看RTT这边,通过下面的代码可以获取剩余延迟时间,但是没有接口恢复tick。
  1. rt_tick_t rt_timer_next_timeout_tick(void)
复制代码
可以考虑在rt_tick_set添加对tick恢复的处理。
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2017-7-2 11:31:14 | 显示全部楼层

关于RTT对低功耗的支持

void rt_tick_set(rt_tick_t tick);* v: n3 H' h+ J" y# P/ y
7 D- v* C" o8 q8 z" |
这个接口有的呀,你用的什么版本?RT-Thread的低功耗代码后面也会给出,忙完一段时间,针对stm32l4吧,因为低功耗组件需要低功耗定时器。
使用道具 举报 回复
发表于 2017-7-2 12:17:38 | 显示全部楼层

关于RTT对低功耗的支持

void rt_tick_set(rt_tick_t tick);$ c0 @* r$ K2 w: M0 a5 P
$ ]7 B5 |5 K3 J: r* c) |$ A
这个接口有的呀,你用的什么版本?RT-Thread的低功耗代码后面也会给出,忙完一段时间,针对stm32l4吧,因为低功耗组件需要低功耗定时器。

* y  ~9 {& @. z. k' Z7 Z0 P我看到代码了
  1. /**
  2. * This function will set current tick
  3. */
  4. void rt_tick_set(rt_tick_t tick)
  5. {
  6.     rt_base_t level;
  7.     level = rt_hw_interrupt_disable();
  8.     rt_tick = tick;
  9.     rt_hw_interrupt_enable(level);
  10. }
复制代码
这里只是简单的设置了tick,是不是还得像rt_tick_increase处理一下和线程相关的资源。
  1. /**
  2. * This function will notify kernel there is one tick passed. Normally,
  3. * this function is invoked by clock ISR.
  4. */
  5. void rt_tick_increase(void)
  6. {
  7.     struct rt_thread *thread;
  8.     /* increase the global tick */
  9.     ++ rt_tick;
  10.     /* check time slice */
  11.     thread = rt_thread_self();
  12.     -- thread->remaining_tick;
  13.     if (thread->remaining_tick == 0)
  14.     {
  15.         /* change to initialized tick */
  16.         thread->remaining_tick = thread->init_tick;
  17.         /* yield */
  18.         rt_thread_yield();
  19.     }
  20.     /* check timer */
  21.     rt_timer_check();
  22. }
复制代码
使用道具 举报 回复
发表于 2017-11-12 19:11:17 | 显示全部楼层

关于RTT对低功耗的支持

听说RTT3.0已经有低功耗框架了,但没有细节信息,有知道的同仁可以支持一下。
使用道具 举报 回复
发表于 2018-1-10 15:25:03 | 显示全部楼层
急需低功耗。但官方总是这个态度,没有任何说明。
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表