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

一、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、事件标志组相关函数:
     










你可能感兴趣的:(uCOS)