OSTaskCreateExt分析

OSTaskCreateExt函数原型:

INT8U         OSTaskCreateExt         (void           (*task)(void *p_arg),
                                       void            *p_arg,
                                       OS_STK          *ptos,
                                       INT8U            prio,
                                       INT16U           id,
                                       OS_STK          *pbos,
                                       INT32U           stk_size,
                                       void            *pext,
                                       INT16U           opt);


task:某任务的函数名,也就是该任务的起始地址,task是个函数指针,该函数形参为指向void类型的p_arg的指针,返回值为void

p_arg:上述任务的形参指针,指向void*类型

ptos:该任务的堆栈栈顶指针。注意cpu的堆栈生长方向。

prio:该任务的任务优先级。

id:该任务的任务ID

pbos:该任务的堆栈栈底指针

stk_size:该任务的堆栈长度

pext:后期补上

opt:后期补上

需要先了解OS_TCBInit()和OS_Sched()

整个函数流程:

1、检查该任务的优先级是否大于最低优先级,(数值越小,优先级越高)。

2、检查临界段的保护方式,默认方式3,即将异常掩蔽寄存器(PRIMASK)保存在局部变量中,R0默认为函数的返回值

3、关中断,检查中断嵌套次数是否大于0,大于0,则退出任务建立函数---大于0,表明有未结束的中断,不需要建立任务。在中断中执行任务调度,可能导致中断无法返回

4、检查该任务ID、优先级是否被占用,若没有被占用,临时占用该任务ID;若被占用,报错返回(任务控制块指针数组的某项写入非0指针,表明占用,后续写入实际的控制块指针)

5、任务ID、优先级可用:

       1、开中断。

      2、当使能了堆栈检查,则调用OS_TaskStkClr()函数,该函数仅仅实现了任务堆栈检查及堆栈清空,并且考虑到了堆栈的生长方向

      3、任务堆栈初始化,将默认的值填入堆栈结构中OSTaskStkInit();返回值是栈顶指针(堆栈中已经将CPU各个寄存器的值预先设定,等待出栈后送入相应的寄存器)

      4、任务控制块初始化。OS_TCBInit()。该函数解析转至下一篇博文。初始化成功,设定OSRunning标志,并进行任务调度OS_Sched();该函数见其他博文。

     5、不成功,则关闭中断,释放临时占用的该任务ID。

6、开中断,返回




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值