Dynamic C / Rabbit의 미세 UC-OS / II - 작업 기아가있을 수 있습니다.
-
13-09-2020 - |
문제
미세미엄 UC-OS / II 하에서 동적 C에서 2 가지 작업을 수행하려고합니다.한 가지 태스크는 직렬 포트의 다른 읽기 인 HTTP 핸들러입니다.직렬 포트 작업은 HTTP 태스크가 실행중인 것으로 보입니다.어떤 아이디어 이유는 무엇입니까?나는 UC-OS / II가 preemTive라고 생각했다.
void httptask(void* ptr)
{
http_init();
while(1) {
http_handler();
}
}
void gpstask(void* ptr) {
int c;
while (1) {
c = serFgetc();
}
}
.
두 스레드 모두 동일한 기본 우선 순위로 설정됩니다.
해결책
UC / OS-II는 선제이지만 한 방향으로 만 우선 순위가 높은 스레드가 실행되도록 하위 우선 순위 스레드를 선점하지만 반전을하지는 않습니다.즉, 우선 순위가 높은 스레드가 더 낮은 우선 순위 스레드를 실행할 수 있도록 CPU를 명시 적으로 포기해야합니다.직렬 쓰레드가 HTTP 스레드보다 우선 순위가 높아지고 serFgetc()
는 전혀 제어를 포기하지 않고 (Per OSMboxPend
또는 다른 루틴을 통해) 제어를 포기하지 않습니다.
시스템의 최저 우선 순위 스레드를 직렬 쓰레드를 만들거나 CPU를 제어 할 수 있도록 해당 코드에 무언가를 두십시오.(예를 들어, 데이터가 사용 가능한 인터럽트에서 게시 할 수있는 세마포어가없는 문자가없는 문자가없는 문자가 없을 때 "예를 들어, 세마포어를 기다리고 있습니다.).
다른 팁
UC / OS-II는 고유 한 우선 순위 만 지원합니다.또한 (x) 또는 작업 루프의 다른 항목이 스케줄러에 대한 통제를 포기하는 것과 같은 것을 필요로합니다.
제휴하지 않습니다 StackOverflow