• 앞 예제에서 설명한 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초마다 카운트를 출력한다.
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 |