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

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

1.1 动态创建任务-xTaskCreate()

1.1.1TCB结构体(主要成员)

  • pxTopOfStack:栈顶指针;
  • xStateListItem:任务状态列表项,用来表示任务的状态,挂在对应的状态列表中;
  • xEventListItem:事件列表项,用于从事件列表中引用任务;
  • uxPriority:优先级,数值越大,优先级越高;
  • pxStack:栈起始指针;
  • pcTaskName[ configMAX_TASK_NAME_LEN ]:任务名称。
1.1.2函数原型
  • pxTaskCode:任务函数;
  • pcName:任务名称;
  • usStackDepth:栈大小;
  • pvParameters:参数;
  • uxPriority:优先级;
  • pxCreatedTask:句柄指针,TaskHandle_t就是TCB_t*,句柄将指向被创建函数的TCB;
1.1.3函数框架

动态创建任务的流程:

  1. 为任务TCB分配空间
  2. 为任务栈分配空间
  3. 初始化任务TCB成员
  4. 把任务TCB挂到就绪列表中
  • pxCurrentTCB 是一个在 task.c 定义的全局指针,用于指向当前正在运行或者即将要运行的任务的任务控制块。
1.1.3.1任务栈初始化pxPortInitialiseStack

**1.2 静态创建任务-**xTaskCreateStatic()

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

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

**1.3删除任务-**xTaskDelete()

1.3.1函数原型

void vTaskDelete( TaskHandle_t xTaskToDelete )

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

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

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

1.4挂起任务vTaskSuspend()

1.4.1函数原型

void vTaskSuspend( TaskHandle_t xTaskToSuspend )

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

1.5恢复任务vTaskResume()

1.5.1函数原型

void vTaskResume( TaskHandle_t xTaskToResume )

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

1.6启动调度器vTaskStartScheduler()

1.6.1函数原型

void vTaskStartScheduler( void )

1.6.2函数框架

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

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

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函数框架

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

1.9.1函数原型
  • ulBitsToClearOnEntry:表示在使用通知之前,将任务通知值的哪些位清 0;

  • ulBitsToClearOnExit:表示在函数退出前,决定任务接收到的通知值的哪些位会被清 0;

  • pulNotificationValue:用于保存接收到的任务通知值;

  • xTicksToWait:等待超时时间。

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

1.9.2函数框架
相关推荐
遇印记1 小时前
大二java学习笔记:二维数组
java·笔记·学习
bnsarocket3 小时前
Verilog和FPGA的自学笔记6——计数器(D触发器同步+异步方案)
笔记·fpga开发·verilog·自学·硬件编程
LK_074 小时前
【Open3D】Ch.3:顶点法向量估计 | Python
开发语言·笔记·python
li星野4 小时前
打工人日报#20251011
笔记·程序人生·fpga开发·学习方法
摇滚侠4 小时前
Spring Boot 3零基础教程,yml配置文件,笔记13
spring boot·redis·笔记
QT 小鲜肉4 小时前
【个人成长笔记】在Ubuntu中的Linux系统安装 anaconda 及其相关终端命令行
linux·笔记·深度学习·学习·ubuntu·学习方法
QT 小鲜肉4 小时前
【个人成长笔记】在Ubuntu中的Linux系统安装实验室WIFI驱动安装(Driver for Linux RTL8188GU)
linux·笔记·学习·ubuntu·学习方法
急急黄豆5 小时前
MADDPG学习笔记
笔记·学习
Chloeis Syntax5 小时前
栈和队列笔记2025-10-12
java·数据结构·笔记·
QZ_orz_freedom6 小时前
学习笔记--文件上传
java·笔记·学习