目录
uCOSIII启动过程:
stm32的启动过程:
在系统上电的时候第一个执行的是启动文件(.s文件)里边由汇编语言编写的复位函数Reset_Handler.复位函数的最后会调用C库函数_main,_main()函数的主要工作是初始化系统的堆和栈,最后调用C中的main()函数,进入C的编译环境下。
uCOSIII的启动过程:
uCOSIII启动是有一定顺序的所以在使用的时候按照顺序打开
- 调用OSInit()初始化UCOSIII系统。
- 创建任务。一般来说只在main()函数中创建一个开始(start_task)任务,其他任务在该任务中进行创建。创建任务之前,使用OS_CRITICAL_ENTER()函数进入临界区域,再利用OSTaskCreate()函数创建任务,任务创建完之后利用OS_CRITICAL_EXIT()退出临界状态。(RT-Thread和FreeRTOS则默认使用这种形式)。
- 当任务创建好后,就是处于任务就绪。在就绪态的任务可以参加操作系统的调度,任务调度器只启动一次,之后就不会在执行了,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资源。
其中涉及到的两个关键:
- 判断那些任务处于就绪状态(找优先级)。
- 确定那个任务应该马上得到执行(找任务)。
在UCOSIII中,所有已经就绪等待的任务都会被放在一个所谓

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

最低0.47元/天 解锁文章
3835

被折叠的 条评论
为什么被折叠?



