UC/OS基础知识之任务的创建
2016-01-05 22:02
435 查看
任务的创建
1.创建任务函数任务的创建实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。UC/OS提供两个函数创建任务OSTaskCreate()和OSTaskCreateExt()。一般前者用的多,OSTaskCreate()如下所示:
INT8U OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio) { OS_STK *psp; INT8U err; #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr = 0; #endif #if OS_ARG_CHK_EN > 0 if (prio > OS_LOWEST_PRIO) { //检测任务的优先级是否合法 return (OS_PRIO_INVALID); } #endif OS_ENTER_CRITICAL(); if (OSIntNesting > 0) { /* Make sure we don't create the task from within an ISR */ OS_EXIT_CRITICAL(); return (OS_ERR_TASK_CREATE_ISR); } if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {//确认优先级未被使用 OSTCBPrioTbl[prio] = (OS_TCB *)1; //保留优先级 OS_EXIT_CRITICAL(); psp = OSTaskStkInit(task, p_arg, ptos, 0);//初始化堆栈 err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);//初始化任务控制块 if (err == OS_NO_ERR) { if (OSRunning == OS_TRUE) { /* Find highest priority task if multitasking has started */ OS_Sched();//任务调度 } } else { OS_ENTER_CRITICAL(); OSTCBPrioTbl[prio] = (OS_TCB *)0;//放弃任务 OS_EXIT_CRITICAL(); } return (err); } OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST); } #endif
2.创建任务的一般方法
一般说来,任务可在OSStart()启动任务调度之前来创建,也可在任务中创建,但是UC/OS有个规定:在调用OSStart()启动任务调度之前,必须创建了至少一个任务。因此一般习惯上,在OSStart()启动任务调度之前先创建一个任务,并赋予它最高的优先级,从而使它成为起始任务,然后在这个起始任务中再创建其他任务。如果要使用统计任务,则统计任务的初始化函数也必须在这个起始任务中来调用。
注意:
UC/OS不允许在中断服务程序中创建任务。
相关文章推荐
- js实现5s后跳转页面
- 让程序在崩溃时体面的退出之Dump文件
- 私有变量和私有方法
- UILabel混合显示动画效果
- Dictionary读取键值的快捷方法
- 电脑开机详解
- bzoj1855 股票交易 动态规划&单调队列
- 那些成功学和鸡汤文没有告诉你的事
- phpcms V9 常用函数 及 代码整理
- 工厂三兄弟之抽象工厂模式(四):界面皮肤库解决方案
- 搭建iscsi共享存储
- 我的VIM入门
- 工资发放系统
- STL详解
- leetcode笔记:Leetcode Letter Combinations of a Phone Number
- Oracle学习之buffer cache(copy过来的文本,待补充笔记)
- Python机器学习库scikit-learn实践
- leetcode之4Sum
- OC中的属性
- 若干年后自己是否会想起在这里的加密