FreeRTOS源码阅读笔记1--task.c

        在FreeRTOS中,创建任务有两种方式:动态创建和静态创建。区别就是:动态创建任务的栈和任务TCB是由操作系统动态分配(malloc)内存空间,任务删除时可以释放内存(free);而静态创建任务的任务栈和TCB是由程序员预先分配好内存空间,是静态内存,在任务删除时内存空间不可以释放。

1.1 动态创建任务-xTaskCreate()

1.1.1TCB结构体(主要成员)

FreeRTOS源码阅读笔记1--task.c_第1张图片

  • pxTopOfStack:栈顶指针;
  • xStateListItem:任务状态列表项,用来表示任务的状态,挂在对应的状态列表中;
  • xEventListItem:事件列表项,用于从事件列表中引用任务;
  • uxPriority:优先级,数值越大,优先级越高;
  • pxStack:栈起始指针;
  • pcTaskName[ configMAX_TASK_NAME_LEN ]:任务名称。
1.1.2函数原型

FreeRTOS源码阅读笔记1--task.c_第2张图片

  • pxTaskCode:任务函数;
  • pcName:任务名称;
  • usStackDepth:栈大小;
  • pvParameters:参数;
  • uxPriority:优先级;
  • pxCreatedTask:句柄指针,TaskHandle_t就是TCB_t*,句柄将指向被创建函数的TCB;
1.1.3函数框架

动态创建任务的流程:

  1. 为任务TCB分配空间
  2. 为任务栈分配空间
  3. 初始化任务TCB成员
  4. 把任务TCB挂到就绪列表中

FreeRTOS源码阅读笔记1--task.c_第3张图片

  • pxCurrentTCB 是一个在 task.c 定义的全局指针,用于指向当前正在运行或者即将要运行的任务的任务控制块。
1.1.3.1任务栈初始化pxPortInitialiseStack

FreeRTOS源码阅读笔记1--task.c_第4张图片

1.2 静态创建任务-xTaskCreateStatic()

1.2.1函数原型

FreeRTOS源码阅读笔记1--task.c_第5张图片

  • (2):任务函数名称
  • (3):任务名称
  • (4):栈大小
  • (5):任务形参
  • (6):任务栈起始地址
  • (7):任务TCB起始地址
1.2.2函数框架

       大体上与动态创建任务一致,静态创建任务的任务栈及任务TCB需要自己定义,然后传参给xTaskCreateStatic()函数。

FreeRTOS源码阅读笔记1--task.c_第6张图片

1.3删除任务-xTaskDelete()

1.3.1函数原型

        void vTaskDelete( TaskHandle_t xTaskToDelete )

  • xTaskToDelet:句柄,传入要删除任务的句柄,删除自身传入NULL。
1.3.2函数框架

简单来说,删除任务的流程:

  1. 从任务当前所处的状态列表中移除;
  2. 判断任务是否在等待事件,若正在等待,从事件列表中移除;
  3. 释放内存空间,包括任务TCB和任务栈。如果是任务删除自身,由空闲任务来释放内存;如果是其他任务删除指定任务,直接释放内存。

FreeRTOS源码阅读笔记1--task.c_第7张图片

1.4挂起任务vTaskSuspend()

1.4.1函数原型

void vTaskSuspend( TaskHandle_t xTaskToSuspend )

  • xTaskToSuspend:任务句柄,传入要挂起任务的句柄,挂起自身传入NULL。
1.4.2函数框架

FreeRTOS源码阅读笔记1--task.c_第8张图片

1.5恢复任务vTaskResume()

1.5.1函数原型

void vTaskResume( TaskHandle_t xTaskToResume )

  • xTaskToResume:任务句柄,传入要恢复任务的句柄,不能为NULL。
1.5.2函数框架

FreeRTOS源码阅读笔记1--task.c_第9张图片

1.6启动调度器vTaskStartScheduler()

1.6.1函数原型

void vTaskStartScheduler( void )

1.6.2函数框架

FreeRTOS源码阅读笔记1--task.c_第10张图片

1.7任务通知通用发送xTaskGenericNotify()

1.7.1函数原型

FreeRTOS源码阅读笔记1--task.c_第11张图片

  • xTaskToNotify:目标任务的句柄,即接收通知的任务的句柄;
  • uxIndexToNotify:任务的指定通知;
  • ulValue:通知值
  • eAction:定义了如何修改目标任务当前的通知值;
  • pulPreviousValue:可保存之前的通知值,传入NULL则不保存。
1.7.2函数框架

FreeRTOS源码阅读笔记1--task.c_第12张图片

1.8任务通知接收ulTaskNotifyTake()

1.8.1函数原型

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait )

  • xClearCountOnExit:指定函数退出前是否要清楚通知值,如果为pdTRUE,当函数返回时,通知值将被清零;如果为pdFALSE,通知值将减去已经获取到的信号量数量。

  • xTicksToWait:等待时间
  • 返回值:如果成功接收到通知并取得信号量,返回从通知值中获取到的信号量数量(可能大于1);如果在xTicksToWait时间内未接收到通知,则返回0。
1.8.2函数框架

FreeRTOS源码阅读笔记1--task.c_第13张图片

1.9全能的任务通知接收xTaskNotifyWait()

1.9.1函数原型

FreeRTOS源码阅读笔记1--task.c_第14张图片

  • ulBitsToClearOnEntry:表示在使用通知之前,将任务通知值的哪些位清 0;
  • ulBitsToClearOnExit:表示在函数退出前,决定任务接收到的通知值的哪些位会被清 0;
  • pulNotificationValue:用于保存接收到的任务通知值;
  • xTicksToWait:等待超时时间。

  • 返回值:如果获取任务通知成功则返回 pdTRUE,失败则返回 pdFALSE。 

1.9.2函数框架

FreeRTOS源码阅读笔记1--task.c_第15张图片

 

 

 

你可能感兴趣的:(笔记)