任务管理器是一个系统任务进程,在每次RTX内核时钟发生timer tick interrupt时会运行,也就是每次RTX内核时钟发生中断都会运行。这个进程拥有最高的优先级而不会被其他进程取代。这个进程的基本任务,就是负责调度用户的任务进程。
基于RTX内核的用户任务进程,并不真正意义上是同时运行,他们是分时间片来运行的,time-sliced。可用的CPU timer,会切分成很小的时间片。RTX内核将一个时间片分配给某个任务进程。因为一个时间片很短(默认的时间片是10ms),所以看起来任务进程像是同步运行的。
每个任务进程执行的最小时间长度是一个时间片的长度。如果任务进程通过调用os_tsk_pass交出了时间片,或者调用了wait library中的一个API函数,那么RTX内核会切换到下一个ready进程去run。可以再RTX_Config.c中配置时间片长度。
任务管理器,是一个system tick timer任务进程,负责管理其他的所有任务进程。它管理进程的延时超时,将等待的进程置于sleep状态。当需要的事件发生时,它会将对应的进程重新置于read状态去run。这就是为什么它有最高优先级的原因。
任务管理器不仅在RTX内核时钟中断时才运行,同样当一个中断函数调用isr_函数时它也运行。这是因为中断并不能让当前任务进程处于等待状态,因为中断也无法做任务进程的切换工作。然后,中断可以产生事件、信号量、消息给高优先级的任务。高优先级的任务会在当前中断完成之后,抢占当前任务。
为了做到上述这一点,因此,当前中断将会在其将要完成之时,强制产生RTX内核时钟中断。这个强制产生的RTX内核时钟中断,会让任务管理器开始运行。这样任务管理器开始处理所有的任务进程,并将高优先级的任务进程置于running state。最后高优先级的任务进程得以运行。
注意:
任务管理进程,也叫system tick timer任务进程,是一个系统进程,所以由系统自动创建。
Cortex-M处理器的RTX Library使用该系列处理的增强特性,所有的RTX系统函数运行在SVC模式下。
每个RTX任务进程,必定处于以下的一个确定状态下:
1,RUNNING
正在running的任务进程处于这个state。一个时刻只会有一个进程处于这个状态。os_tsk_self()可以返回当前正在跑的任务进程ID。
2,READY
已经准备好run的任务进程还没run,处于ready的状态。当处于running state的任务进程完成运行时,RTX内核会从处于READY状态的任务进程中挑出优先级最高的一个来运行。
3,WAIT_DLY
等待一段延时时间结束的任务进程,处于这个状态。当延时结束后,该任务进程会切换到READY状态。任务进程调用os_dly_wait()函数,可会处于WAIT_DLY状态。
4,WAIT_ITV
等待一个interval完成的任务进程,处于这个状态。当一个interval延时之后,该任务进程会切换到READY状态。任务进程调用os_itv_wait()函数,可会处于WAIT_ITV状态。
5,WAIT_OR
等待至少一个事件标志位被置位的任务进程,处于这个状态。当等待的事件发生之后,该任务进程会切换到READY状态。任务进程调用os_evt_wait_or()函数,可会处于WAIT_OR状态。
6,WAIT_AND
等待所有事件标识位被置位的任务进程,处于这个状态。当所有等待的事件都发生之后,该任务进程会切换到READY状态。任务进程调用os_evt_wait_and()函数,可会处于WAIT_AND状态。
7,WAIT_SEM
等待一个信号量的任务进程,处于这个状态。当token还给semaphore的时候,该任务进程会切换到READY状态。任务进程调用os_sem_wait()函数,可会处于WAIT_SEM状态。
8,WAIT_MUT
等待一个互斥锁的任务进程,处于这个状态。当互斥锁被释放之后,该任务进程会获得这个互斥锁并切换到READY状态。任务进程调用os_mut_wait()函数,可会处于WAIT_MUT状态。
9,WAIT_MBX
等待从mailbox接收一个消息的任务进程,处于这个状态。当消息抵达之后,该任务进程会切换到READY状态。任务进程调用os_mbx_wait()函数,可会处于WAIT_MBX状态。
当mailbox满的时候,需要发送消息的任务进程也会等待,也会被置于WAIT_MBX状态。知道有1个消息从mailbox中被取走,该任务进程会切换到READY状态。在这种情况下,该任务进程调用os_mbx_send(),就会使得该进程处于WAIT_MBX状态。
10,INACTIV
并没有被启动的任务进程,或者被注销的任务进程就处于这个状态。调用os_tsk_create(),会启动一个任务进程;可以通过调用os_tsk_delete()而是该进程处于INACTIV状态。
当没有任务进程是准备好可以run的时候,RTX内核会执行idle任务进程os_idle_demon。该进程就是一个无限循环,例如:
for (;;);
一些ARM处理器提供了idle mode来节省功率消耗。当处理器处于idle mode时,program会被停止运行,除了中断和外设。
os_idle_demon是由系统创建的,并且在没有其他任务进程时运行,此时RTX 内核会设置处理器进入idle mode。当RTX内核时钟中断或者其他中断发生时,处理器会被唤醒,然后程序继续运行。
用户可以在os_idle_demon创建自己的程序代码。