uC/OS-III-6.0-uC/OS-III任务管理

1.实时应用中一般将工作拆分为多个任务,每个任务都需要是可靠的。任务(也叫做线程)是简单的程序。单CPU中,在任何时刻只能是一个任务被执行。
2.uC/OS-III支持多任务且对任务数量没有限制, 任务数仅取决于处理器内存的大小(RAM)。多任务调度是任务间占用CPU的过程。
3.任务用于监控输入、更新输出、计算、循环控制、显示、读按钮和键盘、 与其它系统交流等。
4.任务看起来像 C函数。有 2种类型的任务:运行一次(列表 5-1)和无限循环( 列表5-2)。 在大多数嵌入式系统中, 任务通常是无限循环的。任务不能像C函数那样,它是不能return的。
5.只运行一次的任务结束时必须通过调用OSTaskDel()删除自己。这样可以使系统中的任务数减少。在任务体中,任务可以调用uC/OS-III提供的大部分函数帮助完成其所需要完成的功能。
这里写图片描述
6.在 uC/OS-III中,不管是 C语言函数还是调用汇编语言函数。该函数都用可能被多个任务同时调用。一个可重入的函数不含有静态变量以及全局变量除非被保护( uC/OS-III提供了这种保护机构)。
7.在嵌入式系统中通常使用无限循环的任务,因为应用中有很多需要重复的工作(例如,读取输入值、更新显示、控制操作等)。这是不同于 C函数的一个方面( C函数可以用 while(1)或 for(;;)实现相同的功能)。
这里写图片描述
8.任务可以延时一段时间(调用 OSTimeDly() 或 者OSTimeDlyHSM())。例如,应用中需要每 100ms扫描键盘一次。在这种情况下, 延时100ms然后检测键盘上是否有键被按下, 然后执行相应的操作。
同样的,任务等待的事件可以是以太网控制器发送的包。在这种情况下,任务会调用OS???Pend()函数(以这种形式定义的函数)。一旦包接收完成,任务根据包内容进行下一步操作。
值得注意的是,任务在等待事件时,它不会占用CPU。
9.uC/OS-III 需要通过调用函数 OSTaskCreate()创建任务。OSTaskCreate()函数的原型如下所示。
这里写图片描述
10.
这里写图片描述
(1).调用 OSTaskCreate()时,参数为:堆栈的基地址( p_stk_base),堆栈的增长限制,堆栈大小等。
(2).若 OSTaskCreate() 中的第 12 个参数设置 为OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, uC/OS-III将会初始化堆栈内容为全0。
(3).uC/OS-III将复制CPU寄存器内容并有序地存入任务堆栈的顶部。这使得上下文切换易于实现。
(4).堆栈指针SP存于任务的TCB中。
(5). TCB中其它的字段会被赋值:任务优先级、任务名、任务状态、内部消息队列、内部信号量等。
11.任务可以调用uC/OS-III提供的函数。特别的, 一个任务可以创建其它任务(调用 OSTaskCreate())、停止或者恢复其它任务(调用OSTaskSuspned()和OSTaskResume())、 提交信号量到其它任务、 发送消息到其它任务、 提供共享资源等。 换句话说, 任务不是只被限制于“ 等待事件”。
这里写图片描述
(1).任务最重要的部分是它的代码。 正如前面提到的, 任务的代码看起来像是个C函数,除了它实现无限循环的方式。另外,任务不允许有返回值。
(2).每个任务都需要被设定一个优先级。 uC/OS-III的工作是决定哪个任务应该占用 CPU。一般的, uC/OS-III选择就绪队列中优先级最高的任务运行。在uC/OS-III中,数值越小优先级越高。
(3).每个任务对CPU寄存器都会有自己设置。 如果一个任务被运行,那么它就会占用了实际的CPU。
(4).因为uC/OS-III是一个抢占式内核, 每个任务都需要有自己的堆栈空间。 堆栈驻留于RAM并经常用于保存变量、 函数、 嵌套的ISR地址等。
堆栈空间可以被分配为静态的 ( 在编译时分配)或者是动态的 ( 运行时分配)。定义静态的堆栈如下所示,定义是在任务之外的。
这里写图片描述
.注意“ ??? ” 是堆栈的大小,依赖于任务的需求。通过C编译器提供的堆管理功能( malloc())堆栈空间可以被动态分配。如下所示。 但是, 必须关注存储碎片。 多次创建和删除任务后, 内存可能有很多存储碎片而不足以再分配给任务了。在嵌入式系统中动态地分配堆栈是被允许的,但是,一旦堆栈被动态分配,它就不能被回收。换句话说, 对于有些不需要被删除的任务, 动态分配它们的堆栈是一种很好的解决方法。
这里写图片描述
(5). 任务也可以访问全局变量。 然而, 因为uC/OS-III是抢占式内核,所有必须注意多个任务同时访问全局变量的情况。幸运的是,uC/OS-III提供了一些功能管理这些共享资源如 ( 信号量、 mutex等)。
(6).任务也可以访问一个或多个IO设备(或者外设)。

猜你喜欢

转载自blog.csdn.net/changjucha3459/article/details/81121008