#include <Arduino_FreeRTOS.h>
#include<semphr.h>
typedef struct{
const char *pcTaskName;
const char *pcText;
int SensorID;
int DelayTicks;
} AnalogReadParam_t;
SemaphoreHandle_t xSerialSemaphore;
void TaskDigitalRead(void *pvParameters);
void TaskAnalogReadParam(void *pvParameters);
AnalogReadParam_t xParams[3], *pxParam=xParams;
void setup() {
Serial.begin(9600);
while(!Serial){;}
if(xSerialSemaphore == NULL){
xSerialSemaphore = xSemaphoreCreateMutex();
if((xSerialSemaphore) != NULL) {
xSemaphoreGive((xSerialSemaphore));
}
}
xTaskCreate(TaskDigitalRead, «DigitalRead»,128,NULL,(configMAX_PRIORITIES-3),NULL);
pxParam->pcTaskName=»TAskInutA1″;
pxParam->pcText=»Input A1″;
pxParam->SensorID = A1;
pxParam->DelayTicks = pdMS_TO_TICKS(250UL);
pxParam++;
pxParam->pcTaskName=»TAskInutA2″;
pxParam->pcText=»Input A2″;
pxParam->SensorID = A2;
pxParam->DelayTicks = 1;
pxParam++;
pxParam->pcTaskName=»TAskInutA3″;
pxParam->pcText=»Input A3″;
pxParam->SensorID = A3;
pxParam->DelayTicks = 1;
pxParam++;//???
for(pxParam = &xParams[0]; pxParam < &xParams[3]; pxParam++){
Serial.println(«\n————————————«);
Serial.print(«Creating «);
Serial.println(pxParam->pcTaskName);
xTaskCreate(TaskAnalogReadParam,pxParam->pcTaskName,128,(void *)pxParam, (configMAX_PRIORITIES-2),NULL);
}
}
void loop() {
;// put your main code here, to run repeatedly:
}
void SerialDebugWithSemaphore(const char *pszText){
if(xSemaphoreTake(xSerialSemaphore,(TickType_t)5)==pdTRUE){
Serial.print(pszText);
xSemaphoreGive(xSerialSemaphore);
}
}
void TaskDigitalRead(void *pvParameters __attribute__((unused))){
uint8_t pushButton = 2;
pinMode(pushButton, INPUT);
for(;;){
int buttonState = digitalRead(pushButton);
if(xSemaphoreTake(xSerialSemaphore,(TickType_t)5)==pdTRUE){
Serial.print(«digital input: «);
Serial.println(buttonState);
xSemaphoreGive(xSerialSemaphore);
}
vTaskDelay(1);
}
}
void TaskAnalogReadParam(void *pvParameters){
AnalogReadParam_t *pxParams = (AnalogReadParam_t *) pvParameters;
for(;;){
int sensorValue = analogRead(pxParams->SensorID);
if(xSemaphoreTake(xSerialSemaphore,(TickType_t)5)==pdTRUE){
Serial.print(pxParams->pcText);
Serial.print(«: «);
Serial.println(sensorValue);
xSemaphoreGive(xSerialSemaphore);
}
vTaskDelay(pxParams->DelayTicks);
}
}