//建立一个新任务 #if OS_TASK_CREATE_EN > 0 //允许生成OSTaskCreate()函数 INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) { #if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3 OS_CPU_SR cpu_sr; #endif OS_STK *psp; //初始化任务堆栈指针变量,返回新的栈顶指针 INT8U err; //定义(获得并定义初始化任务控制块)是否成功 #if OS_ARG_CHK_EN > 0 //所有参数必须在指定的参数内 if (prio > OS_LOWEST_PRIO) { //检查任务优先级是否合法 return (OS_PRIO_INVALID); //参数指定的优先级大于OS_LOWEST_PRIO } #endif OS_ENTER_CRITICAL(); //关闭中断 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使用,即就绪态为0 OSTCBPrioTbl[prio] = (OS_TCB *)1; //保留这个优先级,将就绪态设为1 OS_EXIT_CRITICAL(); //打开中断 psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0); //初始化任务堆栈 err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); //获得并初始化任务控制块 if (err == OS_NO_ERR) { //任务控制初始化成功 OS_ENTER_CRITICAL(); //关闭中断 OSTaskCtr++; //任务计数器加1 OS_EXIT_CRITICAL(); //打开中断 if (OSRunning == TRUE) { //检查是否有(某个)任务在运行 OS_Sched(); //任务调度,最高任务优先级运行 } } else { //否则,任务初始化失败 OS_ENTER_CRITICAL(); //关闭中断 OSTCBPrioTbl[prio] = (OS_TCB *)0; //放弃任务,设此任务就绪态为0 OS_EXIT_CRITICAL(); //打开中断 } return (err); //返回(获得并定义初始化任务控制块是否成功) } OS_EXIT_CRITICAL(); //打开中断 return (OS_PRIO_EXIST); //返回(具有该优先级的任务已经存在) } #endif //建立一个新任务。与OSTaskCreate()不同的是,OSTaskCreateExt()允许用户设置更多的细节 //内容。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立,但中断处理 //程序中不能建立新任务。一个任务必须为无限循环结构,且不能有返回点。 #if OS_TASK_CREATE_EXT_EN > 0 //允许生成OSTaskCreateExt()函数 INT8U OSTaskCreateExt (void (*task)(void *pd), //建立扩展任务(任务代码指针) void *pdata, //传递参数指针 OS_STK *ptos, //分配任务堆栈栈顶指针 INT8U prio, //分配任务优先级 INT16U id, //(未来的)优先级标识(与优先级相同) OS_STK *pbos, //分配任务堆栈栈底指针 INT32U stk_size, //指定堆栈的容量(检验用) void *pext, //指向用户附加的数据域的指针 INT16U opt) //建立任务设定选项 { #if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3 OS_CPU_SR cpu_sr; #endif OS_STK *psp; //初始化任务堆栈指针变量,返回新的栈顶指针 INT8U err; //定义(获得定义初始化任务控制块)是否成功 #if OS_ARG_CHK_EN > 0 //所有参数必须在指定的参数内 if (prio > OS_LOWEST_PRIO) { //检查任务优先级是否合法 return (OS_PRIO_INVALID); //参数指定的优先级大于OS_LOWEST_PRIO } #endif OS_ENTER_CRITICAL(); //关闭中断 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使用,即就绪态为0 OSTCBPrioTbl[prio] = (OS_TCB *)1; //保留这个优先级,将就绪态设为0 OS_EXIT_CRITICAL(); //打开中断 //以下两为1堆栈才能清0 if (((opt & OS_TASK_OPT_STK_CHK) != 0x0000) || //检验任务堆栈,CHK=1 ((opt & OS_TASK_OPT_STK_CLR) != 0x0000)) { //任务建立时是否清0,CLR=1 #if OS_STK_GROWTH == 1 //堆栈生长方向 (void)memset(pbos, 0, stk_size * sizeof(OS_STK)); //从下向上递增 #else (void)memset(ptos, 0, stk_size * sizeof(OS_STK)); //从下向下递减 #endif } psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt); //初始化任务堆栈 err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt); //获得并初始化任务控制块 if (err == OS_NO_ERR) { //任务控制初始化成功 OS_ENTER_CRITICAL(); //关闭中断 OSTaskCtr++; //任务计数器加1 OS_EXIT_CRITICAL(); //打开中断 if (OSRunning == TRUE) { //检查是否有(某个)任务在运行 OS_Sched(); //任务调度,最高任务优先级运行 } } else { //否则,任务初始化失败 OS_ENTER_CRITICAL(); //关闭中断 OSTCBPrioTbl[prio] = (OS_TCB *)0; //放弃任务,设此任务就绪态为0 OS_EXIT_CRITICAL(); //打开中断 } return (err); //返回(获得并定义初始化任务控制块是否成功) } OS_EXIT_CRITICAL(); //打开中断 return (OS_PRIO_EXIST); //具有该优先级的任务已经存在 } #endif

OSTaskCreate 和 OSTaskCreateExt 函数相关推荐

  1. OSTaskCreate 和 OSTaskCreateExt 函数的区别

    uC/OS创建任务有几个硬性要求 1. 任务必须被创建在多任务开始之前或者是运行的任务中. 2. 任务不能由ISR创建. 3. 任务必须在死循环中,并且不能有返回. //建立一个新任务 #if OS_ ...

  2. uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()

    1. OSTaskCreate()     OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构.    ...

  3. OSTaskCreate()函数分析

    INT8U  OSTaskCreate (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT8U prio) :函数返回一个8位的整型数,调用 ...

  4. 启动ucosii之四OSTaskCreate()

    函数原型来自OS_TASK.C /*********************************************************************************** ...

  5. ucos II 创建第一个任务之一

    Ucos II创建第一个任务 我们已经从远处欣赏过ucos II 的身材,现在可以近距离地欣赏Ucos II性感的局部了. 任务是什么? 有一句话:CPU不同的时刻段总是在执行着优先级最高的任务.所以 ...

  6. μC/OS-II邵贝贝节选

    μC/OS-II 通过 uCOS_II.H 中定义的 OS_EVENT 数据结构来维护一个事件控制块的所有信息 [程序清单 L6.1],也就是本章开篇讲到的事件控制块 ECB.该结构中除了包含了事件本 ...

  7. uC/OS-II OS_TASK.C中有关任务管理的函数

    函数大致用途 OS_TASK.C是uC/OS-II有关任务管理的文件,它定义了一些函数:建立任务.删除任务.改变任务的优先级.挂起和恢复任务,以及获取有关任务的信息. 函数 用途 OSTaskCrea ...

  8. UC/OS的46个系统函数1

    Void OSInit(void); 所属文件 OS_CORE.C     调用者 启动代码    开关量无 OSinit()初始化μC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之前 ...

  9. 整理uc/os的46个函数

    Void OSInit(void); 所属文件 OS_CORE.C     调用者 启动代码    开关量 无 OSinit()初始化μC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之 ...

最新文章

  1. 关于armv7指令集的一个直观数据
  2. 法语语言考试C1,法语考试大比拼:专八与Dalf C1,哪个更难?
  3. hdu 2709 递推
  4. 多重纹理和纹理组合器
  5. mysql sakila world_MySQL 安装示例数据库(employee、world、sakila、menagerie 等)
  6. 准备进入股市炒股,资金10万,各位能否给点建议?
  7. Go 语言为什么能成功?
  8. android源码国内镜像,Fuchsia OS 源代码国内镜像上线
  9. 【DataOps】- 数据开发治理一体化之网易数帆数据治理2.0实践分享
  10. 软件工程_三层架构介绍
  11. 复杂网络作业四:第三题——随机图、小世界网络和真实网络的度分布
  12. Python对文件进行重命名
  13. touchID 和 FaceID~2
  14. 牛逼的Python库MoviePy!利用Python自动剪辑tiktok视频!
  15. 美国犹他大学计算机专业怎么样,2018美国计算机工程专业排名一览表
  16. 中国计算机学会(CCF)推荐中文科技期刊目录(2019年)
  17. UNIX操作系统学习(一)
  18. 发展零碳的重要支柱——光储直柔
  19. 工业智能网关BL110应用之64:如何实现智能楼宇控制BACnet 接入金鸽MQTT云平台
  20. Observability:你所需要知道的关于 Syslog 的一些知识

热门文章

  1. 关于 Unix 命令 `yes` 的小故事
  2. Echarts案例学习-渐变堆积面积图
  3. dcloud IOS 网络不通问题
  4. C语言数组指针和指针数组实例演示
  5. Sharepoint 最终作用是什么
  6. 里程碑|BSV交易总量突破10亿笔
  7. 一个水塘,你有一个5升的瓶子,一个6升的瓶子,怎么装出3升的水
  8. vue项目中 npm使用淘宝镜像方法记录cnpm
  9. linux的vi编辑器计算工具,2018-1-2Linux基础知识(19)vi编辑器及bash算数
  10. SAP SD-销售模式-寄售(客户寄售)不通过销售订单调拨