rt-thread操作系统简单分析

源码下载

源码地址: https://github.com/RT-Thread/rt-thread.git

rt-thread与AliOS-things,TencentOS tiny,freertos等设计看起来都有不同,在任务的命名上,改为了线程。


任务讲解

1.任务怎样创建来的?

编写一个函数,定义为:rt_thread_create(),里面需要包含参数:要执行的函数、任务的名称、栈的大小、当前任务的优先级,运行的周期等。由于这个接口没有任务的结构体,所以自然需要分配一个,实际的调用是_rt_thread_init()。


2.任务的私有信息需要怎么存放?

定义一个函数,命名为:rt_hw_stack_init(),里面包含的就是xPSR、PC、LR、R12、R3、R2、R1、R0,R11, R10, R9, R8, R7, R6, R5 and R4等的初始化。看起来rt-thread在这上面的处理跟其他系统有一个差别就是没有在这里填充一个位置,赋值0xfffffffd。


3.任务怎么切换?

对于系统运行,要执行第一个任务,可以调用函数:rt_system_scheduler_start(),实际是调用rt_hw_context_switch_to();这个函数是使用汇编编写的,最终会设置PENDSV中断,在PendSV_Handler中去执行任务的切换操作。\u0004

之后则是多个任务之间进行调度。

在普通任务中,可以调用函数rt_thread_sleep(),其实就是调用rt_schedule(),实际干活的则是rt_hw_context_switch(),它里面也一样,需要设置PENDSV位,这样就能做到PENDSV中断产生,然后切换到应该切换到的任务中。

在中断服务函数中, 可以调用rt_thread_yield(),则会调用到rt_schedule(),跟普通任务不同,它会调用到rt_hw_context_switch_interrupt(),但是它跟rt_hw_context_switch()内容一样,而它做法是汇编中两个标号上下排列来共用代码,这显得比tencentos tiny处理得更好。之后也就能切换任务了。


4.访问同一个资源(变量)如何处理?

对于rt-thread处理起来也很简单了,直接粗暴的操作PRIMASK。相较而言,freertos在这块考虑的更多。

本篇也将持续更新。。。


分享到:


相關文章: