/* * FreeRTOS 任务工具示例 * <url id="cvscdrg9ma9id7khmg90" type="url" status="parsed" title="Task Utilities - FreeRTOS™" wc="18192">https://www.freertos.org/a00021.html</url> */ // 引入 Arduino FreeRTOS 库 #include <Arduino_FreeRTOS.h> /** * 任务句柄 * <url id="cvscdrg9ma9id7khmg9g" type="url" status="parsed" title="Task Creation - FreeRTOS™" wc="556">https://www.freertos.org/a00019.html#xTaskHandle</url> */ TaskHandle_t taskBlinkHandle; // Blink 任务的句柄 TaskHandle_t taskBlink2Handle; // Blink 任务的句柄 TaskHandle_t taskDeletedHandle; // Deleted 任务的句柄 TaskHandle_t taskBlockedHandle; // Blocked 任务的句柄 #define LED8_BUILTIN 8 void setup() { /** * 任务创建 */ // 创建 Blink 任务 xTaskCreate( TaskBlink, // 任务函数 "Blink", // 任务名称 128, // 堆栈大小(单位:字) NULL, // 任务参数 0, // 任务优先级 &taskBlinkHandle // 任务句柄 ); xTaskCreate( TaskBlink2, // 任务函数 "Blink2", // 任务名称 128, // 堆栈大小(单位:字) NULL, // 任务参数 0, // 任务优先级 &taskBlink2Handle // 任务句柄 ); // 创建 Serial 任务 xTaskCreate( TaskSerial, // 任务函数 "Serial", // 任务名称 128, // 堆栈大小 NULL, // 任务参数 2, // 任务优先级 NULL // 任务句柄(不保存句柄) ); // 创建 Deleted 任务 xTaskCreate( TaskDeleted, // 任务函数 "Deleted", // 任务名称 64, // 堆栈大小 NULL, // 任务参数 1, // 任务优先级 &taskDeletedHandle // 任务句柄 ); // 创建 Blocked 任务 xTaskCreate( TaskBlocked, // 任务函数 "Blocked", // 任务名称 64, // 堆栈大小 NULL, // 任务参数 1, // 任务优先级 &taskBlockedHandle // 任务句柄 ); // 启动调度器后,setup() 函数将结束,任务开始运行 } void loop() { // loop() 函数为空,因为所有逻辑都在任务中运行 } /** * 示例:任务工具的使用 */ void TaskSerial(void *pvParameters) { (void) pvParameters; // 忽略未使用的参数警告 // 初始化串口 Serial.begin(115200); for (;;) { // 打印任务状态信息 Serial.println("======== 任务状态 ========"); // 获取系统运行的 tick 计数值 Serial.print("Tick 计数值: "); Serial.print(xTaskGetTickCount()); // 获取当前系统中任务的总数 Serial.print(", 任务总数: "); Serial.print(uxTaskGetNumberOfTasks()); Serial.println(); Serial.println(); // 获取当前任务(Serial 任务)的名称 Serial.print("- 任务 "); Serial.print(pcTaskGetName(NULL)); // 使用 NULL 表示查询当前任务的名称 Serial.print(", 堆栈高水位标记: "); // 获取当前任务的堆栈高水位标记 Serial.print(uxTaskGetStackHighWaterMark(NULL)); Serial.println(); // 获取当前任务的句柄 TaskHandle_t taskSerialHandle = xTaskGetCurrentTaskHandle(); // 这里可以使用 taskSerialHandle 进行其他操作 // 获取 Blink 任务的名称和堆栈高水位标记 Serial.print("- 任务 "); Serial.print(pcTaskGetName(taskBlinkHandle)); // 使用句柄查询任务名称 Serial.print(", 堆栈高水位标记: "); Serial.print(uxTaskGetStackHighWaterMark(taskBlinkHandle)); Serial.println(); // 获取 Deleted 任务的名称和堆栈高水位标记 Serial.print("- 任务 "); Serial.print(pcTaskGetName(taskDeletedHandle)); Serial.print(", 堆栈高水位标记: "); Serial.print(uxTaskGetStackHighWaterMark(taskDeletedHandle)); Serial.println(); // 获取 Blocked 任务的名称和堆栈高水位标记 Serial.print("- 任务 "); Serial.print(pcTaskGetName(taskBlockedHandle)); Serial.print(", 堆栈高水位标记: "); Serial.print(uxTaskGetStackHighWaterMark(taskBlockedHandle)); Serial.println(); Serial.println(); // 延迟 5 秒 vTaskDelay(5000 / portTICK_PERIOD_MS); } } /** * Blocked 任务:运行时会被阻塞 */ void TaskBlocked(void *pvParameters) { (void) pvParameters; // 忽略未使用的参数警告 for (;;) { // 阻塞当前任务 15 分钟(900000 ms) vTaskDelay(900000 / portTICK_PERIOD_MS); } } /** * Deleted 任务:运行时会被删除 */ void TaskDeleted(void *pvParameters) { (void) pvParameters; // 忽略未使用的参数警告 // 删除当前任务 vTaskDelete(NULL); } /** * Blink 任务:简单的 LED 闪烁任务 * 参考 Blink_AnalogRead 示例 */ void TaskBlink(void *pvParameters) { (void) pvParameters; // 忽略未使用的参数警告 // 设置内置 LED 引脚为输出模式 pinMode(LED_BUILTIN, OUTPUT); for (;;) { // 打开 LED digitalWrite(LED_BUILTIN, HIGH); // 延迟 250 ms vTaskDelay(1000 / portTICK_PERIOD_MS); // 关闭 LED digitalWrite(LED_BUILTIN, LOW); // 延迟 250 ms vTaskDelay(1000 / portTICK_PERIOD_MS); } } void TaskBlink2(void *pvParameters) { (void) pvParameters; // 忽略未使用的参数警告 // 设置内置 LED8 引脚为输出模式 pinMode(LED8_BUILTIN, OUTPUT); for (;;) { // 打开 LED digitalWrite(LED8_BUILTIN, HIGH); // 延迟 250 ms vTaskDelay(500 / portTICK_PERIOD_MS); // 关闭 LED digitalWrite(LED8_BUILTIN, LOW); // 延迟 250 ms vTaskDelay(500 / portTICK_PERIOD_MS); } }