/*
程序: Binary Semaphore 是一种信号机制 在中断中的用法
一个任务(生产者)发出信号。另外一个任务(消费者)接受信号
公众号:孤独的二进制
语法:
SemaphoreHandle_t xHandler; 创建Handler
xHandler = xSemaphoreCreateBinary(); 创建一个二进制信号量 返回NULL,或者handler
xSemaphoreGive(xHandler); 生产者+1
xSemaphoreTake(xHanlder, timeout); 消费者-1 返回pdPASS, 或者pdFAIL
二进制信号量可以想成就是一个整数 0 或者 1
Give就是+1
Take就是-1
Take的时候如果这个整数是0的话,就等待一直到timeout
*/
volatile bool btnPressed = true;
volatile bool btnReleased = false;
volatile int counter = 0;
SemaphoreHandle_t xSemaLED = NULL; //创建信号量Handler
volatile TickType_t btnDeounce = 0; //用于button Debounce
TickType_t timeOut = 1000; //用于获取信号量的Timeout 1000 ticks
void flashLED(void *pvParam) {
pinMode(23, OUTPUT);
while (1) {
Serial.println("task 1 ");
vTaskDelay(10);
}
}
void readBtn(void *pvParam) {
pinMode(22, INPUT_PULLUP);
while (1) {
Serial.println("task 2 ");
}
}
void IRAM_ATTR ISR() {
btnDeounce = xTaskGetTickCountFromISR();
xSemaphoreGiveFromISR(xSemaLED, NULL);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
xSemaLED = xSemaphoreCreateBinary(); //创建二进制信号量
if (xSemaLED == NULL) {
printf("No Enough Ram, Unable to Create Semaphore.");
} else {
xTaskCreate(flashLED,
"Flash LED",
1024 * 4,
NULL,
1,
NULL);
xTaskCreate(readBtn,
"Read Button",
1024 * 4,
NULL,
1,
NULL);
}
pinMode(22, INPUT_PULLUP);
attachInterrupt(22, ISR, FALLING);
}
void loop() {
}