UCOSIII_多任务创建(一)
2020-02-29 本文已影响0人
飞向深空
UCOSIII是个多任务操作系统,对任务操作有创建、挂起、删除和调度等。
任务状态有:
休眠态:任务函数只是存储区的一段代码,不受UCOS控制
就绪态:任务在就绪表中已经登记,等待获取CPU使用权
运行态:任务正在运行
等待态:正在运行的任务需要等待某一个事件,像信号量、消息、事件标志组等,这时会暂时让出CPU使用权,进入等待状态
中断服务态:一个正在执行的任务被中断打断,CPU转而去执行中断服务程序,这时这个任务会被挂起,进入中断服务态
任务控制块OS_TCB:用来保存任务的信息,它是个结构体
任务堆栈CPU_STK:用来在切换任务和调用其它函数的时候保存现场,CPU_STK大小是4字节
创建一个任务需要定义控制块StartTaskTCB、优先级START_TASK_PRIO、堆栈START_TASK_STK[START_STK_SIZE]。
创建任务前需要初始化UCOSIII——OSInit(&err); err是接收错误时返回的错误码,用OS_ERR定义。
创建任务用OSTaskCreate(...)实现,创建好的任务直接进入就绪态。
//任务优先级
#define START_TASK_PRIO 3
//任务堆栈大小
#define START_STK_SIZE 512
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);
int main()
{
OS_ERR err;
CPU_SR_ALLOC();
OSInit(&err); //初始化UCOSIII
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(); //退出临界区
OSStart(&err); //开启UCOSIII
}
- 任务堆栈深度限位是指堆栈剩余量,当剩余量小于或等于该值表明堆栈快要用完,用来检测个确保堆栈不溢出
- 没有参数传入函数传递给任务函数的参数就是0
- 优先级数值越低,优先级越高,但不能使用系统任务的优先级()
- 时间片长度在时间片轮转调度时使用,运行几个时间片就填几
- OPT选项:
OS_OPT_TASK_STK_CHK:检测任务堆栈
OS_OPT_TASK_STK_CLR:清除任务堆栈
OS_OPT_TASK_NONE:无选项 - 最后要OSStart(&err); //开启UCOSIII
- 进出临界区函数范围内的程序不会被打断
- CPU_SR_ALLOC();是个宏定义了一个变量os_cpu_sr是用来存 cpu 状态寄存器用的,用到临界区这个宏必须声明