uC/OS-III任务创建函数OSTaskCreate()

uCOSIII实时操作系统 五 任务API(任务创建和删除) 引入:一个任务的三要素是任务主体函数,任务栈,任务控制块,那么怎样吧这个三要素联系在一起呐? 阅读详情

uC/OS-III任务创建函数OSTaskCreate()

欢迎进入linuxweiyh的博客

1.OSTaskCreate()函数原型

void TaskCreate(OS_TCB *p_tcb,  // 任务控制OS_TCB的地址
    CPU_CHAR *p_name,           // 任务的名字
    OS_TASK_PTR p_task,         // 任务代码的起始地址
    void *p_arg,                // 任务第一次运行时接收到的参数
    OS_PRIO prio,               // 任务优先级
    CPU_STK *p_stk_base,        // 任务栈的基地址,基地址总是栈空间的最低地址
    CPU_STK_SIZE stk_limit,     // 任务栈的深度标记
    CPU_STK_SIZE stk_size,      // 任务栈的大小
    OS_MSG_QTY q_size,          // 任务内部消息队列的大小
    OS_TICK time_quanta,        // 时间片轮转的长度
    void *p_ext,                // 用户补充的存储区
    OS_OPT opt,                 // 任务特定选项
    OS_ERR *p_err)              // 错误码

注1:这里最需要注意的参数是任务栈的基地址,这里的基地址指的是栈空间的最低地址,即???Stk[0]的地址。
注2:在uC/OS-II:的OSTaskCreate()函数中,描述有关栈的参数是栈顶地址,不是栈的基地址。
注3:深度标记stk_limit表示的是栈剩余空间,不需要管栈的增长方向,是多少就是多少,uC/OS-III内部会自己转换。当栈的剩余空间小于栈的深度标记时会报警。
2.OSTaskCreate()函数代码解析

void  OSTaskCreate (OS_TCB        *p_tcb,
                    CPU_CHAR      *p_name,
                    OS_TASK_PTR    p_task,
                    void          *p_arg,
                    OS_PRIO        prio,
                    CPU_STK       *p_stk_base,
                    CPU_STK_SIZE   stk_limit,
                    CPU_STK_SIZE   stk_size,
                    OS_MSG_QTY     q_size,
                    OS_TICK        time_quanta,
                    void          *p_ext,
                    OS_OPT         opt,
                    OS_ERR        *p_err)
{
    CPU_STK_SIZE   i;
#if OS_CFG_TASK_REG_TBL_SIZE > 0u
    OS_OBJ_QTY     reg_nbr;
#endif
    CPU_STK       *p_sp;
    CPU_STK       *p_stk_limit;
    CPU_SR_ALLOC();

#ifdef OS_SAFETY_CRITICAL
    if (p_err == (OS_ERR *)0) {
        OS_SAFETY_CRITICAL_EXCEPTION();
        return;
    }
#endif

#ifdef OS_SAFETY_CRITICAL_IEC61508
    if (OSSafetyCriticalStartFlag == DEF_TRUE) {
       *p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME;
        return;
    }
#endif

    // 不允许在ISR中创建任务
#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u  
    if (OSIntNestingCtr > (OS_NESTING_CTR)0) {              
        *p_err = OS_ERR_TASK_CREATE_ISR;
        return;
    }
#endif

    // 形参检测
#if OS_CFG_ARG_CHK_EN > 0u  
    if (p_tcb == (OS_TCB *)0) {              // 任务控制块
        *p_err = OS_ERR_TCB_INVALID;
        return;
    }
    if (p_task == (OS_TASK_PTR)0) {          // 任务起始地址
        *p_err = OS_ERR_TASK_INVALID;
        return;
    }
    if (p_stk_base == (CPU_STK *)0) {        // 栈的基地址                     
        *p_err = OS_ERR_STK_INVALID;
        return;
    }
    if (stk_size < OSCfg_StkSizeMin) {      // 栈的大小                      
        *p_err = OS_ERR_STK_SIZE_INVALID;
        return;
    }
    if (stk_limit >= stk_size) {             // 栈的深度标记                    
        *p_err = OS_ERR_STK_LIMIT_INVALID;
        return;
    }
    if (prio >= OS_CFG_PRIO_MAX) {           // 任务优先级                        
        *p_err = OS_ERR_PRIO_INVALID;
        return;
    }
#endif

    // 任务的优先级检测
#if OS_CFG_ISR_POST_DEFERRED_EN > 0u
    if (prio == (OS_PRIO)0) {
        if (p_tcb != &OSIntQTaskTCB) {
            *p_err = OS_ERR_PRIO_INVALID;              // 不允许任务的优先级为0
            return;
        }
    }
#endif
    if (prio == (OS_CFG_PRIO_MAX - 1u)) {
        if (p_tcb != &OSIdleTaskTCB) {                 // 不允许与空闲任务的优先级相同
            *p_err = OS_ERR_PRIO_INVALID;       
            return;
        }
    }

    // 初始化任务控制块(OS_TCB)
    OS_TaskInitTCB(p_tcb);

    *p_err = OS_ERR_NONE;

    // 清空任务栈
    if ((opt & OS_OPT_TASK_STK_CHK) != (OS_OPT)0) {      // 是否使能任务栈检测
        if ((opt & OS_OPT_TASK_STK_CLR) != (OS_OPT)0) {  // 任务栈是否必须清空   
            p_sp = p_stk_base;
            for (i = 0u; i < stk_size; i++) {            // 栈的增长方向是从高到低
                *p_sp = (CPU_STK)0;                      // 从低到高清空栈
                p_sp++;
            }
        }
    }

   // 初始化栈的深度标记
#if (CPU_CFG_STK_GROWTH == CPU_STK_GROWTH_HI_TO_LO)
    p_stk_limit = p_stk_base + stk_limit;
#else
    p_stk_limit = p_stk_base + (stk_size - 1u) - stk_limit;
#endif

    // 初始化栈
    p_sp = OSTaskStkInit(p_task,
                         p_arg,
                         p_stk_base,
                         p_stk_limit,
                         stk_size,
                         opt);

    // 初始化OS_TCB
    p_tcb->TaskEntryAddr = p_task;       // 保存任务入口地址
    p_tcb->TaskEntryArg  = p_arg;        // 保存任务参数
    p_tcb->NamePtr       = p_name;       // 保存任务名称
    p_tcb->Prio          = prio;         // 保存任务优先级
    p_tcb->StkPtr        = p_sp;         // 保存栈顶地址
    p_tcb->StkLimitPtr   = p_stk_limit;  // 保存栈深度标记
    p_tcb->TimeQuanta    = time_quanta;  // 保存任务时间片
#if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
    if (time_quanta == (OS_TICK)0) {
        p_tcb->TimeQuantaCtr = OSSchedRoundRobinDfltTimeQuanta;
    } else {
        p_tcb->TimeQuantaCtr = time_quanta;
    }
#endif
    p_tcb->ExtPtr        = p_ext;        // 保存额外的TCB结构
    p_tcb->StkBasePtr    = p_stk_base;   // 保存栈的基地址 
    p_tcb->StkSize       = stk_size;     // 保存栈的大小
    p_tcb->Opt           = opt;          // 保存任务可选项

#if OS_CFG_TASK_REG_TBL_SIZE > 0u
    for (reg_nbr = 0u; reg_nbr < OS_CFG_TASK_REG_TBL_SIZE; reg_nbr++) {
        p_tcb->RegTbl[reg_nbr] = (OS_REG)0;
    }
#endif

#if OS_CFG_TASK_Q_EN > 0u
    OS_MsgQInit(&p_tcb->MsgQ,                               /* Initialize the task's message queue                    */
                q_size);
#endif

    OSTaskCreateHook(p_tcb);              // 调用用户定义的介入函数

    // 把任务添加到任务就绪表中
    OS_CRITICAL_ENTER();                  // 进入临界区
    OS_PrioInsert(p_tcb->Prio);           // 向任务表中添加任务优先级
    OS_RdyListInsertTail(p_tcb);

#if OS_CFG_DBG_EN > 0u
    OS_TaskDbgListAdd(p_tcb);
#endif

    OSTaskQty++;  // Increment the #tasks counter

    if (OSRunning != OS_STATE_OS_RUNNING) {  // Return if multitasking has not started
        OS_CRITICAL_EXIT();               // 退出临界区
        return;
    }

    OS_CRITICAL_EXIT_NO_SCHED();          // 退出临界区

    OSSched();                            // 调度
}

总结:OSTaskCreate()函数主要的工作是初始化任务控制块、初始化栈、添加任务到任务任务就绪表。
注:由于目前对uC/OS-III的理解不是很透彻,所以只能做部分注释,以后会逐步增加。

TI-RTOS---Tasks 文章目录Creating TasksCreating and Deleting Tasks DynamicallyCreating Tasks StaticallyTask Execution and SchedulingTask Stacks SYS/BIOS任务对象是由任务模块管理的线程。任务的优先级高于空闲循环,而优先级低于硬件和软件中断。 任务模块是根据任务的优先级和任务的当前执行状态动态地调度和抢占任务。这样可以确保处理器始终被分配给准备运行地最高优先级线程,有多达32个优先级可用于任务,默认级别 阅读详情

相关推荐

UCOSII系统任务管理和事件控制

一,任务状态: 多任务操作系统最重要的就是对任务进行管理,包括任务的创建,挂起,删除和调度。UCOSII只支持单核cpu,因此在某一时刻只有一个任务获得cpu使用权,其他任务就会进入其他状态。 二,UCOSII系统任务管理 1,任务创建:OSTaskCreate()函数,参数如下 参数1:任务的函数名:其实就是为了在任务切换的时候跳转到任务中执行的入口地址。 参数2:传递给建立任务的参数,这个参数基本不会用到。 参数3:传递给建立任务的堆栈,每个任务都有独一无二的堆栈。 参数4:传递给任务的优先级

wangjie36的博客 1611

UCOSIII os_task函数

UCOSIII OS_TASK

cocoklng的博客 1296

uC/OS-III任务创建工程化实践:从LED验证到多任务协同

实时操作系统(RTOS)的核心在于以任务为单位的并发调度与资源管理。理解任务创建原理,是掌握uC/OS-III等嵌入式RTOS应用开发的基础。其本质涉及静态内存分配、上下文切换机制、优先级调度策略及系统启动时序控制。技术价值体现在确定性响应、内存安全与可预测的实时行为,广泛应用于工业控制、汽车电子和物联网终端等对可靠性要求严苛的场景。本文聚焦STM32平台下uC/OS-III的任务创建全流程,涵盖BSP初始化、TCB与栈的静态配置、OSTaskCreate()参数详解、多任务协同设计及典型陷阱规避,特别强化

weixin_35516273的博客 42

OSTaskCreate()函数分析

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

silenceee的专栏 1万+

uC/OS-III任务创建与删除机制深度解析

在嵌入式实时操作系统(RTOS)中,任务是调度与执行的基本单元,其本质是具备独立上下文、堆栈和控制块(TCB)的内核托管实体。理解任务的创建与删除机制,需掌握TCB内存生命周期、堆栈安全边界及优先级抢占原理。技术价值在于保障系统实时性、内存安全与资源可回收性;典型应用场景包括多任务协同控制、动态任务管理及按键触发的任务启停。本文以uC/OS-III为范例,结合STM32平台实践,深入剖析OSTaskCreate与OSTaskDel的底层行为、临界区保护策略及SysTick节拍源配置,揭示任务管理中易被忽略却

weixin_26854475的博客 35

uC/OS-III任务机制深度解析:调度、状态与API实践

在嵌入式实时操作系统中,任务是实现并发控制与确定性响应的核心抽象,其本质是封装CPU时间片、栈空间与上下文的最小可调度单元。基于优先级的抢占式调度通过硬件寄存器(如BASEPRI)和CLZ指令保障O(1)调度复杂度,支撑毫秒级确定性响应;七状态机(就绪、运行、等待、挂起等)则为任务生命周期提供精确建模,使开发者能清晰掌控资源等待、中断嵌套与人工暂停等关键语义。结合TCB、独立栈与任务函数体的三元结构,该机制既保证强隔离性,又支撑多任务协同场景——如温湿度监控系统中传感器采集、数据处理与串口上报的优先级分层与

weixin_35516273的博客 39

【μC/OS-Ⅲ】μC/OS-Ⅲ OSTaskCreate()函数

OSTaskCreate()函数,任务创建

好好休息.. 1131

SAP系统从ECC升级至S/4 HANA的实现路径及项目过程

从SAP ECC升级到 S/4 HANA,通常是一个复杂的转型过程,涉及到企业资源规划系统的全面现代化

saplakes的博客 2904

uC/OS-III-7.2-uC/OS-III添加任务到就绪队列

1.uC/OS-III提供很多服务可以把任务添加到就绪列表中。 最明显的服务是OSTaskCreate(), 它通常创建准备运行的任务并将任务放入就绪列表中。如图6-6所示,就绪列表中该优先级中已经有两个任务了。OSTaskCreate()就会将这个任务插入到列表的未部。 ( 1).在调用OSTaskCreate()之前, 已经有两个任务在就绪列表中的该优先级中了。 ( 2).一个新的TC...

西贡小傻 463

【一】PCIe基础知识

Linux PCIe基础知识

他山之石 可以攻玉 4万+

CCS导入工程报错?手把手教你安装C2000编译器(附最新下载链接)

本文详细解析CCS导入工程报错的常见原因,并提供三种安装C2000编译器的解决方案(TI官网离线安装、CCS内置更新和App Center渠道)。通过版本匹配技巧和路径配置要点,帮助开发者快速解决编译器缺失问题,确保项目顺利导入和编译。

weixin_30374009的博客 664

uC/OS任务创建函数OSTaskCreate ()参数详解

要使用uC/OS的任务必须先声明任务控制块和创建任务,调用OSTaskCreate ()函数可以创建一个任务。OSTaskCreate ()函数的信息如下表所示。

hanchaoman的专栏 5083

西门子V90 PN伺服控制核心:FB284功能块详解与实战

在工业自动化中,伺服定位控制是运动控制的基础环节,其本质是PLC通过PROFINET协议与伺服驱动器实现高速、确定性数据交互。FB284作为西门子为V90 PN定制的标准化功能块,封装了GSD映射、状态机管理与周期性PDO同步机制,将底层寄存器操作抽象为高可靠调用接口。相比MOVE指令或MC_MoveAbsolute等通用方案,FB284显著降低时序错乱风险,提升多轴同步精度与故障响应能力。它广泛应用于包装、灌装、装配等中端产线,尤其适配S7-1200/1500平台下的快速部署与现场维护。本文聚焦V90 P

weixin_42696271的博客 300

uc/os-iii学习笔记-OSTaskCreate

必须为该任务分配一个任务控制块(OS_TCB)。 static OS_TCB AppTaskStartTCB 每个任务都必须有属于自己的栈(CPU_STK)。 static CPU_STK AppTackStartStk[APP_TASK_START_STK_SIZE] 举例 void main(void) { OS_ERR err; BSP_InitDisALL

JosephGodVim的博客 3369

Fofa API高阶玩法:用Python批量获取漏洞资产(含OA系统扫描实战)

本文详细介绍了如何利用Python结合Fofa API实现自动化漏洞资产收集的高阶实战技巧。通过构建健壮的客户端、设计精准查询语法、实现多线程批量采集,并以OA系统漏洞扫描为例,演示了从资产发现、过滤验证到报告生成的全流程,旨在提升安全运维与应急响应的效率。

weixin_28607671的博客 498

开源AI数字人DUIX:从零构建你的智能交互助手

本文详细介绍了如何利用开源AI数字人DUIX从零构建智能交互助手。文章阐述了DUIX作为开源项目的核心优势,包括低成本启动、低网络依赖和高度可定制性,并提供了从开发环境搭建、核心模块(AI模型、语音、形象)配置到个性化业务逻辑开发与最终部署的完整实践指南,帮助开发者快速掌握构建专属AI数字人的全流程。

weixin_29051811的博客 505

基于STM32CubeMX与uC/OS-III的多任务LED控制实战

本文详细介绍了基于STM32CubeMX与uC/OS-III实现多任务LED控制的实战教程。通过环境搭建、系统移植、任务创建与调试等步骤,帮助开发者掌握实时操作系统在嵌入式开发中的应用,提升多任务调度与资源管理能力。

brown的博客 530

TC8:SOMEIPSRV_SD_MESSAGE_07-09

TTL为服务实例的生命周期。在此生命周期之后,不提供服务实例。

jasonj333 908

UCOS的任务创建和删除

UCOS(实时操作系统)的任务创建和删除

m0_73931287的博客 903

LVGL v8学习笔记 | 09 - 进度条控件的使用方法(bar)

lv_bar_set_range必须放在lv_bar_set_mode前面,否则不生效。bar对象的API在lv_bar.h中声明,以lv_bar_xxx命名。此事件可以用来在进度条更新值之后更新别的控件(比如进度条旁边的文字)。可以看到,默认创建的进度条值是0到100。(3)设置进度条的范围值(最大值和最小值)(2)获取进度条的起始值。(3)获取进度条的最小值。(4)获取进度条的最大值。(1)设置进度条的当前值。(2)设置进度条的起始值。(1)获取进度条当前值。(5)获取进度条的模式。

Mculover666的博客(嵌入式) 1730

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【17】从0到1教你写uC/OS-III————>支持多优先级

简述: 本章之前OS还没有用到优先级,只支持两个任务相互切换; 本章之后加入优先级功能,在uC/OS-III中,数字优先级越小,逻辑优先级越高; 修改之前如下几个函数: OSInit(); 任务控制块TCB; 任务创建OSTaskCreate(); 空闲函数OS_Idle_TaskInit(); 系统启动函数OSStart(); 任务切换PendSV_H...

Dream Catcher 414

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

STM32F103C8T6基于HAL库移植uC/OS-III

UCOS是Micrium公司出品的RTOS类实时操作系统, UCOS目前有两个版本:UCOSII和UCOSIII。UCOSIII是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制,提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。UCOSIII是用C和汇编来写的,其中绝大部分都是用C语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的, UCOSIII结构简洁,可读性很强!非常适合初次接触嵌入式实时操作系统学生、嵌入式系统开发人员和爱好者学习。什么是任务?

2201_75737320的博客 1020

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【学习】uC/OS-III 任务的定义与任务切换的实现

在裸机系统中,除全局变量以外,他们统统放在一个叫栈的地方,栈是单片机 RAM 里面一段连续的内存空间,栈的大小由启动文件里面的代码配置。而且裸机系统中需要使用栈的时候可以天马行空,随便在栈里面找个空闲的空间使用。但是,在多任务系统中,每个任务都是独立的,互不干扰的,所以要为每个任务都分配独立的栈空间,这些一个个的任务栈也是存在于 RAM 中。多任务系统中任务的堆栈就是在统一的一个栈空间里面分配好一个个独立的房间,每个任务只能使用各自的房间。 一、如何创建任务 主要流程: 1、定义任务堆栈 2、定义任务函

qq_45689790的博客 744

uC/OS-III-4.1-uC/OS-III单任务应用

1.单任务应用 app.c文件: (1).APP_CFG.H 是用于配置的头文件。例如, APP_CFG.H 中包含的#define常量确定了任务优先级,堆栈大小,以及其他特性。 BSP.H 是 BSP 的头文件,包含了 #define 及函数原型如BSP_Init(),,SP_LED_On(), OS_TS_GET()等。 OS.H是uC/OS-III的主要头文件,包含了以下头文件:...

西贡小傻 276

uc/os-ii应用程序中函数的调用关系

<br />应用程序中函数的调用关系<br />#include  “includes.h”<br />#define  TASK_STK_SIZE  512                     // 定义堆栈长度(1024字节)<br />OS_STK TaskStk[TASK_STK_SIZE];          // 定义一个数组来作为任务堆栈<br /> <br /> void main()<br />{ <br />       …… <br />           OSInit(); /

kulaozong的专栏 1252

uc/OS移植到stm32实现三个任务

本次实践学习到了关于如何将uc/OS其移植到stm32F103上。

weixin_74316506的博客 1465
上一篇: 编程知识总结
下一篇: uC/OS-III的任务管理
linuxweiyh
博客等级 码龄11年 171粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值