티스토리 뷰

심화

megaOS - 9. Counter

Just4Fun 2016. 10. 29. 21:45

임베디드 시스템을 개발하다보면 어떤 이벤트가 몇번 발생했는지 알고 싶을때가 있다.  이미 입문편에서도 설명하였지만 이벤트의 발생간격이 일정하게 연속되어 발생한다면 타이머로도 사용할 수 있다고 하였다.


이번 글에서는 megaOS에서 제공하는 Counter에 대해서 설명하도록 하겠다.

이전에 설명하던 방식과 다르게 Counter에 대한 내용을 모두 설명한 뒤에 예제 코드를 작성해서 잘 동작되는지 확인해 보도록 하겠다.


먼저, os.h에 Counter와 관련된 내용을 추가해 보도록 하겠다.  Counter에는 이벤트가 발생했을때 그 사실을 알려주기 위하여 Alarm을 반드시 연결하여 사용하도록 되어있다.  따라서 Counter와 Alarm을 같이 설명하도록 하겠다.

Counter 구조체는 이벤트가 몇번 발생했는지 기록하기 위하여 counter라는 변수와 더불어 alarm link를 연결할수 있도록 alarm_list 항목이 선언되어 있다.


Alarm 구조체에는 어떤 counter에서 이벤트를 처리할 것인지 설정하기 위한 counter 항목과 지정된 회수에 도달했을때 실행하기 위한 callback 함수 포인터와 그 함수가 실행될때 넘겨주기 위한 argument data를 저장하기 위한 항목이 있다.

Counter 이벤트가 몇번 발생했을때 alarm을 발생시킬지 알려주기 위하여 trigger를 두었고, 반복적으로 alarm을 사용하기 위하여 interval 항목을 사용한다.

그리고 alarm을 사용할것인지 여부를 알려주기 위하여 enbled flag와 counter에 연결하기 위한 alarm_link항목이 있다.


Counter에서 사용하게 될 inline 함수도 os.h 파일에 추가한다.


이제, 본격적으로 Counter관련 코드를 만들어 보도록 하겠다.

kernel/os_counter.c 파일을 만들고 다음에 나오는 코드들을 차례로 입력해 나간다.

Counter를 만들기 위하여 os_counter_create()를 사용한다.

7번줄은 이벤트가 발생할 때마다 Counter의 카운트값을 하나씩 증가 시켜 누적해서 몇번의 카운트가 발생했는지 저장하게 된다.

9번줄은 Counter의 list에 연결된 첫번째 link에서 alarm을 하나 가지고 온다.

12번줄은 alarm에 있던 trigger값을 하나 감소 시키고, 그 값이 0이 되면 alarm link를 Counter list에서 제거하게 된다.

15번 줄은 만약 alarm의 interval 값이 설정되어 있으면, trigger값을 interval 값으로 재설정한 후 다시 동일한 counter에 link 시킨다.

만약 interval 값이 설정되어 있지 않으면 더이상 alarm을 사용하지 않겠다 뜻이므로 alarm을 disable 시킨다.

25번 줄은 alarm에 등록되어 있던 callback 함수를 호출하여 alarm이 발생하였으므로 적절한 동작을 수행하도록 한다.

27번은 Counter의 alarm list에 연결된 다음 alarm을 가지고 오는 것이다.  결국 alarm list에 연결된 모든 link들에 대해 trigger값을 하나씩 감소 시키게 되는 것이다.


Counter와 관련된 내용은 위의 것이 전부이다.

다음으로는 Alarm과 관련된 코드들을 살펴보겠다.

Alarm을 생성하기 위하여 os_alarm_create()를 사용한다.  코드를 보면 알겠지만 기본적인 초기화 과정을 수행한다.

생성된 alarm을 언제 발생 시킬것인지 설정하는 함수이다.


이렇게 Counter와 Alarm을 이용하여 간단한 테스크 코드를 만들어 보도록 하겠다.


main_task()에 create_uart_counter(); 코드를 추가한다.

create_uart_counter() 함수는 다음과 같이 작성한다.

uart_counter를 만들어서, os_alarm_create()에 넣어준다.  생성한 alarm instance는 곧바로 os_alarm_initialize()에 넣어주고, trigger값을 2로 설정하고, interval값을 3으로 설정하였다.  이렇게 하게 되면, 프로그램이 처음 실행되어 UART로 데이터가 수신 될 때 처음 2개의 데이터가 들어오면 uart counter alarm이 발생하고, 그 다음부터는 매 3개의 uart data가 수신될 때마다 uart counter alarm이 발생하게 된다.


알람이 발생하면 화면에 UART Counter Alarm이라는 메시지를 출력하도록 하였다.


Uart data가 들어 올때마다 그 횟수를 카운트 하기 위하여 uart_dsr()에 다음과 같은 코드를 넣어준다.

os_counter_tick() 함수를 불러서 uart data가 들어오는 횟수를 카운트하게 한다.

참고로, uart_isr()에서는 printf를 제거하였다.  최대한 ISR 시간을 단축하기 위해서이다.


이제 프로젝트를 빌드하고 제대로 동작되는지 확인해 보도록 하자.

위의 그림에서 볼 수 있듯이 처음 두개의 데이터가 들어왔을때 Alarm이 발생했다는 메지시가 출력되었고, 그 이후부터는 3개의 uart data가 들어올때 alarm이 발생했다는 메지시가 출력되고 있는것을 볼 수 있다.



megaOS.zip



심화 과정 목차

'심화' 카테고리의 다른 글

megaOS - 11. Semaphore  (0) 2016.11.07
megaOS - 10. System Timer  (0) 2016.10.31
megaOS - 8. Interrupt  (0) 2016.10.29
megaOS - 7. Context(Task) Switching  (0) 2016.10.27
megaOS - 6. Context load  (0) 2016.10.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함