OS/vxWorks VxWorks (세마포어)
  • 728x90
    반응형

     

     

     

     

     

     

    • 앞 예제에서 설명한 Task 생성 및 232 디바이스에 대해서는 설명을 생략 하도록한다.

    • 타이머를 생성하여 원하는 주기로 Task를 호출하는 예제이다.

    • 세마포어를 생성하고 Task 가 블록킹 되어있다가 타이머에 의해 원하는 주기마다 세마포어 ID를 건네받은 Task 가 수행된다.

     

     

     

    • taskLib.h 는 semBCreate()함수 옵션을 사용하기 위해 등록 하였다.

    • 바이너리세마포어를 생성하는 semBCreate()함수는 생성된 세마포어 핸들을 반환한다.

    • 반환되는 핸들을 저장하기위해 semID1, semID2 변수를 선언하였다.

    SEM_ID 타입은 아래와 같이 구조체 포인터로 typedef 되어있다.

     

     

    • semaphore 구조체는 세마포어 핸들 및 옵션, 상태를 저장하고있다.

     

     

     

    [ main 함수 ]

     

     

    semBCreate() 함수로 세마포어를 생성한다. 함수의 원형은 아래와 같다.

     

     

    semBCreate() 함수의 첫번째 인자는 options 이며, 옵션은 아래와 같이 정의 되어있다.

     

     

    • 두번째 인자는 initialState 이며, 초기상태를 의미하며 아래와 같이 선언되어 있다.

     

     

    sysAuxClkRateSet()함수는 보조클럭 세팅 함수로, 60Hz로 설정되었으며 1초에 60번 클럭이 발생한다.

      함수 원형은 아래와 같다.

     

     

    sysAuxClkConect() 함수는 보조클럭 60Hz 로 호출될 함수와 연결시켜 주는 함수다.

     

     

    • 첫번째 함수 인자는 연결될 함수를 가리키는 함수 포인터이다.

      아래와 같이 typedef 되어 있다.

     

     

    • 두번째 인자는 연결된 함수의 인자로 값을 넘겨줄 수 있다.

    sysAuxClkEnable() 함수는 위에서 세팅된 보조클럭 발생을 시작하는 함수이다.

     

     

     

    [ myTimer 함수 ]

     

     

    • myTimer함수는 1초에 60번 호출되는 함수이다. 첫번 째 if 제어문에서 조건은 1초마다 semGive()함수로 세마포어    ID를 semTake() 함수에게 전달한다.

    • 두번 째 if문에서는 5초마다 semGive()함수로 세마포어 ID를 semTake() 함수에게 전달한다.

     

    [ myTask1 함수 ]

     

     

     

    • FOREVER 는 무한루프로 아래와 같이 define되어 있다.

     

     

    • FOREVER 에서 semTake()함수는 블록킹함수로 semGive()함수가 세마포어 ID를 건네줄때 까지 Pend 된다.

     

     

    semTake() 함수의 첫번째 인자는 세마포어 ID이다. 두번째 인자는 timeout 옵션으로 아래와 같이 정의되어 있다.

     

     

     

    [ myTask2 함수 ]

     

    • 두번째 함수인 myTask2는 myTask1과 동일

     

    [ clean 함수 ]

     

    sysAuxClkDisable() 함수는 sysAuxClkEnable() 함수와 반대되는 개념으로 보조클럭을 멈추는 함수이다.

    • 생성된 세마포어는 종료시에는 semDelete() 함수로 세마포어 ID를 삭제한다.

     

    [ 실행 결과 ]

     

    • main 함수를 실행하면 Task1 은 1마다 "Hello VxWorks"를 출력 하고, Task2는 5초마다 카운트를 출력한다.

     

     

    728x90
    반응형

    'OS > vxWorks' 카테고리의 다른 글

    VxWorks C99 버전 변경  (0) 2017.06.30
    [VxWorks] 메시지 큐 예제  (0) 2017.06.30
    VxWorks (Task 생성 / RS232 통신 )  (0) 2017.06.30
    VxWorks OS구성 / 개발 방법  (2) 2017.06.30
    Task 란? / taskSpawn  (0) 2017.06.30
상단으로