2018年4月25日 星期三

Using FreeRTOS multi-tasking in Arduino

https://www.hackster.io/feilipu/using-freertos-multi-tasking-in-arduino-ebc3cc



 #include <Arduino_FreeRTOS.h>  
 #include <croutine.h>  
 #include <event_groups.h>  
 #include <FreeRTOSConfig.h>  
 #include <FreeRTOSVariant.h>  
 #include <list.h>  
 //#include <message_buffer.h>  
 #include <mpu_wrappers.h>  
 #include <portable.h>  
 #include <portmacro.h>  
 #include <projdefs.h>  
 #include <queue.h>  
 #include <semphr.h>  
 #include <stack_macros.h>  
 //#include <stream_buffer.h>  
 #include <task.h>  
 #include <timers.h>  
 void setup() {  
  // Now set up two tasks to run independently.  
  xTaskCreate(  
   TaskBlink  
   , (const portCHAR *)"Blink"  // A name just for humans  
   , 128 // Stack size  
   , NULL  
   , 2 // priority  
   , NULL );  
  xTaskCreate(  
   TaskAnalogRead  
   , (const portCHAR *) "AnalogRead"  
   , 128 // This stack size can be checked & adjusted by reading Highwater  
   , NULL  
   , 1 // priority  
   , NULL );  
    xTaskCreate(  
   TaskBlink2  
   , (const portCHAR *)"Blink"  // A name just for humans  
   , 128 // Stack size  
   , NULL  
   , 2 // priority  
   , NULL );  
  // Now the task scheduler, which takes over control of scheduling individual tasks, is automatically started.  
 }  
 void loop()  
 {  
  // Empty. Things are done in Tasks.  
 }  
 /*--------------------------------------------------*/  
 /*---------------------- Tasks ---------------------*/  
 /*--------------------------------------------------*/  
 void TaskBlink(void *pvParameters) // This is a task.  
 {  
  (void) pvParameters;  
  // initialize digital pin 13 as an output.  
  pinMode(13, OUTPUT);  
  for (;;) // A Task shall never return or exit.  
  {  
   digitalWrite(13, HIGH);  // turn the LED on (HIGH is the voltage level)  
   vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second  
   digitalWrite(13, LOW);  // turn the LED off by making the voltage LOW  
   vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second  
  }  
 }  
 void TaskBlink2(void *pvParameters) // This is a task.  
 {  
  (void) pvParameters;  
  // initialize digital pin 13 as an output.  
  pinMode(13, OUTPUT);  
  pinMode(9, INPUT);  
  for (;;) // A Task shall never return or exit.  
  {  
   if(digitalRead(9)){  
    digitalWrite(13, HIGH);  // turn the LED on (HIGH is the voltage level)  
    vTaskDelay( 200 / portTICK_PERIOD_MS ); // wait for one second  
    digitalWrite(13, LOW);  // turn the LED off by making the voltage LOW  
    vTaskDelay( 200 / portTICK_PERIOD_MS ); // wait for one second  
   }  
  }  
 }  
 void TaskAnalogRead(void *pvParameters) // This is a task.  
 {  
  (void) pvParameters;  
  // initialize serial communication at 9600 bits per second:  
  Serial.begin(9600);  
  for (;;)  
  {  
   // read the input on analog pin 0:  
   int sensorValue = analogRead(A0);  
   // print out the value you read:  
   Serial.println(sensorValue);  
   vTaskDelay(200/portTICK_PERIOD_MS); // one tick delay (15ms) in between reads for stability  
  }  
 }  

沒有留言:

張貼留言