uCOSIII实时操作系统 四 任务管理

文章详细描述了uCOSIII在STM32启动过程中的步骤,涉及任务创建、堆栈管理、优先级映射、任务就绪表和调度机制,包括时间片轮转调度。重点讲解了任务控制块、堆栈设置和如何通过调度器选择任务运行。

目录

uCOSIII启动过程:

stm32的启动过程:

uCOSIII的启动过程:

任务状态:

任务控制块:

任务堆栈:

任务就绪表:

优先级位映射表//OSPrioTbl[]

位映射表:

查找优先级:

什么是前导零指令呢?

就绪任务列表OSRdyList[]

任务的调度与切换

调度基础:

任务调度器:

中断级调度器:

时间片轮转调度:


uCOSIII启动过程:

stm32的启动过程:

在系统上电的时候第一个执行的是启动文件(.s文件)里边由汇编语言编写的复位函数Reset_Handler.复位函数的最后会调用C库函数_main,_main()函数的主要工作是初始化系统的堆和栈,最后调用C中的main()函数,进入C的编译环境下。

uCOSIII的启动过程:

uCOSIII启动是有一定顺序的所以在使用的时候按照顺序打开

  1. 调用OSInit()初始化UCOSIII系统。
  2. 创建任务。一般来说只在main()函数中创建一个开始(start_task)任务,其他任务在该任务中进行创建。创建任务之前,使用OS_CRITICAL_ENTER()函数进入临界区域,再利用OSTaskCreate()函数创建任务,任务创建完之后利用OS_CRITICAL_EXIT()退出临界状态。(RT-Thread和FreeRTOS则默认使用这种形式)。
  3. 当任务创建好后,就是处于任务就绪。在就绪态的任务可以参加操作系统的调度,任务调度器只启动一次,之后就不会在执行了,uCO/OS中启动任务调度器的函数是OSStart(),并且启动任务调度器的时候就不回返回了,从此任务都是由uCOS管理。调用OSStart()函数开启UCOSIII系统。

流程图可表示为:

打开main函数,代码如下:

int main(void)
{

OS_ERR err;
CPU_SR_ALLOC();
/***********STM32硬件初始化***********/
delay_init(168); //时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
uart_init(115200); //串口初始化
LED_Init(); //LED初始化
/***************END******************/

//第一步://初始化UCOSIII
OSInit(&err); 

//第二步://进入临界区
OS_CRITICAL_ENTER();

//第三步://创建开始任务
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任务控制块
(CPU_CHAR * )"start task", //任务名字
(OS_TASK_PTR )start_task, //任务函数
(void * )0, //传递给任务函数的参数
(OS_PRIO )START_TASK_PRIO, //任务优先级
(CPU_STK * )&START_TASK_STK[0], //任务堆栈基地址
(CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任务堆栈大小
(OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
(OS_ERR * )&err); //存放该函数错误时的返回值

//第四步:退出临界区
OS_CRITICAL_EXIT(); //退出临界区

//第五步:开启UCOSIII
OSStart(&err); //开启UCOSIII
while(1);
}

任务状态:

UCOSIII支持的是单核CPU,不支持多核CPU,这样某一时刻只有一个任务会获得CPU的使用权进入运行态,其他任务就会进入其他状态,

UCOSIII有多个任务态 参考该篇文章的任务状态 http://t.csdnimg.cn/5OTXd

任务控制块:

引入:在裸机系统中,程序的主体是 CPU 按照顺序执行的。而在多任务系统中,任务的执行是由系统调度的。

系统为了顺利的调度任务使用OSTaskCreate()函数来创建任务的时候,为每一个任务定义了一个控制块TCB(Task ConTrol Block),这个任务控制块就相当于任务的身份证,里边含有任务的所有信息,比如任务的堆栈,任务名称,任务的形参等。有了这个控制块之后,以后系统对任务的全部操作都可以通过这个TCB来实现。

任务堆栈:

暂停一个任务,以后又能恢复运行,必须考虑将这个运行的信息保存,而回复运行的时候需要将这些信息恢复到运行环境。所以任务切换必须做环境的保护和恢复操作。

因此每个任务都应该有自己的堆栈,下面创建一个堆栈:

1、定义一个CPU_STK变量,在UCOSIII中CPU_STK数据类型用来定义任务堆栈。

//任务堆栈大小
#define LED0_STK_SIZE 128
//任务控制块
OS_TCB Led0TaskTCB;
//任务堆栈
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];

2、在使用OSTaskCreat()函数创建任务的时候将堆栈地址转递给OSTaskCreate函数的参数p_stk_base,将堆数据深度传递给参数stk_limit,堆栈深度通常为堆栈大小的十分之一,主要用来检测堆栈是否为空,将堆栈大小转递给stk_size。

(CPU_STK * )&START_TASK_STK[0], //任务堆栈基地址
(CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任务堆栈大小

任务就绪表:

引入:多任务操作系统的主要工作是为系统中处于就绪状态的任务分配CPU资源。

其中涉及到的两个关键:

  1. 判断那些任务处于就绪状态(找优先级)。
  2. 确定那个任务应该马上得到执行(找任务)。

在UCOSIII中,所有已经就绪等待的任务都会被放在一个所谓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值