ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 3
    전공 - IT/졸업작품 2023. 7. 23. 14:55

    영어 원문을 한글로 해석하여 정리한 글이므로 정확하지 않은 정보를 포함할 수 있음

     

     목차 

    1.  동시성 이란?

    2.  Contiki-NG의 동시성 접근 방식

    3.  스레딩

    4.  작업 일정

     

     

     

     1. 동시성 이란? 

    동시성은 동시에 2개 이상의 작업을 수행하는 기능이다

    프로세스는 문제 모델이 다른 여러 작업을 처리할 수 있고 FIFO(First In First Out) 또는 LIFO(Last In First Out)을 적용하여 동시성을 달성할 수 있다

     

     

     

     2. Contiki-NG의 동시성 접근 방식 

    Contiki-NG 애플리케이션에서 동시성을 구현하는 방법에는 프로세스, 타이머, 스레딩, 작업 일정으로 4가지가 있다

     

     

    프로세스


    Contiki-NG 애플리케이션은 협력(cooperative)모드나 선점(preemptive) 모드에서 실행되는 프로세스에서 실행된다

    협력모드는 Micro Controller에서 정기적으로 실행되고
    선점형 모드의 프로세스는 I/O 또는 타이머로 인한 중단으로 실행된다

     

    Contiki-NG 에서 PROCESS()를 호출하면 프로세스를 생성할 수 있고 위와 같이 정의된다

     

    다음으로 PROCESS_THREAD를 사용하여 프로세스를 구현한다

     

     

     간단한 Contiki-NG 앱 만들기 

    demo-process 폴더를 만들고 demo-process.c 와 Makefile 을 만든다

     

    demo-process.c

    3개의 프로세스를 생성하고 프로세스의 변수를 AUTOSTART_PROCESS()에 전달한다
    AUTOSTART_PROCESSES는 콘티키(contiki) 시스템이 시작될 때 자동으로 시작되는 프로세스를 등록한다
    < name : 이름  /  ev : 이벤트  /  data : 사용할 데이터 >

     

    Makefile

    CONTIKI 에서 contiki-ng 폴더로 경로를 입력한다

     

    demo-process 앱을 실행하기 위하여 native 파일을 생성한다

     

    생성된 native 파일을 실행하면 위와 같이 정상적으로 실행됨을 확인할 수 있다

     

     

     

    타이머 작업


    Contiki_NG 에는 timer, stimer, ctimer, etimer, rtimer 와 같이 하나의 클럭과 여러 타이머 모듈이 있다

     

    contiki-ng 폴더아래 os/sys 경로로 이동하면 모든 라이브러리가 있음을 확인할 수 있다

     

     

     Clock Library 

    clock.h

    시간에 따른 일반적인 활동을 수행하는 데 사용된다

     

    clock_time() 함수를 호출해 사용할 수 있다

     

     

     Timer Library 

    timer.h

    타이머 라이브러리는 타이머를 설정, 재설정 및 다시 시작하고
    타이머가 만료되었는지 확인하는 기능을 제공한다

     

    Timer 라이브러리에서 timer_set()을 호출해서 사용할 수 있다

     

     

     Stimer Library 

    stimer.h

    Timer Library와 유사하지만 시간 값을 초 단위로 사용한다

     

    Timer Library와 동일한 접근방식이며 stimer_set()을 호출하여 시간을 설정하고
    stimer_expired() 함수를 사용하여 만료된 타이머를 확인한다

     

     

     Etimer Library 

    Etimer Library는 이벤트를 생성하는 이벤트 타이머 라이브러리이다

     

    etimer_set()을 호출하여 이벤트 타이머를 설정한다
    그런 다음 PROCESS_WAIT_EVENT_UNTIL()을 사용하여 만료된 이벤트를 기다린다

     

     

     Ctimer Library 

    ctimer.h

    타이머 만료가 발생할 때 호출되는 함수 콜백을 제공한다

     

    이 함수는 ctimer 라이브러리를 설정할 때 ctimer_set()에 전달된다

     

     

     Rtimer Library 

    rtimer.h

    실시간 작업을 위한 스케줄링 및 실행을 제공한다

     

    rtimer_set() 함수와 실행시간을 설정한다

     

     

     타이머 앱 만들기 

    demo-timer 폴더를 만들고 demo-timer.c 와 Makefile을 생성한다

     

    demo-timer.c

    17 ~ 46
    4개의 프로세스를 정의하고 AUTOSTART_PROCESSES를 사용하여 이 네 개의 프로세스를 자동으로 시작한다
    실행 속도가 빠른 rtimer와 관련된 프로세스(demo_timer4)를 제외하고
    counter 변수기준으로 각 프로세스가 종료되도록 구현되어 있다

    timer 1
    timer와 stimer를 사용하며, 각각 3 CLOCK_SECOND 및 3 초의 만료 시간으로 설정한다
    timer와 stimer가 만료되면 해당 시간을 출력하고 카운터를 증가시킨다
    카운터가 2 이상이 되면 프로세스를 종료한다

    timer 2
    etimer를 사용하며, 만료 시간은 3 CLOCK_SECOND으로 설정한다
    이 프로세스는 etimer의 시간 만료와 함께 실행을 계속하며, 카운터가 2 이상이 되면 종료한다

    timer 3
    ctimer를 사용하며, 만료 시간은 1 CLOCK_SECOND으로 설정된다
    이 프로세스는 사용자 정의 콜백 함수 
    perform_ctime_callback을 사용하여 ctimer가 만료될 때마다 호출한다
    카운터가 2 이상이면 ctimer를 중지하고 리셋한다

    timer 4
    rtimer를 사용하며, 만료 시간은 RTIMER_SECOND / 2로 설정된다
    이 프로세스는 사용자 정의 콜백 함수 
    perform_rtime_callback과 함께 동작하며, 카운터가 2 미만일 때만 실행한다

     

    Makefile

     

    작성 완료 후 native 파일을 생성해 준다

     

    만들어진 native 파일을 실행시키면 위와 같이 정상적으로 실행된다

     

     

     

     

     3. 스레딩 

    Contiki는 mt_thread를 통해 많은 작업을 수행할 수 있도록 스레딩을 지원한다

    contiki_root/core/sys 폴더에서 mt.h 의 내용을 확인할 수 있다

     

    mt.h

    Contiki-NG 에서는 지원하지 않는 기능이지만 관련 코드를 작성하였다

     

    contiki 앱의 스레딩 상태

    각 스레드는 프로세스에서 실행된다

    각 스레드는 리소스를 공유하거나 데이터를 교환한다

     

    위의 방법으로 Contiki Process 에 스레드를 생성할 수 있다

     

    Contiki 프로세스의 스레드

    위 사진은 프로세스에서 실행 중인 3개의 스레드를 보여준다

     

     Thread 앱 만들기 

    demo-thread 폴더를 만들고 demo-thread.c 와 Makefile을 생성한다

     

    demo-thread.c

     

    Makefile

     

    파일을 생성하고 native 파일을 만드는 과정에서 mt.h 파일이 없어서 실패하였다

     

     

     

     4. 작업 일정 

    작업 예약이란 모든 작업이 실행되도록 예약되어 있음을 의미한다

    Contiki-NG 애플리케이션에서 작업 스케줄링은 프로세스, 타이머 및 스레딩의 모든 작업을 수집한다

     

    Etimer 라이브러리를 활용하여 작업 스케줄링을 구현하고 
    우리의 작업 목록은 Contiki-NG 목록에 저장되며 list.h 파일에서 찾을 수 있다

     

    Execute a task

    위 사진은 작업 스케줄링을 구현하는 모습을 보여준다

     

     

     스케줄링 앱 만들기 

    demo-scheduling 폴더를 만들고 scheduling.c 와 Makefile을 생성한다

     

    scheduling.c

    프로세스 demo_taskscheduling을 생성하고 AUTOSTART_PROCESSES를 사용하여 자동으로 시작하도록 설정한다

    simple_task 구조체를 정의하고 작업 목록(task_list)에 10개의 예시 작업을 초기화한다
    작업에 대한 정보는 value 멤버 변수에 저장한다

    런타임 콜백 함수인 perform_rtime_callback을 설정하고 각 작업의 실행 모습을 출력한다

    작업 목록에서 다음 작업을 가져온 뒤 목록에 남아있는 작업이 없으면 '모든 작업을 완료'한다는 문자열을 출력하고
    작업을 완료한 것으로 표시한다

    프로세스가 일정이 끝나기를 기다리고 일정이 끝나면, 프로그램이 종료된다

     

    Makefile

     

    마찬가지로 native 파일을 생성한다

     

    위와 같이 정상적으로 실행된다

     

    종료역시 완벽하게 된다

     


    기타 참고 내용

    프로세스용 매크로 API 목록
    
    PROCESS_BEGIN()
    //  프로세스의 시작을 선언
    
    PROCESS_END()
    //  protothread 프로세스 종료 선언
    
    PROCESS_EXIT()
    //  프로세스를  종료
    
    PROCESS_WAIT_EVENT()
    //  모든 이벤트를 기다린다
    
    PROCESS_WAIT_EVENT_UNTIL()
    //  이벤트를 기다리지만 조건이 있다
    
    PROCESS_YIELD()
    //  모든 이벤트를 기다린다
    
    PROCESS_WAIT_UNTIL()
    // 주어진 조건을 기다린다
    
    PROCESS_PAUSE()
    //  마이크로 컨트롤러를 일시적으로 양보한다

     

     

    728x90

    '전공 - IT > 졸업작품' 카테고리의 다른 글

    Ubuntu(22.04) - Contiki 설치하기  (0) 2023.07.29
    Chapter 4  (0) 2023.07.24
    Chapter 2  (0) 2023.07.16
    Chapter 1  (0) 2023.07.16
    Ubuntu(22.04) - Contiki-NG 설치하기  (0) 2023.07.12
Designed by Tistory.