Micrium uC-OS/II на Dynamic C/Rabbit - возможно, задание голодает
Я пытаюсь запустить 2 задачи в моем Dynamic C под Micrium uC-OS/II. Одна задача - это обработчик http, другая - чтение с последовательного порта. Задача последовательного порта, по-видимому, препятствует выполнению задачи http. Есть идеи, почему это? Я думал, что uC-OS / II была преждевременной.
void httptask(void* ptr)
{
http_init();
while(1) {
http_handler();
}
}
void gpstask(void* ptr) {
int c;
while (1) {
c = serFgetc();
}
}
Оба потока имеют одинаковый приоритет по умолчанию.
2 ответа
uC/OS-II имеет приоритет, но только в одном направлении - он будет вытеснять поток с более низким приоритетом, чтобы позволить потоку с более высоким приоритетом работать, но не будет делать обратное. То есть потоки с более высоким приоритетом должны явно отказаться от управления процессором, чтобы позволить потокам с более низким приоритетом работать. Держу пари, что ваш последовательный поток имеет более высокий приоритет, чем поток HTTP, и что serFgetc()
не оставляет контроль вообще (через OSMboxPend
, или же OSTimeDly
или какая-то другая рутина).
Попробуйте либо сделать последовательный поток потоком с самым низким приоритетом в системе, либо поместить что-то в его код, чтобы позволить ему отказаться от управления процессором. (Например, ожидание семафора, когда нет доступных символов, семафор, который вы можете опубликовать из прерывания, доступного для данных.) Любой из них должен работать.
uC/OS-II поддерживает только уникальные приоритеты. Также вам нужно что-то вроде OSTimeDLY(x) или какой-то другой элемент в ваших циклах задач, чтобы передать управление планировщику.