AVR开发 Arduino方法(七) 嵌入式操作系统FreeRTOS
FreeRTOS可以提供任务管理,队列管理,中断管理,资源管理和内存管理等功能,由于占用资源少,它可以运行在Arduino UNO R3开发板上。
你可以在https://github.com/greiman/FreeRTOS-Arduino上下载到它,将下载到的FreeRTOS-Arduino-master.zip解压,并将/FreeRTOS-Arduino-master/libraries文件夹下的内容全部复制到Arduino IDE安装目录下的libraries文件夹里就可以使用了。下面是它提供的frBlink示例:
1 // frBlink.ino 2 #include <FreeRTOS_AVR.h> 3 4 const uint8_t LED_PIN = 13; 5 SemaphoreHandle_t sem; 6 7 static void Thread1(void* arg) { 8 while (1) { 9 xSemaphoreTake(sem, portMAX_DELAY); 10 digitalWrite(LED_PIN, LOW); 11 } 12 } 13 14 static void Thread2(void* arg) { 15 pinMode(LED_PIN, OUTPUT); 16 17 while (1) { 18 digitalWrite(LED_PIN, HIGH); 19 vTaskDelay((200L * configTICK_RATE_HZ) / 1000L); 20 xSemaphoreGive(sem); 21 vTaskDelay((200L * configTICK_RATE_HZ) / 1000L); 22 } 23 } 24 25 void setup() { 26 portBASE_TYPE s1, s2; 27 28 Serial.begin(9600); 29 30 sem = xSemaphoreCreateCounting(1, 0); 31 s1 = xTaskCreate(Thread1, NULL, configMINIMAL_STACK_SIZE, NULL, 2, NULL); 32 s2 = xTaskCreate(Thread2, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL); 33 if (sem== NULL || s1 != pdPASS || s2 != pdPASS ) { 34 Serial.println(F("Creation problem")); 35 while(1); 36 } 37 38 vTaskStartScheduler(); 39 Serial.println(F("Insufficient RAM")); 40 while(1); 41 } 42 43 void loop() { 44 }
这个示例效果与Blink示例相同,它演示了FreeRTOS的任务创建,信号量以及任务睡眠等功能。
除了6个基本示例外,FreeRTOSBook文件夹下提供了额外的16个示例;由于篇幅关系,请大家参阅这22个示例或其他关于FreeRTOS的书籍。