开源硬件
Arduino
客制化键盘
Arduino_寄存器
二进制运算
寄存器+二进制运算
LCD-逐字显示
密码依次录入
等待输入
WiFi Duck(无线击键注入攻击平台)
WiFi Duc-New
WiFi Duc-Old
蓝牙无线烧录
ESP8266
ESP-NOW
ESP8266看门狗
ESP8266-休眠模式
ESP01/01S使用说明
WIFI_SD
ESP8266-Web服务器
ESP8266-WIFI自动认证
ESP32
ESP32 ADC2
ESP32_PWM
ESP32_CAM
ESP32 小坦克
ESP32_限电保护
Arduino IDE 添加 ESP32
ESP32-iPhone BLE攻击
STM32
STM32F103-虚拟键盘
STC
STC8G1K08(A)
树莓派-触摸屏
Arduino IDE
Arduino_自制库
Arduino库收集
常见排序算法
冒泡排序
选择排序
插入排序
希尔排序
归并排序
快速排序
计数排序
预处理
millis(运行时长)
Arduino IDE 2.X-修改数据位置
Mixly
Mixly安装教程
Mixly 模块介绍
Mixly-添加ESP32CAM支持
Mixly-库定制工具
模块
4G模块连接物联网
GPS模块
语音模块(JQ8900)
安信可VB语音识别
28BYJ-48(5V步进)
FreeRTOS
FreeRTOS-多任务基础
FreeRTOS-任务共享全局变量
FreeRTOS-多核多任务
FreeRTOS-MUTEX
FreeRTOS-常规程序改多任务
FreeRTOS-定时器
LaserGRBL(激光雕刻)
LaserGRBL-GRBL
GRBL-CNC Shield v4
MicroPython
Scratch
Wokwi(在线仿真)
html转无符号数组
待做开源项目
本文档使用 MrDoc 发布
-
+
首页
FreeRTOS-多任务基础
```c++ void <函数名称>(void *<空指针名称>){} //FreeRTOS 的任务函数 xTaskCreate(<函数名称>,"<任务描述>",<分配内存空间(bit)>,<传入参数>,<优先级>,<任务参数>); //FreeRTOS 新建任务 vTaskDelay(<持续tick数>); //FreeRTOS 中等待(ESP32中delay就是用vTaskDelay实现的, 1tick = 1ms) // 数据传递,常规数据 (void *)&<数据名称> //新建任务的传入参数可以使用这个转换成空指针 <原数据类型> <转换后存入的变量> = *(<原数据类型> *)<空指针名称>; //在任务函数中把空指针转换回原数据格式 // 结构体,转换空指针和传入任务方式和常规一样,转换回结构体和读取对象有区别 <结构体名称> *<转换后存入的变量> = (<结构体名称> *)<空指针名称>; //空指针转换回结构体 <对象格式> <存入的变量> = <转换后的结构体>-><结构体中对象名称>; // 在指针中,调用结构体中的成员,不能使用“.”,而要使用“->”去进行访问 ``` ## 基本多任务(LED灯) ```c++ // 新建函数,传入值 空指针 void task1(void *pt){ // 循环外面的可以理解为 setup() 中的指令 pinMode(23, OUTPUT); // 无限循环内,可以理解为 loop() 中的指令 while(1){ digitalWrite(23,!digitalRead(23)); vTaskDelay(3000); //代替 delay(),1 Task = 1 ms } } void task2(void *pt){ pinMode(21, OUTPUT); while(1){ digitalWrite(21,!digitalRead(21)); vTaskDelay(1000); } } void setup() { Serial.begin(115200); Serial.print(portTICK_PERIOD_MS); //查看 tick 于时间对应关系 // 创建任务 // xTaskCreate(<函数名称>,"<任务描述>",<分配内存空间(bit)>,<传入参数>,<优先级>,<任务参数>) xTaskCreate(task1,"Blink23",1024,NULL,1,NULL); xTaskCreate(task2,"Blink21",1024,NULL,1,NULL); } void loop() { } ``` ## 任务传递单参数 ```c++ // 定义两个LED引脚 byte LED1_PIN = 23; byte LED2_PIN = 21; // 新建函数,传入值 空指针 void task1(void *pt) { // 逆向操作,完整的转换空指针类型到byte类型 // 定义个byte指针类型 byte * pbLEDPIN; // 把传入的空指针转换为byte指针地址 pbLEDPIN = (byte *)pt; // 定义个byte类型 byte LEDPIN; // 从byte指针地址获取数据 LEDPIN = *pbLEDPIN; pinMode(LEDPIN, OUTPUT); while (1) { digitalWrite(LEDPIN, !digitalRead(LEDPIN)); vTaskDelay(1000); } } void task2(void *pt) { // 逆向操作,简化的空指针类型转换byte类型 // 定义个byte类型,把空指针转byte指针再转换为实际内容 byte LEDPIN = *(byte *)pt; pinMode(LEDPIN, OUTPUT); while (1) { digitalWrite(LEDPIN, !digitalRead(LEDPIN)); vTaskDelay(3000); } } void setup() { Serial.begin(115200); // 数据转为空指针用于任务的数据传递 // 定义个byte指针变量 byte * pbLED1PIN; // 获取数据的地址并赋值 pbLED1PIN = &LED1_PIN; // 定义个空指针变量 void * pvLED1PIN; // 把刚赋值的数据地址变量转换为空指针类型 pvLED1PIN = (void *)pbLED1PIN; // 创建任务 // xTaskCreate(<函数名称>,"<任务描述>",<分配内存空间>,<传入参数>,<优先级>,<任务参数>) if (xTaskCreate(task1, "Blink23", 1024, pvLED1PIN, 1, NULL))Serial.println("Task1 Created."); // 简化版的数据转空指针,用于任务数据传输 // (void *)&LED2_PIN,&LED2_PIN 把地址转换出来,然后再转换为空类型指针 if (xTaskCreate(task2, "Blink21", 1024, (void *)&LED2_PIN, 1, NULL))Serial.println("Task2 Created."); } void loop() { } ``` ## 任务传递多参数(结构体) ```c++ // 定义结构体 LEDFLASH typedef struct { // 包含两个成员 byte pin; int delayTime; } LEDFLASH; // 新建函数,传入值 空指针,两个任务复用这一个函数 void ledFlash(void *pt) { // 把空类型的指针变量转换为 LEDFLASH(定义的结构体) 变量 LEDFLASH * ptLedFlash = (LEDFLASH *)pt; // 在指针中,调用结构体中的成员,不能使用“.”,而要使用“->”去进行访问 byte pin = ptLedFlash->pin; //获取引脚 int delayTime = ptLedFlash->delayTime; //获取时间 pinMode(pin,OUTPUT); while (1) { digitalWrite(pin, !digitalRead(pin)); vTaskDelay(delayTime); } } void setup() { Serial.begin(115200); // 结构体声明两个LED变量 LEDFLASH led1, led2; // 并设置两个LED的引脚和时间 led1.pin = 23; led1.delayTime = 1000; led2.pin = 21; led2.delayTime = 3000; // 创建任务 // xTaskCreate(<函数名称>,"<任务描述>",<分配内存空间>,<传入参数>,<优先级>,<任务参数>) // (void *)&led1,把结构体转换为空指针传入任务 if (xTaskCreate(ledFlash, "Blink23", 1024, (void *)&led1, 1, NULL))Serial.println("Task1 Created."); if (xTaskCreate(ledFlash, "Blink21", 1024, (void *)&led2, 1, NULL))Serial.println("Task2 Created."); } void loop() { } ``` **相关内容视频** [多任务点灯](https://www.bilibili.com/video/BV1RB4y1Q7be)|[wokwi_多任务点灯](https://wokwi.com/projects/332576245745189459) [给任务通过空指针类型传递单个参数](https://www.bilibili.com/video/BV1M94y1S7HF)|[wokwi_单个参数传递](https://wokwi.com/projects/332592742088573523) [给任务通过结构体传递多个参数](https://www.bilibili.com/video/BV1bt4y1s72R)|[wokwi_多个参数传递](https://wokwi.com/projects/332592846800421460)
造物者W
2022年6月17日 10:37
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码