• ARM RTX操作系统—Theory of Operation—System Task Manager & Task Management


    System Task Manager

    任务管理器是一个系统任务进程,在每次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模式下。

    Task Management

    每个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状态

     

    Idle Task

    当没有任务进程是准备好可以run的时候,RTX内核会执行idle任务进程os_idle_demon。该进程就是一个无限循环,例如:

    for (;;);
    一些ARM处理器提供了idle mode来节省功率消耗。当处理器处于idle mode时,program会被停止运行,除了中断和外设。

    os_idle_demon是由系统创建的,并且在没有其他任务进程时运行,此时RTX 内核会设置处理器进入idle mode。当RTX内核时钟中断或者其他中断发生时,处理器会被唤醒,然后程序继续运行。

    用户可以在os_idle_demon创建自己的程序代码。

  • 相关阅读:
    大数据量并发处理
    一网打尽当下NoSQL类型、适用场景及使用公司
    高并发,大数据量,你的系统考虑哪些问题?
    在学习的路上
    CheckBox全选JS代码
    关于时间的两个写法
    Asp.Net MVC4.0 官方教程拓展之一为模型属性增加中文显示名称
    Asp.Net MVC4.0 官方教程 入门指南之八为Movie模型和库表添加字段
    Asp.Net MVC4.0 官方教程 入门指南之六查看Edit方法和Edit视图
    Asp.Net MVC4.0 官方教程 入门指南之五控制器访问模型数据
  • 原文地址:https://www.cnblogs.com/ironx/p/5137219.html
Copyright © 2020-2023  润新知