반응형
프로그래밍 노트/C&C++2015. 1. 22. 13:03디렉토리에서 특정 문자열로 시작하는 엔트리 읽어오기

디바이스 드라이버를 insmod 해서 올릴 때마다 디바이스 파일의 전체 경로의 중간 이름이 자꾸 바뀌어서 수동으로 계속 입력하기 힘들어서 간만에 시스템 프로그래밍 책을 꺼내 들고 짜봤습니다. /sys/bus/w1/devices/28-000005e41463/w1_slave /sys/bus/w1/devices/ 경로 아래에서 28-로 시작하는 엔트리를 읽어온 후 문자열을 조합하면 되는 군요. 진짜 간만에 하는 거라 좀 어설플지 모르지만 의도한대로 잘 동작합니다. #include #include #include #include #include char* findDeviceName(char *path, char *devicename) { struct dirent *entry; DIR *dir; char* ful..

Arduino 예제 – cds + 캐릭터 lcd
Arduino Uno2015. 1. 20. 22:51Arduino 예제 – cds + 캐릭터 lcd

불을 끄면 CDS값이 50이하로 떨어지고 LCD화면에 plz turn on을 출력합니다. 다시 불을 켜면 cds값은 올라가게 되고 LCD화면에 plz turn off를 출력합니다. 한줄만 지우는 방법을 못찾아서 약간 깜박입니다. 소스코드 #include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int cdsPIN = 0; int ledPIN = 6; void setup() { // put your setup code here, to run once: Serial.begin(9600); lcd.begin(16,2); } void loop() { // put your main code here, to run repeatedly: int value = analogRead(cdsPI..

아두이노 시리얼 명령으로 LED 켜고 끄기
Arduino Uno2015. 1. 20. 20:56아두이노 시리얼 명령으로 LED 켜고 끄기

아두이노에 LED를 연결해서 시리얼로 특정 문자열을 입력하면 켜고 끄는 것을 구현했습니다. 다른 장치들을 더 붙이고 사용 가능한 명령어들을 더 만들면 다양한 활용이 가능할 듯합니다. 실행결과 turn on을 입력하면 LED를 켜줍니다. led off를 입력하면 LED를 꺼버립니다. 엉뚱한 문자열을 입력하면 입력 가능한 명령들을 알려줍니다. 소스코드 int ledPIN = 10; char ledStatus = LOW; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode( ledPIN, OUTPUT ); } String readSerial() { String str = ""; char ch; while( Se..

아두이노 freeRTOS 튜토리얼 20
Arduino FreeRTOS2015. 1. 18. 05:40아두이노 freeRTOS 튜토리얼 20

컨택스트 스위치 발생시 펄스 발생하는데 걸리는 시간과 그냥 만들었을 때 펄스 발생하는데 걸리는 시간을 비교스코프가 없어서 오차있겠지만 그냥 소프트웨어적으로 측정해봄 아두이노 Uno의 경우 스코프로 재면 50마이크로세컨트 차이난다는데 여기에선 70마이크로 세컨드 정도 차이남. // Test to determine context switch time with a semaphore // Connect a scope to pin 13 // Measure difference in time between first pulse with no context switch // and second pulse started in ledControl and ended in ledOffTask. // Difference sho..

아두이노 freeRTOS 튜토리얼 19 – 세 개의  태스크 실행
Arduino FreeRTOS2015. 1. 17. 04:21아두이노 freeRTOS 튜토리얼 19 – 세 개의 태스크 실행

세 개의 태스크를 수행한다. LED를 깜빡이게 하는 테스크 현재 남은 스택크기와 힙의 크기를 시리얼로 출력하는 태스크 IDLE 루프 // Simple demo of three threads // LED blink thread, print thread, and idle loop #include const uint8_t LED_PIN = 13; volatile uint32_t count = 0; // handle for blink task TaskHandle_t blink; //------------------------------------------------------------------------------ //LED를 깜빡이게 하는 태스크가 우선순위가 가장 높다. static void vLEDFl..

아두이노 freeRTOS 튜토리얼 18 – LED  2개  번갈아가며 깜빡이게 하기
Arduino FreeRTOS2015. 1. 17. 01:05아두이노 freeRTOS 튜토리얼 18 – LED 2개 번갈아가며 깜빡이게 하기

LED 2개가 번갈아 가며 켜지는 예제를 세마포어 2개를 이용하여 만들어봤습니다. 세마포어를 얻으면 서로 상대방의 LED를 끄고 자신의 LED를 켜는 구조입니다. 처음에 어쩔 수 없이 한쪽 LED켜는 태스크에 세마포어를 주어서 시작하는 방식을 이용했습니다.. 아직 공부 중이라 이게 올바른 방법인지는 모르겠군요. 많은 구현 방법 중 하나라고 생각됩니다. #include //LED를 연결하는 핀 번호 const uint8_t LED_PIN = 13; const uint8_t LED_PIN2 = 9; //세마포어 핸들을 선언 SemaphoreHandle_t sem; SemaphoreHandle_t sem2; static void Thread1(void* arg) { pinMode(LED_PIN2, OUTPUT..

Arduino FreeRTOS2015. 1. 17. 00:55아두이노 freeRTOS 튜토리얼 17 - LED깜빡이게 하기

역시 마찬가지로 아래 포스팅에서 설치했던 라이브러리에 포함되어있던 예제를 분석합니다. 이제 여섯 개가 남았군요.. Arduino Uno에서 freeRTOS 올려보기(http://webnautes.tistory.com/595 ) 우선순위 높은 Thread1이 먼저 실행되지만 사용 가능한 세마포어가 없어 무한정 기다리게 된다. 이때 우선순위 낮은 Thread2가 실행되어 LED 를 켜고 200밀리세컨드 대기했다가 세마포어를 놓아주면 다시 우선순위 높은 Thread1이 실행되어 세마포어를 획득한 후 LED를 끄게 되고 다시 세마포어를 기다리는 상태가 된다. 그러면 다시 Thread2에서 200밀리세컨드 더 기다렸다가 다시 LED를 켜게 된다. 결과적으로 LED를 200밀리세컨드 주기로 깜빡이게 만든다. /* ..

아두이노 freeRTOS 튜토리얼 16
Arduino FreeRTOS2015. 1. 16. 23:52아두이노 freeRTOS 튜토리얼 16

우선순위 높은 Print2 태스크가 실행되어 자신에 해당되는 문자열을 큐에 넣고 임의의 시간 대기한다. 그 사이 태스크 1이 실행되어 자신에 해당되는 문자열을 넣고 임의의 시간 대기한다. 태스크2의 대기 시간보다 짧아서 여러 번 실행될 수 있다. 다른 태스크들이 블록되어 있는 동안 우선순위 가장 낮은 Gatekeeper 태스크가 큐에 있는 데이터를 출력한다. 틱 후크 인터럽트가 발생하면 틱 인터럽트 서비스 루틴이 실행되어 큐에 대응되는 문자열을 넣는다. 역시 나중에 Gatekeeper 태스크에서 출력되어 진다. /* FreeRTOS.org includes. */ #include "FreeRTOS_AVR.h" //#include "task.h" //#include "semphr.h" /* Compiler ..

아두이노 freeRTOS 튜토리얼 15
Arduino FreeRTOS2015. 1. 16. 20:51아두이노 freeRTOS 튜토리얼 15

공유자원인 시리얼을 두 개의 태스크가 동시에 기록하면 아래처럼 첫번째 태스크에서 다 기록하기 전에 두번째 태스크가 선점하여 문자열을 출력하는 원치 않은 결과를 얻을 수 있다. 이를 방지하기 위해서 뮤텍스 타입의 세마포어를 사용하여 시리얼을 사용 중일 때에는 다른 태스크가 시리얼에 접근 할 수 없도록 막는다. 정상적으로 수행되는 경우의 결과… /* FreeRTOS.org includes. */ #include "FreeRTOS_AVR.h" //#include "task.h" //#include "semphr.h" /* Compiler includes. */ //#include //#include //화면에 문자열을 출력하는 태스크를 위한 함수 static void prvPrintTask( void *pvP..

아두이노 freeRTOS 튜토리얼 14
Arduino FreeRTOS2015. 1. 16. 18:57아두이노 freeRTOS 튜토리얼 14

처음 실행시키면 vIntegerGenerator태스크보다 vStringPrinter태스크의 우선순위가 높기때문에 먼저 실행이 되나 큐가 비어있기때문에 블록 상태가 된다. 따라서 vIntegerGenerator태스크가 실행되지만 vTaskDelayUntil함수를 사용했기 때문에 정해준 값인 200밀리세컨드마다 대기상태에서 벗어나와 작업을 시작할 수 있다. vIntegerGenerator에서 증가시킨 정수값을 큐에 넣는 것을 5번 반복한 후 인터럽트를 발생시킨다. 인터럽트 서비스 루틴인 vExampleInterruptHandler 함수가 호출된다. vExampleInterruptHandler에서 정수값을 넣은 큐에서 데이터를 꺼내와서 정수에 대응되는 문자열을 큐에 문자열을 넣는 큐에 넣는다. 정수값을 꺼내오..

반응형
image