Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
开局一张图。一步一步分析就好。
(一)什么是任务?
在多任务系统中,我们按照功能不同,把整个系统分割成一个个独立的,且无法返回的函数,这个函数我们称为任务;任务包含几个属性:任务堆栈,任务函数、任务控制块、任务优先级;下面主要介绍一下任务控制块,其他都比较容易理解。
(二)什么是任务控制块?
任务控制块内包含了该任务的全部信息,任务的执行需要通过任务调度器来控制,那么任务调度器怎么“控制”任务实体的呢?就要抓住任务的小辫子—“任务控制块”,系统对任务的全部操作都可以通过任务控制块来实现!它是一种特别的数据结构。
在任务创建函数xTaskCreat()创建任务的时候就会自动给每个任务分配一个任务控制块。
复制代码
typedef struct tskTaskControlBlock
{
volatile StackType\_t *pxTopOfStack; /*任务堆栈栈顶指针*/
#if ( portUSING\_MPU\_WRAPPERS == 1 )
xMPU\_SETTINGS xMPUSettings; /*MPU相关设置*/
#endif
ListItem\_t xStateListItem; /*状态列表项,这是一个内置在TCB控制块中的一个链表节点,通过这个节点,将任务挂到其他链表中 比如就绪列表,阻塞列表,挂起列表等*/
ListItem\_t xEventListItem; /*事件列表项,用于引用事件列表中的任务*/
UBaseType\_t uxPriority; /*任务优先级*/
StackType\_t *pxStack; /*任务堆栈起始地址,是一个栈底*/
char pcTaskName[ configMAX\_TASK\_NAME\_LEN ]; /*任务名字*/
#if ( portSTACK\_GROWTH > 0 )
StackType\_t *pxEndOfStack; /*任务堆栈栈底*/
#endif
#if ( portCRITICAL\_NESTING\_IN\_TCB == 1 )
UBaseType\_t uxCriticalNesting; /*临界区嵌套深度*/
#endif
#if ( configUSE\_TRACE\_FACILITY == 1 )
UBaseType\_t uxTCBNumber; /*debug的时候用到*/
UBaseType\_t uxTaskNumber; /*trace的时候用到*/
#endif
#if ( configUSE\_MUTEXES == 1 )
UBaseType\_t uxBasePriority; /*任务基础优先级,优先级反转时用到*/
UBaseType\_t uxMutexesHeld; /*任务获取到的互斥信号量个数*/
#endif
#if ( configUSE\_APPLICATION\_TASK\_TAG == 1 )
TaskHookFunction\_t pxTaskTag;
#endif
#if( configNUM\_THREAD\_LOCAL\_STORAGE\_POINTERS >