您的位置:首页 > 其它

UCOS-III学习笔记(个人总结)

2015-07-03 14:25 381 查看
一、UCOSIII简介



二、USOSIII源代码分析
1、EvalBoards文件夹
STM32F4的工程文件。
2、UC-CPU文件夹
与CPU相关的代码。
3、UC-LIB文件夹
由可移植并且与编译器无关的函数组成。
3、UCOS-III文件夹
1),Ports文件:与CPU平台有关的文件。
2),Source文件:UCOSIII的源代码,具体如下:



三、UCOS-III的移植步骤
1、向工程中添加相应的文件。
2、修改bsp.c和bsp.h文件。
3、修改os_cpu_a.asm文件。
4、修改os_cpu_c.c文件。
5、修改os_cfg_app.h文件(主要针对系统内部的一些系统任务配置,如优先级,任务堆栈,系统时钟节拍等)。
6、修改SYSTEM文件夹
(1)、修改sys.h文件
(2)、修改delaly.c文件
7、移植完毕,编写 简单测试程序测试移植是否正确。

三、UCOS-III的任务管理
1、UCOS-III的启动和初始化



2、任务状态





3、任务控制块

任务控制块OS_CPU是UCOS-III中的一种数据结构。用来保存任务的信息,用OSTaskCreate()函数来创建任务的时候就要给任务分配一个任务控制块。任务控制块是一个结构体。



4、任务堆栈
任务堆栈用来在切换任务和调用其他函数的时候保存现场。
定义堆栈的格式:



用下面红色的指令表示将创建的堆栈传递给任务



5、任务就绪表
UCOS-III将已经就绪的任务放到任务就绪表里面,分为两部分:
(1),优先级位映射表OSPrioTbl[]
(2),就绪任务表OSRdyList[]
任务就绪表操作函数:



6、任务调度和切换
(1)可剥夺型调度
任务调度和切换就是让就绪表中优先级最高的任务获得CPU的使用全年,UCOS-III是可剥夺型,抢占式的RTOS,可以抢了低优先级任务的CPU使用权。
1)任务调度器
任务调度器位OSSched(),在os_core.c文件中。如下图:



2)中断调度器
中断级调度器为OSIntExit(),调用OSIntExit()时,中断应该是关闭的。代码如下:



(2)时间片轮转调度
UCOS-III中支持多个任务同时拥有同一个优先级,要使用这个功能,需要定义OS_CFG_SCHED_ROUND_ROBIN_EN为1.
UCOS-III允许一个任务允许一段时间()
片后让出CPU的使用权,让拥有统一优先级的下一个任务运行。

四、任务相关API函数使用
4.1、任务创建和删除实验
OSTaskCreate()函数用来创建任务;
OSTaskDel()函数用来删除任务。

4.2、任务挂起和恢复实验
OSTsakSuspend()函数,使任务暂停运行;
OSTaskResume()函数用来恢复挂起的任务。

4.3、时间片轮转调度实验
要使用时间片轮转调度发,就要将ox_cfg.h文件中的宏OS_CFG_SCHED_ROUND_ROBIN_EN定义为1.

4.3.1、OSSchedRoundRobinCfg()函数用来使能或者失能UCOS-III.

4.3.2、OSSchedRoundRobinYield()函数:
当一个任务想放弃本次时间片,把CPU的使用去让给同优先级的下一个任务的时候使用。

五、UCOS-III的中断和时间管理
5.1、UCOS-III中断处理过程:
编写中断服务程序需要用到OSIntEnter( )和OSIntExit()。
中断服务函数格式:



5.2、直接发布和延迟发布的对比:



5.3、OSTimeTick ()函数
Systick的中断服务程序中就必须调用OSTimeTick()函数。
代码如下:



5.4、临界段代码保护
有些代码需要保证完整运行,不能被打断,这就是临界段代码。
进入临界段代码使用宏OS_CRITICAL_ENTER(),
退出临界区使用宏OS_CRITICLA_EXIT( ).

5.5、时间管理
5.5.1 OSTimeDly()函数
进行延时操作时用到。
5.5.2、OSTimeDlyHMSM()函数
更加直观的对某个任务延时。

六、UCOS-III的软件定时器
6.1、定时器的工作模式
1) 如果要使用定时器,就要把宏OS_CFG_TMR_DEL_EN定义为1.
2)定时器的分辨率由系统节拍频率OS_CFG_TICK_RATE_HZ决定。
6.1.1创建一个定时器
OSTmrCreate()函数创建一个定时器
6.1.2单次定时器
把参数opt设置为OS_OPT_TMR_ONE_SHOT
6.1.3周期定时器(无初始化延迟)
把参数opt设置为OS_OPT_TMR_PERIODIC
6.1.4周期定时器(有初始化延迟)

七、UCOS-III的信号量和互斥信号量
7.1信号量
有关信号量的API函数如下表:



7.2优先级反转

7.3互斥信号量
为了避免优先级反转为题,UCOS-III支持二进制信号量:数值信号量。
互斥型信号量操作的API函数:



7.4直接访问共享资源区

7.5使用信号量访问共享资源区

7.6任务同步
信号量现在更多的被用来实现任务的同步以及任务和ISR之间的同步,如下图所示:



八、UCOS-III消息传递
8.1消息队列
消息一般包括:指向数据的指针,表明数据长度的变量和记录消息发布时刻的时间戳。
指针指向的可以是一块数据区或者一个函数,消息的内容必须一直保持可见性,发布数据采用的是引用传递而不是值传递。也就是说,发布的数据本身不产生数据拷贝。
UCOS-II中有消息邮箱和消息队列。
UCOS-III中只有消息队列。



8.2消息队列相关函数



九、事件标志组
9.1、事件标志组
用来解决一个事件和多个任务同步的方法。
两种同步机制:
“或”同步:当任何一个事件发生,任务都被同步。
“与”同步:需要所有的事件发生才会被同步。

同步机制如下图:



9.1、事件标志组相关函数:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: