#include <Arduino_FreeRTOS.h>
#include <semphr.h>
// type of parameters
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 = «TaskInputA1»;
pxParam->pcText = «Input A1»;
pxParam->SensorID = A1;
pxParam->DelayTicks = pdMS_TO_TICKS( 250UL );
pxParam++;
pxParam->pcTaskName = «TaskInputA2»;
pxParam->pcText = «Input A2»;
pxParam->SensorID = A2;
pxParam->DelayTicks = 1; //pdMS_TO_TICKS( 250UL );
pxParam++;
pxParam->pcTaskName = «TaskInputA3»;
pxParam->pcText = «Input A3»;
pxParam->SensorID = A3;
pxParam->DelayTicks = 1; //pdMS_TO_TICKS( 250UL );
pxParam++;
// create the tasks
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) /* Priority */, NULL
);
}
}
void loop(){
}
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); // one tick delay (15ms) in between reads
}
}
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);
}
}