FreeRTOS-创建任务(动态)笔记

 

分析:BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,

const char * const pcName,

const uint16_t usStackDepth,

void * const pvParameters,

UBaseType_t uxPriority,

TaskHandle_t * const pxCreatedTask )

1.为任务堆栈分配内存

pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); //通过函数可以得到分配的堆栈内存大小为usStackDepth *StackType_t(值为4)

2.堆栈内存申请成功后,申请任务控制块内存

pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) );

3.若任务控制块的内存申请成功后,把申请的堆栈内存赋值给新申请任务控制块的堆栈

pxNewTCB->pxStack = pxStack;

4.通过宏定义来确定任务是通过动态分配的、

5.初始化新建的任务:prvInitialiseNewTask()

6.把任务添加到就绪列表里面:prvAddNewTaskToReadyList()

7.创建完成。

 

分析static void prvInitialiseNewTask( TaskFunction_t pxTaskCode,

const char * const pcName,

const uint32_t ulStackDepth,

void * const pvParameters,

UBaseType_t uxPriority,

TaskHandle_t * const pxCreatedTask,

TCB_t *pxNewTCB,

const MemoryRegion_t * const xRegions )

 

1.如果使用了堆栈溢出检测功能的话没就用0xa5来填充堆栈

FreeRTOS-创建任务(动态)笔记

 

2.确定栈顶位置

FreeRTOS-创建任务(动态)笔记

3.填充任务名数组

FreeRTOS-创建任务(动态)笔记

4.确定任务的优先级

FreeRTOS-创建任务(动态)笔记

5.初始化状态列表项和事件列表项

FreeRTOS-创建任务(动态)笔记

6.①设置状态列表项的pvOwner为该任务控制块②:设置事件列表项的优先级③:事件列表项的pvOwner为该任务控制块

FreeRTOS-创建任务(动态)笔记

7.设置MPU

FreeRTOS-创建任务(动态)笔记

8.初始化任务堆栈,在这里把PC之间寄存器指向了任务函数

FreeRTOS-创建任务(动态)笔记

9.把新的任务控制块赋给任务句柄

FreeRTOS-创建任务(动态)笔记

 

分析sStackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )

FreeRTOS-创建任务(动态)笔记

 

 

 

分析static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )

FreeRTOS-创建任务(动态)笔记

 

1.通过全局变量uxCurrentNumberOfTasks来统计任务数目

FreeRTOS-创建任务(动态)笔记

2.如果新创建的任务为第一个任务,则需要调用函数prvInitialiseTaskLists初始化列表

FreeRTOS-创建任务(动态)笔记

3.如果任务调度器没运行,新创建的任务的优先级比当前于行任务的优先级高,则把新创建的任务设置为当前运行的任务。

FreeRTOS-创建任务(动态)笔记

4.把任务添加到就绪列表中

FreeRTOS-创建任务(动态)笔记

5.如果新任务的优先级比当前运行任务的优先级高 并且任务已经运行 这时会进行一次任务切换。

FreeRTOS-创建任务(动态)笔记