博客专栏

EEPW首页>博客> RT-Thread线程与时钟定时器管理

RT-Thread线程与时钟定时器管理

发布人:15695104076 时间:2023-06-16 来源:工程师 发布文章

第一天

我今天学习的是RT—Thread线程和时钟定时器管理。

系统中总共存在两类线程,分别是系统线程和用户线程,系统线程是由 RT-Thread 内核创建的线程,用户线程是由应用程序创建的线程,而RT-Thread 的线程调度器是抢占式的。

线程具有上下文切换、保护线程中局部变量、函数调用上下文保存等作用。当线程刚开始创建还没开始运行时就处于初始状态;在初始状态下,线程不参与调度。此状态在 RT-Thread 中的宏定义为RT_THREAD_INIT。在就绪状态下,线程按照尤先级排队等待被执行;一旦当前线程运行完毕让出处理器,操作系统会马上寻找最高优先级的就绪态线程运行。此状态在 RT-Thread 中的宏定义为 RT_THREAD_READY线程当前正在运行在单核系统中,只有rthread_ self0 函数返回的线程处于运行状态;在多核系统中,可能就不止这一个线程处于运行状态。此状态在 RT-Thread 中的宏定义为 RT_THREAD_RUNNING也称阻塞态。可能因为资源不可用 而挂起等待,或式程主动了延时一段时间而挂起。在挂起状态下,线程不参与调度。此状态在FT-Thread 中的宏定义为 RT_THREAD_SUSPEND当线程运行结束时将处干关闭状态。关闭状态的线程不参与线程的调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD _CLOSE。

在系统启动时,系统会创建 main 线程,它的入口函数为 main_thread_entry(),用户的应用入口函数 main() 就是从这里真正开始的,系统调度器启动后,main 线程就开始运行。

RT-Thread 中,定时器分为硬件定时器和软件定时器,触发方式分为单次触发和周期触发。我们在创建定时器时,把定时器指定成SOFT_TIMER的方式,这样可以使得定时器超时函数完全运行在timer系统线程上下文环境中。如果系统在初始化时需要使用SOFT_TIMER特性,需要在系统配置中打开RT_USING_TIMER_SOFT宏定义,那么调用rt_system_timer_thread_init函数就可以启动timer系统线程。这里值得注意的是,SOFT_TIMER定时器的精度由RT_TIMER_TICK_PER_SECOND定义的值所决定,这个值必须是OS tick的整数倍。

硬件定时器因为是在中断中执行,所以对超时函数有很强的限制:1.时间不能太久2,不能有挂起、等待操作3.不能申请动态内存、释放动态内存。软件定时器因为是在线程中执行,所以要求就比较宽泛一点:1.时间也要短2,不允许有阻塞挂起、死循环3,不能影响其他超时函数的下一次回调,也就是时间短的标准。使用硬件定时器,在时基更新的时候,查询的定时器包含线程的内置定时器和用户定义的定时器,它们都挂在硬件定时器列表上,而且特点是:所有线程的内置定时器的回调函数都是一个函数,而用户自定义的定时器的回调函数由用户自定义。在每次系统滴答中断进行线程恢复和调度是通过调用线程内置的定时器的超时函数实现的。抛开一切不说,滴答中断里是查询定时器,有超时的定时器就调用其超时函数,当这个定时器是线程内置的定时器,它这个超时函数就是恢复线程和执行调度。如果这个定时器是用户自己开的硬件定时器时,其调用的超时函数就是用户自己写的。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。



关键词:RT-Threa

相关推荐

技术专区

关闭