2926|0

252

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【RT-Thread读书笔记】之三 定时器 [复制链接]

  本帖最后由 qi777ji 于 2019-4-25 12:53 编辑

   用阻塞延时的方法实现线程缺点很明显,每个循环周期都要扫描所有线程,费时效率低。RT-Thread提供了更合理的选择,每个线程都内置一个定时器,使用时先将线程挂起,之后内置定时器启动并将定时器插入到全局的系统定时器列表rt_timer_list,它维护着一条双向链表,每个节点表示正在延时的定时器,节点按照延时大小升序排列,由SysTick中断来控制扫描系统定时器列表判断时间是否到了。如果排在第一个定时器时间没到,那么它之后的一定也没到(节点按照延时大小升序排列的),如果时间到了就让对应的线程就绪,这种方法大大缩短了寻找延时到期线程的时间。
1.系统定时器在timer.c中,需要添加到工程的srtt/source组中
/* hard timer list */
static rt_list_t rt_timer_list[RT_TIMER_SKIP_LIST_LEVEL];

2.系统定时器列表初始化由函数void rt_system_timer_init(void)完成,在timer.c中。
3.定时器统一由一个定时器结构体struct在rtdef.h里来定义。
/*** timer structure*/
struct rt_timer
{
    struct rt_object parent;                            /**< inherit from rt_object */
    rt_list_t        row[RT_TIMER_SKIP_LIST_LEVEL];
。。。。。
};
typedef struct rt_timer *rt_timer_t;

4.另外每个线程都会内置一个定时器,就是在线程控制块中添加一个定时器成员。
/*** Thread structure*/
struct rt_thread
{。。。

struct rt_timer thread_timer;                       /**< built-in thread timer */
。。。。
};
typedef struct rt_thread *rt_thread_t;5.定时器初始化由函数void rt_timer_init(rt_timer_t timer。。。)完成,在timer.c中。
6.与定时器相关的还有函数rt_timer_control()用于设置不同的初始值和状态,timer.c中。
rt_err_t rt_timer_control(rt_timer_t timer, rt_uint8_t cmd, void *arg)
{
    /* timer check */
    RT_ASSERT(timer != RT_NULL);


    switch (cmd)
    {
    case RT_TIMER_CTRL_GET_TIME:
        *(rt_tick_t *)arg = timer->init_tick;
        break;
。。。。
    }


    return RT_EOK;
}
RTM_EXPORT(rt_timer_control);

暂时只学习到这了,RT-Thread定时器要看的内容还是比较多的。



此内容由EEWORLD论坛网友qi777ji原创,如需转载或用于商业用途需征得作者同意并注明出处
点赞 关注(1)
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表