//让两个LED灯分别以1s、3s的频率的闪烁,使用FreeRTOS
byte LED1_PIN = 23;
byte LED2_PIN = 22;
byte LED3_PIN = 21;
typedef struct{//文件指针
byte pin;
int delayTime;
} LEDFLASH;
/*
//并行任务1
void task1(void *pt){
pinMode(LED1_PIN,OUTPUT);
while(1){
digitalWrite(LED1_PIN,!digitalRead(LED1_PIN));
//delay(1000);//用于全线程延迟调用,无法在多线程中使用 ms,delay(时长)控制延迟时间
vTaskDelay(1000);//vTaskDelay(ticks);一个tick占用1ms,vTaskDelay(事件触发次数)控制延迟时间
}
}
//并行任务2
void task2(void *pt){
pinMode(LED2_PIN,OUTPUT);
while(1){
digitalWrite(LED2_PIN,!digitalRead(LED2_PIN));
//delay(3000);
int timeDelay = 3000;//ms
vTaskDelay(pdMS_TO_TICKS(timeDelay));//pdMS_TO_TICKS(时间变量),将时间变量转换成ticks次数
}
}
//并行任务3
void task3(void*pt){
byte LED_PIN = *(byte*)pt;
//定义一个字符变量LED_PIN
//对空指针pt转换类型至字符指针,(byte*)pt
//再对字符指针取值*(byte*)pt
//最后将取出的值赋给LED_PIN
pinMode(LED_PIN,OUTPUT);
while(1){
digitalWrite(LED_PIN,!digitalRead(LED_PIN));
int timeDelay = 1500;//ms
vTaskDelay(pdMS_TO_TICKS(timeDelay));
}
}
*/
void ledFlash(void *pt){
LEDFLASH *ptLedFlash = (LEDFLASH*)pt;
//(LEDFLASH*)pt: 将空类型指针变量pt转换成结构体指针(用飞镖*打出结构体)
//ptLedFlash:结构体内部名称
byte pin = ptLedFlash->pin;
int delayTime = ptLedFlash->delayTime;
//ptLedFlash->pin:指向结构体内部成员的名称(用弓箭->打出成员)
pinMode(pin,OUTPUT);
while(1){
digitalWrite(pin,!digitalRead(pin));
vTaskDelay(pdMS_TO_TICKS(delayTime));
}
}
void setup() {
Serial.begin(115200);
/*
xTaskCreate(task1,"Blink 23",1024, NULL, 1, NULL);
xTaskCreate(task2,"Blink 22",1024, NULL, 1, NULL);
xTaskCreate(task3,"Blink 21",1024, (void *)&LED3_PIN, 1, NULL);
//包含指针传参;在(void *)&LED3_PIN中的,&LED3_PIN是取地址,得到的是字符指针,
//然后用(void *)将字符指针转换成空指针,用于给任务task传入单一参数
*/
//使用同一个函数完成两个并行任务
LEDFLASH led4, led5;
led4.pin = 19;
led4.delayTime = 1500;
led5.pin = 18;
led5.delayTime = 1000;
xTaskCreate(ledFlash,"FLASH LED",1024, (void *)&led4, 1, NULL);
xTaskCreate(ledFlash,"FLASH LED",1024, (void *)&led5, 1, NULL);
}
void loop() {
}