반응형
앞서 배운 Thread 라이브러리를 활용해서 신호등을 구현하였다.
초록색불을 우선순위 1로 빨간불은 우선순위 2로 하게되면 문제없이 원하는 동작을 수행한다.
delay를 이용할때는 코드밀림 현상이 발생하였는데 Thread를 사용하니 원하는 동작이 이루어지는것을 확인할수가 있다.
https://www.youtube.com/watch?v=uyOR1Xy11Bc
/*
* Example to demonstrate thread definition, semaphores, and thread sleep.
*/
#include <FreeRTOS_AVR.h>
#include <SoftwareSerial.h>
SoftwareSerial bluetooth(2,3);
const int Relaypin_red = 4;
const int Relaypin_green = 5;
//세마포어 핸들을 선언
SemaphoreHandle_t sem;
//빨간불 신호 스레드
static void Thread1(void* arg) {
while (1) {
//세마포어를 획득할 떄 까지 무한정 기다린다.
xSemaphoreTake(sem, portMAX_DELAY);
//BLE 값 변경
bluetooth.print("AT+IBE177777777");
//세마포어 획득
digitalWrite(Relaypin_red, HIGH);
digitalWrite(Relaypin_green, LOW);
Serial.println("On_red");
}
}
//------------------------------------------------------------------------------
static void Thread2(void* arg) {
while (1) {
//BLE 값 변경
bluetooth.print("AT+IBE177777777");
//LED를 켜고
digitalWrite(Relaypin_red, LOW);
digitalWrite(Relaypin_green, HIGH);
Serial.println("ON_green");
//200밀리세컨드 대기한다.
vTaskDelay((5000L * configTICK_RATE_HZ) / 1000L);
for(int i=0;i<4*5;i++){
digitalWrite(Relaypin_green,LOW);
Serial.println("green_UP");
vTaskDelay((250L * configTICK_RATE_HZ) / 1000L);
digitalWrite(Relaypin_green,HIGH);
Serial.println("green_DOWN");
vTaskDelay((250L * configTICK_RATE_HZ) / 1000L);
}
//세마포어를 하나 놓아주어서 Thread1이 LED를 끌 수 있도록 한다.
xSemaphoreGive(sem);
//세마포어넘겨주고 대기
vTaskDelay((10000L * configTICK_RATE_HZ) / 1000L);
}
}
//------------------------------------------------------------------------------
void setup() {
portBASE_TYPE s1, s2;
Serial.begin(9600);
bluetooth.begin(9600);
pinMode(Relaypin_red,OUTPUT);
pinMode(Relaypin_green,OUTPUT);
//카운팅 세마포어를 생성한다.
//최대값 1, 초기값 0
sem = xSemaphoreCreateCounting(1, 0);
//우선순위 2로 LED끄는 태스크를 생성한다.
s1 = xTaskCreate(Thread1, NULL, configMINIMAL_STACK_SIZE, NULL, 2, NULL);
//우선순위 1로 LED켜는 태스크를 생성한다.
s2 = xTaskCreate(Thread2, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
//생성중 에러 발생했는지 체크
if (sem== NULL || s1 != pdPASS || s2 != pdPASS ) {
Serial.println(F("Creation problem"));
while(1);
}
//스케줄러를 시작한다.
vTaskStartScheduler();
//여기가 실행된다면 메모리 부족 상태
Serial.println(F("Insufficient RAM"));
while(1);
}
//------------------------------------------------------------------------------
// WARNING idle loop has a very small stack (configMINIMAL_STACK_SIZE)
// loop must never block
void loop() {
// Not used.
}
반응형
'프로젝트' 카테고리의 다른 글
역경매APP : 아이디어 회의 및 토론 (0) | 2020.07.05 |
---|---|
캡스톤 : 후기 (0) | 2020.07.05 |
캡스톤 : 송수신문제점고찰 (0) | 2020.07.05 |
캡스톤 : 아두이노간 비콘구현 1:n 통신 (5) | 2020.07.05 |
캡스톤 : hm-10 비콘 활성화 (0) | 2020.07.05 |