#include <Arduino.h>
void Action(void){
digitalWrite(2, HIGH);
Serial.print("err");
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
void Urg_Stop(char *task1,void (*func)()){
// 定义任务句柄
TaskHandle_t task1Handle;
//获取Task任务
task1Handle = xTaskGetHandle(task1);
//暂停Task任务
vTaskSuspend(task1Handle);
//紧急操作函数
func();
vTaskDelay(1 / portTICK_PERIOD_MS);
//恢复任务
vTaskResume(task1Handle);
}
void Task1(void *pt) {
while (1) {
// 检查条件,如果满足条件
if (digitalRead(4) == HIGH) {
Serial.print("err");
Urg_Stop("led2",Action);
}
// 其他任务逻辑
// 引入延迟,以便让其他任务有机会执行
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void Task2(void *pt) {
while (1) {
digitalWrite(2, !digitalRead(2));
vTaskDelay(500 / portTICK_PERIOD_MS); // 高电平持续500毫秒
}
}
void setup() {
Serial.begin(115200);
pinMode(2, OUTPUT);
pinMode(4, INPUT); // 条件检查用的引脚
digitalWrite(2, LOW);
// 创建任务1
xTaskCreate(Task1, "led1", 512, NULL, 1, NULL);
// 创建任务2
xTaskCreate(Task2, "led2", 512, NULL, 1, NULL);
}
void loop() {
// 因为我们使用了 FreeRTOS 任务,所以 loop 函数为空
}