FreeRTOS(V8.0.1)系统之xTaskGenericCreate()

basetype_t xtaskgenericcreate( taskfunction_t pxtaskcode, // 指向任务的入口函数. 任务必须执行并且永不返回 (即:无限循环).const char * const pcname, //描述任务的名字。主要便于调试。最大长度由configmax_task_name_len.定义const uint16_t usstackdepth, //指定任务堆栈的深度void * const pvparameters, //指针用于作为一个参数传向创建的任务ubasetype_t uxpriority, //任务运行时的优先级taskhandle_t * const pxcreatedtask, //pxcreatedtask 用于传出任务的句柄。这个句柄将在api 调用中对该创建出来的任务进行引用,比如改变任务优先级,或者删除任务。//如果应用程序中不会用到这个任务的句柄,则pxcreatedtask 可以被设为nullstacktype_t * const puxstackbuffer, //堆栈缓冲区const memoryregion_t * const xregions ) // 缓存区/*lint !e971 unqualified char types are allowed for strings and single characters only. */{basetype_t xreturn;tcb_t * pxnewtcb; configassert( pxtaskcode ); configassert( ( ( uxpriority & ( ~portprivilege_bit ) ) pxstack;//新建的堆栈是空的,所以堆栈的栈顶就在起始地址处(正生堆栈) configassert( ( ( ( uint32_t ) pxnewtcb->pxstack & ( uint32_t ) portbyte_alignment_mask ) == 0ul ) ); //如果要做堆栈检查,就要知道堆栈的另一端界限在哪里 pxnewtcb->pxendofstack = pxnewtcb->pxstack + ( usstackdepth - 1 ); } #endif //设置新的tcb,将其置于初始化状态 prvinitialisetcbvariables( pxnewtcb, pcname, uxpriority, xregions, usstackdepth ); //初始化堆栈,使得任务好像被中断函数中断了一样,中断返回地址就是任务的首地址,与 uc/os-ii 的方式相同 //依次将xpsr、pc、lr、r12以及r0-r3初始化 #if( portusing_mpu_wrappers == 1 ) { pxnewtcb->pxtopofstack = pxportinitialisestack( pxtopofstack, pxtaskcode, pvparameters, xrunprivileged ); } #else { pxnewtcb->pxtopofstack = pxportinitialisestack( pxtopofstack, pxtaskcode, pvparameters ); } #endif if( ( void * ) pxcreatedtask != null )//若需要返回任务句柄 { //返回任务的句柄 *pxcreatedtask = ( taskhandle_t ) pxnewtcb; } else { mtcoverage_test_marker(); } //当正在更新时确保中断不会打断任务链表 taskenter_critical(); { uxcurrentnumberoftasks++;//系统任务数目加一 if( pxcurrenttcb == null )//若当前任务tcb为空,即没有任务 { //没有其他任务或者其他任务都被挂起,将刚创建的任务变成当前任务 pxcurrenttcb = pxnewtcb; if( uxcurrentnumberoftasks == ( ubasetype_t ) 1 )//若系统中任务的数目为1,即这个任务是第一个任务 { //如果这是第一个任务,就做初始化工作,uc/os-ii 有单独的初始化函数,freertos 没有,初始化工作放在这里 prvinitialisetasklists(); } else { mtcoverage_test_marker(); } } else//若当前任务tcb不为空,即存在相应任务 { //若调度器已经没有运行,若新建任务的优先级为到目前为止的最高优先级即将其设为当前任务 if( xschedulerrunning == pdfalse )//系统调度器没有运行 { if( pxcurrenttcb->uxpriority uxtcbnumber = uxtasknumber;//将任务数量保存到tcb中,主要用以调试。 } #endif tracetask_create( pxnewtcb ); prvaddtasktoreadylist( pxnewtcb );//将新建任务插入到就绪链表中。 xreturn = pdpass;//返回值为成功 portsetup_tcb( pxnewtcb ); } taskexit_critical(); } else//若tcb为空,即分配不成功 { xreturn = errcould_not_allocate_required_memory;//返回值为不能成功分到要求的内存空间 tracetask_create_failed(); } if( xreturn == pdpass )//若返回值为成功,即能够创建好任务 { if( xschedulerrunning != pdfalse )//若任务调度器正在运行 { //若当前任务的优先级小于新建任务的优先级 if( pxcurrenttcb->uxpriority < uxpriority ) { taskyield_if_using_preemption();// 新任务比当前正在运行的任务优先级高,因此要做任务调度 } else { mtcoverage_test_marker(); } } else { mtcoverage_test_marker(); } } return xreturn;//将任务的返回值送出。}原文链接:

2021年1月份全球半导体销售的同比和环比都有所增长
LG Display将为苹果iPhone6提供高分辨率的LCD屏幕
使用URL2Video可以将网页快速生成有创意的短视频
变频器案例之梳棉机应用
五种基于PON的FTTX接入比较
FreeRTOS(V8.0.1)系统之xTaskGenericCreate()
村田电感的工作原理
数控机床编程入门
中国工业机器人迈入全球战场
如何测试FPGA的供电电源
关于MPS-C/H中薄板激光切割解决方案的分析和介绍
TP-Link公布新款WiFi6 Mesh路由 最多可覆盖多达557平米的空间
军拓铁腕5户外手表体验 同时多项运动跑功能也能满足平时偶尔的运动需求
一种PLC控制的自动换向型电镀电源
RFID技术在航空中的应用/维修和航材管理
恩智浦推出改进型LED灯的数款新型LED驱动器IC
杰美特创办的手机壳制造企业,5年内第三次冲击IPO
高通:物联网玩法不同于手机市场
英特尔披露10纳米Ice Lake架构处理器细节
关于固体绝缘环网柜的种类剖析