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函数框架
相关推荐
结衣结衣.9 分钟前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
Starry_hello world3 小时前
二叉树实现
数据结构·笔记·有问必答
唐·柯里昂79810 小时前
[3D打印]拓竹切片软件Bambu Studio使用
经验分享·笔记·3d
sml_542110 小时前
【笔记】连续、可导、可微的概念解析
笔记·线性代数
新手unity自用笔记10 小时前
项目-坦克大战学习-子弹的移动与销毁
笔记·学习·c#
Word码11 小时前
数据结构:栈和队列
c语言·开发语言·数据结构·经验分享·笔记·算法
我命由我1234511 小时前
SSL 协议(HTTPS 协议的关键)
网络·经验分享·笔记·学习·https·ssl·学习方法
丶Darling.12 小时前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
结衣结衣.13 小时前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
LN-ZMOI13 小时前
c++学习笔记1
c++·笔记·学习