VxWOrks 신 호 량
6576 단어 VxWorks
신 호 량 은 여러 작업 이 서로 활동 을 조율 할 수 있 도록 허용 한다.작업 간 의 가장 직접적인 통신 방식 은 다양한 데 이 터 를 공유 하 는 것 이다.VxWorks 는 단일 주소 공간 을 사용 하기 때문에 모든 작업 이 하나의 선형 주소 공간 구조 에 존재 하기 때문에 데이터 구 조 를 공유 하 는 것 도 매우 쉽다.전역 변수, 각종 버퍼, 링크 와 지침 은 서로 다른 작업 컨 텍스트 에서 직접 참조 할 수 있 습 니 다.공 유 된 데이터 에 대해 서 는 상호 배척 방문 을 보장 해 야 한다.예 를 들 어 신 호 량 은 임계 구역 의 상호 배척 방문 을 실현 하 는 체제 중의 하나 이다.
신 호 량 제어 관련 함수
semtee: 작업 은 semtee 함 수 를 사용 하여 신 호 량 을 추출 합 니 다. 그 결 과 는 호출 할 때 이 바 이 너 리 신 호 량 이 사용 가능 한 지 여부 에 달 려 있 습 니 다.사용 가능 하 다 면, 작업 은 사용 할 수 없 게 되 고, 작업 은 계속 실 행 됩 니 다.작업 이 사용 되 지 않 으 면 이 신 호 량 이 사용 할 수 있 을 때 까지 작업 이 대기 열 에 걸 립 니 다.
semGive: 작업 이 바 이 너 리 신 호 량 을 방출 할 때 semGive () 를 호출 하려 면 그 결 과 는 호출 시간 에 이 신 호 량 이 사용 가능 한 지 여부 에 의존 해 야 합 니 다.만약 사용 할 수 있다 면, 이번 방출 은 아무런 작용 도 하지 않 고, 신 호 량 을 사용 할 수 없 으 며, 하나 이상 의 작업 이 이 신 호 량 을 기다 리 고 있다 면, 대기 열의 첫 번 째 작업 은 차단 을 해제 하고, 신 호 량 은 사용 할 수 없다.
VxWorks 신 호 량 인 스 턴 스
#include
#include
#include
#include
#define ITER 10
SEM_ID sem_binary;
int globe = 0;
static void taskone(void);
static void tasktwo(void);
int main(void)
{
int taskIdone;
int taskIdtwo;
/*create and initlize a binary semaphore*/
sem_Binary = semBcreate(SEM_Q_FIFO, SEM_FULL);
/*extract a semaphore*/
semTake(sem_Binary, WAIT_FOREVER);/* semTake , , */
taskIdone = taskSpawn("task1",90,0x100,taskone,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
taskIdtwo = taskSpawn("task2",90,0x100,tasktwo,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return 0;
}
static void taskone(void)
{
int i;
for(i=0; i/* semTake , (taskone) */
semTake(sem_Binary, WAIT_FOREVER);/
printf("I am taskone and globe = %d......
",++globe);
semGive(sem_Binary);
}
}
static void tasktwo(void)
{
int i;
/* ,t taskone */
semGive(sem_Binary);
for(i=0; i/* semTake , */
semTake(sem_Binary, WAIT_FOREVER);
printf("I am tasktwo and globe = %d......
",++globe);
semGive(sem_Binary);
}
}
프로그램 출력의 결 과 는:
I am taskone and globe = 1 ......
I am taskone and globe = 2 ......
I am taskone and globe = 3 ......
I am taskone and globe = 4 ......
I am taskone and globe = 5 ......
I am taskone and globe = 6 ......
I am taskone and globe = 7 ......
I am taskone and globe = 8 ......
I am taskone and globe = 9 ......
I am taskone and globe = 10 ......
I am tasktwo and globe = 9 ......
I am tasktwo and globe = 8 ......
I am tasktwo and globe = 7 ......
I am tasktwo and globe = 6 ......
I am tasktwo and globe = 5 ......
I am tasktwo and globe = 4 ......
I am tasktwo and globe = 3 ......
I am tasktwo and globe = 2 ......
I am tasktwo and globe = 1 ......
I am tasktwo and globe = 0 ......
프로그램 분석
여기 서 상기 프로그램의 실행 과정 을 분석 합 니 다. 먼저 main 함수 에서 신 호 량 을 만 든 다음 에 처음으로 semTake 함 수 를 호출 합 니 다. 이때 신 호 량 이 사용 가능 한 상태 이기 때문에 이 를 사용 할 수 없 는 것 으로 설정 하고 작업 을 계속 뒤로 실행 합 니 다.main 함수 에서 taskSpawn 함 수 를 사용 하여 작업 1 (taskone) 을 만 들 고 작업 1 에서 semtee 함 수 를 호출 합 니 다.위 에서 신 호 량 을 사용 할 수 없 도록 설정 하 였 기 때문이다.그래서 여기 서 semtee 를 호출 하면 미 션 taskone 이 차단 상태 에 있 습 니 다.주 작업 을 계속 수행 하고 작업 2 (tasktwo) 를 만 듭 니 다. 작업 2 에서 먼저 semGive 함 수 를 호출 합 니 다. 이 때 작업 이 막 힌 상태 입 니 다.따라서 semGive 함 수 를 실행 한 후 작업 1 을 시작 합 니 다. for 순환 에서 신 호 량 을 사용 할 수 없 는 상태 로 설정 하고 printf 함수 가 실 행 된 후에 신 호 량 을 사용 할 수 있 도록 설정 합 니 다.즉, 우리 가 본 globe 는 0 에서 10 까지 이다.퀘 스 트 1 과 퀘 스 트 2 가 우선 이기 때문에 퀘 스 트 1 이 완성 되면 퀘 스 트 2 가 실 행 됩 니 다.왜 출력 이 위 와 같 는 지 설명 할 수 있다.