Ucos简介

来源:互联网 发布:淘宝首页搜索框代码 编辑:程序博客网 时间:2024/04/20 11:01


第一章Ucos简介

1.1UCOS II 体系结构

2 UCOS II体系结构

 

 从上图可以看出,UCOSII的移植,我们只需要修改:os_cpu.hos_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,我们利用STM32F4 SYSTICK定时器来提供 UCOSII时钟节拍。

1.2任务的基本格式

V2.8版本开始,支持任务数达到255个,。UCOSII保留了最高4个优先级和最低4个优先级的总共 8 个任务,用于拓展使用,单实际上,UCOSII一般只占用了最低2个优先级,分别用于空闲任务(倒数第一)和统计任务(倒数第二),所以剩下任务最多可达 255-2=253 个(V2.91)。

      所谓任务,其实就是一个死循环。任务的一般格式如下:

     void my_task(void*pdata)

{       

     任务准备工作

while(1)//死循环

     {

            任务实体代码;

            OSTimeDlyHMSM(x,x,x,x);//调用延时函数,释放cpu控制权

     };

}

1.3任务的切换原理

假如我们新建了2个任务为MyTaskYourTask,这里我们先忽略任务优先级的概念,两个任务死循环中延时时间为 1s。如果某个时刻,任务 MyTask在执行中,当它执行到延时函数OSTimeDlyHMSM的时候,它释放 cpu 控制权,这个时候,任务 YourTask获得 cpu控制权开始执行,任务YourTask执行过程中,也会调用延时函数延时1s释放CPU控制权,这个过程中任务A延时1s到达,重新获得CPU控制权,重新开始执行死循环中的任务实体代码。如此循环,现象就是两个任务交替运行,就好像CPU在同时做两件事情一样。

1.4任务切换的好处

前面我们学习的所有实验,都是一个大任务(死循环),这样,有些事情就比较不好处理,比如:音乐播放器实验,在音乐播放的时候,我们还希望显示歌词,如果是1个死循环(一个任务),那么很可能在显示歌词的时候,音频可能出现停顿(尤其是采样率高的时候),这主要是歌词显示占用太长时间,导致 IIS数据无法及时填充而停顿。而如果用 UCOSII来处理,那么我们可以分2个任务,音乐播放一个任务(优先级高),歌词显示一个任务(优先级低)。这样,由于音乐播放任务的优先级高于歌词显示任务,音乐播放任务可以打断歌词显示任务,从而及时给 IIS 填充数据,保证音频不断,而显示歌词又能顺利进行。这就是 UCOSII带来的好处。

1.5任务切换的几个概念

  • 任务优先级:优先级越高,数值越小,只有高优先级任务让出CPU使用权后,低优先级任务才能获取CPU使用权

  • 任务堆栈:每个任务都有自己的堆栈

  • 任务控制块:记录任务堆栈指针,任务当前状态及任务优先级等属性,有三个重要参数,任务函数指针,任务堆栈指针,任务优先级

  • 任务就绪表:记录系统中所有处于就绪状态的任务

  • 任务调度:在任务就绪表中查找优先级最高的就绪任务;同时实现任务切换

1.6任务的状态

1.6.1建立任务函数

UCOSII提供了我们 2个建立任务的函数:OSTaskCreate OSTaskCreateExt,我们一般用OSTaskCreat函数来创建任务,

该函数原型为:OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTUprio)该函数包括 4个参数:

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

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

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

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

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

1.6.2删除任务函数

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

INT8U OSTaskDel(INT8Uprio)

其中参数 prio就是我们要删除的任务的优先级,可见该函数是通过任务优先级来实现任务删除的。特别注意:任务不能随便删除,必须在确保被删除任务的资源被释放的前提下才能删除!

1.6.3请求删除任务函数

前面提到,必须确保被删除任务的资源被释放的前提下才能将其删除,所以我们通过向被删除任务发送删除请求,来实现任务释放自身占用资源后再删除。UCOSII提供的请求删除任务函数原型为:

INT8U OSTaskDelReq(INT8Uprio)

1.6.4改变任务的优先级函数

UCOSII在建立任务时,会分配给任务一个优先级,可以通过调用UCOSII提供的函数修改。UCOSII提供的任务优先级修改函数原型为: 

INT8U OSTaskChangePrio(INT8Uoldprio,INT8U newprio)

1.6.5任务挂起函数

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

INT8UOSTaskSuspend(INT8U prio)

1.6.6任务恢复函数

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

INT8U OSTaskResume(INT8Uprio)
0 0
原创粉丝点击