UCOSII 实验 1-任务调度

 

  ·UCOSII 是一个可以基于 ROM 运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器。

  ·为了提供最好的移植性能, UCOSII 最大程度上使用 ANSI C 语言进行开发,并且已经移植到近 40 多种处理器体系上,涵盖了从 8 位到 64 位各种 CPU(包括 DSP)。

  ·UCOSII 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。 UCOSII 已经移植到了几乎所有知名的 CPU 上。

 

  UCOSII体系结构图: 

 

 UCOSII 的移植,我们只需要修改: os_cpu.h、 os_cpu_a.asm 和 os_cpu.c等三个文件即可:

  ① os_cpu.h, 进行数据类型的定义,以及处理器相关代码和几个函数原型;

  ② os_cpu_a.asm, 是移植过程中需要汇编完成的一些函数,主要就是任务切换函数;

  ③ os_cpu.c,定义一些用户 HOOK 函数。

 

 图中定时器的作用是为 UCOSII 提供系统时钟节拍,实现任务切换和任务延时等功能。这个时钟节拍由 OS_TICKS_PER_SEC(在 os_cfg.h 中定义)设置,一般我们设置 UCOSII 的系统时钟节拍为 1ms~100ms,具体根据你所用处理器和使用需要来设置。对于STM32的单片机一般用其 SYSTICK 定时器来为 UCOSII 提供时钟节拍。

 

UCOSII的任务优先级

  · UCOSII 保留了最高 4 个优先级和最低 4 个优先级的总共 8 个任务,用于拓展使用;

  · UCOSII 一般只占用了最低 2 个优先级,分别用于空闲任务(倒数第一)和统计任务(倒数第二),所以剩下给我们使用的任务最多可达 255-2=253 个(V2.91)。

  

任务

  · 所谓的任务,其实就是一个死循环函数,该函数实现一定的功能,一个工程可以有很多这样的任务(最多 255 个), UCOSII 对这些任务进行调度管理, 让这些任务可以并发工作(注意不是同时工作!!,并发只是各任务轮流占用 CPU,而不是同时占用,任何时候还是只有 1 个任务能够占用 CPU), 这就是 UCOSII 最基本的功能。

 

 

①  睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。

②  就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低, 还暂时不能运行,这时任务的状态叫做就绪状态。

③ 运行状态,该任务获得 CPU 使用权,并正在运行中,此时的任务状态叫做运行状态。

④ 等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把 CPU 的使用权让给别的任务执行而使自己的任务进入等待状态。

⑤ 中断服务状态,一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。

 

UCOSII任务状态转换关系

 

 

UCOSII 中,与任务相关的几个函数:

1、 建立任务函数

  • 如果想让 UCOSII 管理用户的任务,必须先建立任务。
  • UCOSII 提供了我们 2 个建立任务的函数: OSTaskCreat 和 OSTaskCreatExt,我们一般用 OSTaskCreat 函数来创建任务。
  • 函数原型为:

OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio);

           该函数包含4个参数:

①  task:是指向任务代码的指针;

②  pdata:是任务开始执行时,传递给任务的参数的指针;

③  ptos:是分配给任务的堆栈的栈顶指针;

④  prio 是分配给任务的优先级。

  • 每个任务都有自己的堆栈,堆栈必须申明为 OS_STK 类型,并且由连续的内存空间组成。可以静态分配堆栈空间,也可以动态分配堆栈空间。

 

2、 任务删除函数

  • 任务删除,其实就是把任务置于睡眠状态,并不是把任务代码给删除了。
  • UCOSII提供的任务删除函数原型为:

INT8U OSTaskDel(INT8U prio);

参数 prio 就是我们要删除的任务的优先级,可见该函数是通过任务优先级来实现任务删除的。

任务不能随便删除,必须在确保被删除任务的资源被释放的前提下才能删除!

 

3、 请求删除任务函数

  • 通过向被删除任务发送删除请求,来实现任务释放自身占用资源后再删除。
  • UCOSII 提供的请求删除任务函数原型为:

INT8U OSTaskDelReq(INT8U prio);

同样还是通过优先级来确定被请求删除任务。

 

4、 改变任务的优先级函数

  • UCOSII 在建立任务时,会分配给任务一个优先级,但是这个优先级并不是一成不变的,而是可以通过调用 UCOSII 提供的函数修改。
  • UCOSII 提供的任务优先级修改函数原型为:

INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio);

 

5、 任务挂起函数

  • 任务挂起和任务删除有点类似,但是又有区别,任务挂起只是将被挂起任务的就绪标志删除,并做任务挂起记录;
  • 并没有将任务控制块从任务控制块链表里面删除, 也不需要释放其资源。
  • 任务删除则必须先释放被删除任务的资源,并将被删除任务的任务控制块也给删了。
  • 被挂起的任务,在恢复(解挂)后可以继续运行。
  • UCOSII 提供的任务挂起函数原型为:

INT8U OSTaskSuspend(INT8U prio);

 

6、 任务恢复函数

  • 有任务挂起函数,就有任务恢复函数;
  • 通过该函数将被挂起的任务恢复,让调度器能够重新调度该函数。
  • UCOSII 提供的任务恢复函数原型为:

INT8U OSTaskResume(INT8U prio);

 

UCOSII与任务相关的函数我们就介绍这么多。

 

 

 

 

 

 

posted @ 2019-11-28 20:41  Kojull  阅读(1057)  评论(0)    收藏  举报