아두이노 freeRTOS 튜토리얼 19 – 세 개의 태스크 실행Arduino FreeRTOS2015. 1. 17. 04:21
Table of Contents
반응형
세 개의 태스크를 수행한다.
- LED를 깜빡이게 하는 테스크
- 현재 남은 스택크기와 힙의 크기를 시리얼로 출력하는 태스크
- IDLE 루프
- // Simple demo of three threads
- // LED blink thread, print thread, and idle loop
- #include <FreeRTOS_AVR.h>
- const uint8_t LED_PIN = 13;
- volatile uint32_t count = 0;
- // handle for blink task
- TaskHandle_t blink;
- //------------------------------------------------------------------------------
- //LED를 깜빡이게 하는 태스크가 우선순위가 가장 높다.
- static void vLEDFlashTask(void *pvParameters) {
- pinMode(LED_PIN, OUTPUT);
- //200밀리세컨드를 주기로 LED가 깜빡인다.
- for (;;) {
- //LED를 켠다.
- digitalWrite(LED_PIN, HIGH);
- //50밀리세컨드 대기한다.
- vTaskDelay((50L * configTICK_RATE_HZ) / 1000L);
- //LED를 끈다.
- digitalWrite(LED_PIN, LOW);
- //150밀리세컨드 대기한다.
- vTaskDelay((150L * configTICK_RATE_HZ) / 1000L);
- }
- }
- //------------------------------------------------------------------------------
- static void vPrintTask(void *pvParameters) {
- while (1) {
- //1초동안 대기한다.
- vTaskDelay(configTICK_RATE_HZ);
- //이전 초의 카운트를 출력한다.
- Serial.print(F("Count: "));
- Serial.print(count);
- // Print unused stack for threads.
- Serial.print(F(", Unused Stack: blink task="));
- Serial.print(uxTaskGetStackHighWaterMark(blink));//blink 태스크의 남은 스택 크기 출력
- Serial.print('/');
- Serial.print(configMINIMAL_STACK_SIZE + 50); //blink 태스크 생성시 스택 크기
- Serial.print(" print task=");
- Serial.print(uxTaskGetStackHighWaterMark(0)); //현재 태스크(print)의 남은 스택 크기 출력
- Serial.print('/');
- Serial.print(configMINIMAL_STACK_SIZE + 100); //print 태스크 생성시 스택 크기
- Serial.print(" free heap=");
- Serial.println(freeHeap()); //남은 heap의 크기
- //0으로 카운터 초기화
- count = 0;
- }
- }
- //------------------------------------------------------------------------------
- void setup() {
- Serial.begin(9600);
- // wait for Leonardo
- while(!Serial) {}
- //LED를 깜빡이게 하는 태스크의 우선순위를 가장 높게 생성
- xTaskCreate(vLEDFlashTask, "blink", configMINIMAL_STACK_SIZE + 50, NULL,
- tskIDLE_PRIORITY + 2, &blink);
- //태스크별 남은 스택 크기와 남은 힙의 크기를 출력하는 태스크의 우선 순위가 두번째로 크게 생성
- xTaskCreate(vPrintTask, "print", configMINIMAL_STACK_SIZE + 100, NULL,
- tskIDLE_PRIORITY + 1, NULL);
- //스케줄러를 시작한다.
- vTaskStartScheduler();
- //여기에 도달하면 거의 메모리 부족 때문
- Serial.println(F("Die"));
- while(1){
- Serial.println(F("Die"));
- }
- }
- //------------------------------------------------------------------------------
- //IDLE 루프는 매우 작은 스택 크기를 가지기 때문에 (configMINIMAL_STACK_SIZE)
- //블럭되면 안됨
- void loop() {
- while(1) {
- //카운터하는 사이에 인터럽트가 안걸리도록 조치를함.
- noInterrupts();//인터럽트를 금지시켰다가
- count++; //카운터를 증가시키고
- interrupts();//인터럽트를 다시 가능하도록 함
- }
- }
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 20 (2) | 2015.01.18 |
---|---|
아두이노 freeRTOS 튜토리얼 18 – LED 2개 번갈아가며 깜빡이게 하기 (0) | 2015.01.17 |
아두이노 freeRTOS 튜토리얼 17 - LED깜빡이게 하기 (0) | 2015.01.17 |
아두이노 freeRTOS 튜토리얼 16 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 15 (0) | 2015.01.16 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!