uCOS OSTaskCreate()函数分析[通俗易懂]

uCOS OSTaskCreate()函数分析[通俗易懂]INT8U OSTaskCreate(void(*task)(void*pd), void*p_arg,OS_STK*ptos,INT8Uprio);函数返回一个8位的整型数,调用该函数需要四个参数。第一个参数一个指针,也就是用户代码的首地址,在平时使用中我们把自己创建的任务的名字作为这个参数就可以了;第三个参数是指向任务堆栈栈顶的指针,通常我们把创建的任务的堆栈数组的首地址

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

INT8U  OSTaskCreate (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT8U prio)

;函数返回一个8位的整型数,调用该函数需要四个参数。第一个参数一个指针,也就是用户代码的首地址,在平时使用中我们把自己创建的任务的名字作为这个参数就可以了;第三个参数是指向任务堆栈栈顶的指针,通常我们把创建的任务的堆栈数组的首地址给第三个参数就可以了;第四个参数是任务的优先级;第二个参数是什么意思?还不太理解。

    OS_STK    *psp;
    INT8U      err;                                ;创建一个指向数据类型为OS_STK的指针和一个8位的整型数

#if OS_ARG_CHK_EN > 0
    if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
        return (OS_PRIO_INVALID);
    }
#endif
;判断该任务的优先级是否有效

   OS_ENTER_CRITICAL();
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn’t already exist at this priority  */
        OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing …  */
                                             /* … the same thing until task is created.              */
        OS_EXIT_CRITICAL();                      ;判断该优先级是否被占用

;优先级未被占用,执行以下程序
        psp = (OS_STK *)OSTaskStkInit(task, p_arg, ptos, 0);     ;初始化堆栈
        err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);   ;初始化任务控制块
        if (err == OS_NO_ERR) {

            OS_ENTER_CRITICAL();
            OSTaskCtr++;                                        /* Increment the #tasks counter        */
            OS_EXIT_CRITICAL();
            if (OSRunning == TRUE) {         /* Find highest priority task if multitasking has started */
                OS_Sched();                          ;此时OSRunning 等于假,也就是在创建任务的时候并不能引发任务调度仅                                                             ;仅是创建任务而已。
            }
        } else {                                         ;该优先级已经被占用,则只把该任务优先级释放掉
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
            OS_EXIT_CRITICAL();
        }
        return (err);

    }
    OS_EXIT_CRITICAL();
    return (OS_PRIO_EXIST);
}
综上所述,创建任务时的主要工作是:第一,判断该优先级是否有效;第二判断该优先级是否被占用,若被占用则释放掉该优先级并返回OS_PRIO_EXIST;第三,若优先级未被占用,就初始化任务堆栈和任务控制块,初始化任务控制块返回正确信息时,将 OSTaskCtr加1;第四,判断OSRunning,为真就引发一次任务调度,为假则程序结束。

似乎在创建任务的时候OSRunning值为假,所以创建任务的时候,不会引发一次任务调度。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196848.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 内部服务器500错误原因解决方法_网站500服务器内部错误

    内部服务器500错误原因解决方法_网站500服务器内部错误今天网友发一远程协助,重启exchange2013后无法访问管理中心,提示“HTTP500内部服务器错误”,一开始以为是服务的问题,重启IIS仍然报错,后来通过查资料终于把问题解决了,现将整过过程记录下来,供后期遇到同来问题的朋友参考。1、访问出错图:2、解决方法:打开ExchangeManagementShell,运行以下命令禁用邮箱后再启用邮…

    2022年8月11日
    8
  • virtualbox怎么安装windows10_安装ubuntu教程

    virtualbox怎么安装windows10_安装ubuntu教程步骤1:下载WindowsXP镜像GhostXP镜像下载地址本教程使用的是电脑公司GHOSTXPSP3步骤2:创建WindowsXP虚拟机步骤3:安装WindowsXP系统重启

    2022年8月2日
    11
  • python里的def 方法中->代表什么意思?

    python里的def 方法中->代表什么意思?功能注释函数注释是关于用户定义函数使用的类型的完全可选元数据信息(请参阅PEP3107和 PEP484了解更多信息)。注释__annotations__ 作为字典存储在函数

    2022年7月6日
    26
  • 数据库简介与 Mysql 服务基础「建议收藏」

    数据库简介与 Mysql 服务基础「建议收藏」文章目录一、数据库系统发展史二、数据库基本概念一、数据库系统发展史第一代数据库自20世纪60年代起,第一代数据库系统问世是层次模型与网状模型的数据库系统为统—管理和共享数据提供了有力的支撑第二代数据库20世纪70年代初,第二代数据库——关系型数据库开始出现20世纪80年代初,IBM公司的关系型数据库系统DB2问世,开始逐步取代层次与网状模型的数据库,成为行业主流到目前为止,关系型数据库系统仍占领数据库应用的主要地位第三代数据库自20世

    2022年7月27日
    12
  • 硬盘没有初始化怎么恢复数据_初始化磁盘崩溃转储怎么处理

    硬盘没有初始化怎么恢复数据_初始化磁盘崩溃转储怎么处理没有初始化是因为分区表损坏了,导致硬盘出现没有初始化。磁盘显示没有初始化恢复数据办法工具/软件:光明数据恢复软件步骤1:软件运行后,直接双击需要恢复文件的磁盘。步骤2:坐等软件扫描完毕大概需要几分钟到半个小时,稍微耐心等下即可。步骤3:勾上所有需要恢复的数据,然后点右上角的保存,《另存为》按钮,将勾上的文件COPY出来。步骤4:等待软件将资料复制完成就可以了。注意事项1:没有初始化恢复出来的资料需要暂时保存到其它盘里。注意事项2:想要恢复没有初始化需要注意,在文件找到之前,不要

    2022年9月21日
    3
  • jmeter正则提取器的使用_java正则表达式用法

    jmeter正则提取器的使用_java正则表达式用法一、正则表达式提取器各名词解(1)ApplytoMainsampleandsub-samples(作用于主节点的取样器及对应子节点的取样器)Mainsampleonly(仅作用于主节点的取样器)Sub-samplesonly(仅作用于子节点的取样器)Jmeter-VariableNametouse(作用于jmeter变量(输入框内可输入jmeter的变量名称),从指定变量值中提取需要的值)(2)要检查的响应字段1、主体:响应报文的主体,最常用2、Body(une.

    2025年10月22日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号