在前面的移植中,大多都是模糊理解,所以我觉得有必要对主函数main.c中的内容进行简单分析一下,以便加深UCOS-II的理解。
1、包含所有的头文件:#include "includes.h"
#include "includes.h"常用内容是:
#ifndef __INCLUDES_H
#define __INCLUDES_H
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "uCOS_II.h"
#include "BSP.h" //与开发板相关的函数
#include "app.h"
#include "led.h"
#endif
2、定义一个堆栈:static OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];
其中堆栈大小STARTUP_TASK_STK_SIZE在app_cfg.h中已经定义了;
3、BSP_Init():用户驱动程序初始化,主要包括:
(1)SystemInit();//系统时钟配置成72MHz
(2)LED_GPIO_Config(); //LED端口配置
4、OSInit():
主要包括5个函数,用来初始化uC/OS-II的内部构件,具体包括所有的变量和数据结构;
(1)建立空闲任务:OS_InitTaskIdle();优先级最低,即OS_LOWEST_PRIO
(2)如果统计任务允许OS_TASK_STAT_EN 设置为1,则、OSInit()建立统计任务:OS_InitTaskStat();其优先级是 OS_LOWEST_PRIO-1;
5、
OSTaskCreate(Task_LED,(void*)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);
创建任务Task_LED,这个OSTaskCreate函数的原型是:
INT8U OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)
需要四个参数:
①task 是指向任务代码的指针;这里就是任务函数名
②p_arg是任务开始执行时,传递给任务的参数的指针,即任务初始化指针;这里不需要初始化,所以为NULL空指针;
③ptos是分配给任务的堆栈的栈顶指针;这里一开始定义了一个堆栈,给当前数据赋予堆栈数据的末尾单元,从末尾开始往开始
④prio是分配给任务的优先级; 这里优先级为0,为最高优先级;
这里Task_LED是指向任务的指针,原型函数在app.c里编写,任务看起来与C函数一样,具有返回类型和一个参数,但是它绝对不返回,因此,返回类型必须定义成void 型。
任务Task_LED的原型是 void Task_LED(void *p_arg),带有一个指针参数
注意: 如果任务中没有用到指针p_arg,那么防止编译器警告,应该在第一行写上(void)p_arg;
6、OSStart();
调用OSStart();将控制权交给uC/OS-II内核,开始运行多任务;OSStart();将判断所有建立任务中哪一个任务是最重要的(优先级最高),并开始运行这个任务;
注意: 在启动多任务OSStart();之前至少要先建立一个任务,否则应用程序就会崩溃。
文章评论(0条评论)
登录后参与讨论