在这个程序里面我写了两个任务,第一个任务是触摸传感器的检测,第二个任务是led闪烁;系统会自动帮我们做好任务调度,我们只需写好所需逻辑就可以了;附上实物图:
可以看到有双线程的效果,即灯一边按其特定频率闪烁的同时;触摸传感器也在不断检测是否有触摸时间并向串口发送数据;这就是freetros系统给我们带来的实时性效果。
最后附上程序:应注意当我们使用freertos例程进行我们自己程序的修改时应在setup 和 loop函数里面均加上delay(1000);进行一秒左右的延时,否则系统将不停地进行重启。
#if CONFIG_FREERTOS_UNICORE
#define ARDUINO_RUNNING_CORE 0
#else#define ARDUINO_RUNNING_CORE 1
#endif
int threshold = 25;
bool touch0detected = false;
bool touch1detected = false;
bool touch2detected = false;
// 定义任务函数
void Tasktouch( void *pvParameters );
void Taskled( void *pvParameters );
void touch_int()
{
touchAttachInterrupt(T0, gotTouch0, threshold); //IO4
touchAttachInterrupt(T4, gotTouch1, threshold); //IO13
touchAttachInterrupt(T5, gotTouch2, threshold); //IO12
}
void gotTouch0(){ //触摸中断0服务函数touch0detected = true;
}
void gotTouch1(){ //触摸中断1服务函数 touch1detected = true;
}
void gotTouch2(){ //触摸中断2服务函数 touch2detected = true;
}
void touch_judge(){
if(touch0detected)
{
touch0detected = false;
Serial.println(“T0”);
delay(500);
}
if(touch1detected){
touch1detected = false;
Serial.println(“T1”);
delay(500);
}
if(touch2detected){
touch2detected = false;
Serial.println(“T2”);
delay(500);
}
}
void setup() {
Serial.begin(115200);
pinMode(5,OUTPUT);
delay(1000);
xTaskCreatePinnedToCore( //创建任务 Tasktouch //任务
,
“Tasktouch” // 任务名字,随便起
,
1024 // 堆栈内存
,
NULL
,
1 // 优先级,0为最低
,
NULL
,
ARDUINO_RUNNING_CORE); //允许执行 xTaskCreatePinnedToCore( //创建任务 Taskled , “Taskled” , 1024 , NULL , 2 , NULL , ARDUINO_RUNNING_CORE); //允许执行
void loop(){
delay(1000);
}
void Tasktouch(void *pvParameters) // 触摸检测并触发中断
{ (void) pvParameters;
while(1)
{
touch_int();
touch_judge();
}
}
void Taskled(void *pvParameters) // LED闪烁
{ (void) pvParameters;
while(1)
{
digitalWrite(5,HIGH);
delay(500);
digitalWrite(5,LOW);
delay(500);
}
}