|
任务的建立有两个函数,OSTaskCreate和OSTaskCreateExt- #if OS_TASK_CREATE_EXT_EN > 0
- 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)
- {
- OS_STK *psp;
- INT8U err;
- #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
- OS_CPU_SR cpu_sr = 0;
- #endif
- #if OS_ARG_CHK_EN > 0
- if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
- return (OS_ERR_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) { /* Make sure task doesn't already exist at this priority */
- OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ... */
- /* ... the same thing until task is created. */
- OS_EXIT_CRITICAL();
- #if (OS_TASK_STAT_STK_CHK_EN > 0)
- OS_TaskStkClr(pbos, stk_size, opt); /* Clear the task stack (if needed) */
- #endif
- psp = OSTaskStkInit(task, p_arg, ptos, opt); /* Initialize the task's stack */
- err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
- if (err == OS_ERR_NONE) {
- if (OSRunning == OS_TRUE) { /* Find HPT if multitasking has started */
- OS_Sched();
- }
- } else {
- OS_ENTER_CRITICAL();
- OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Make this priority avail. to others */
- OS_EXIT_CRITICAL();
- }
- return (err);
- }
- OS_EXIT_CRITICAL();
- return (OS_ERR_PRIO_EXIST);
- }
- #endif
复制代码 相比OSTaskCreate函数而言, 多了一段代码;这段代码从字面上就可以看出其作用是清零任务的堆栈。
#if (OS_TASK_STAT_STK_CHK_EN > 0)
OS_TaskStkClr(pbos, stk_size, opt); /* Clear the task stack (if needed) */
#endif
还有一点不同的是,在TCB模块的初始化时,会将 id, stk_size, pext, opt这些参数写进去;而OSTaskCreate函数
都是默认写0;具体这些参数有什么用,还不是很清楚,继续研究代码和原理 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|