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函数框架
相关推荐
听忆.2 分钟前
手机屏幕上进行OCR识别方案
笔记
Selina K40 分钟前
shell脚本知识点记录
笔记·shell
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
霍格沃兹测试开发学社测试人社区2 小时前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask
幸运超级加倍~2 小时前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
王俊山IT2 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
Yawesh_best3 小时前
思源笔记轻松连接本地Ollama大语言模型,开启AI写作新体验!
笔记·语言模型·ai写作
CXDNW5 小时前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
使者大牙5 小时前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型
ssf-yasuo5 小时前
SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记
论文阅读·笔记·prompt