Micrium uC-OS / II на Dynamic C / Rabbit - возможно, задание голодает - PullRequest
4 голосов
/ 10 июля 2010

Я пытаюсь запустить 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 ]

7 голосов
/ 10 июля 2010

uC / OS-II имеет приоритет, но только в одном направлении - он будет вытеснять поток с более низким приоритетом, чтобы позволить потоку с более высоким приоритетом работать, но не будет делать обратное.То есть потоки с более высоким приоритетом должны явно отказаться от управления процессором, чтобы позволить потокам с более низким приоритетом работать.Готов поспорить, что ваш последовательный поток имеет более высокий приоритет, чем поток HTTP, и что serFgetc() вообще не теряет контроль (через OSMboxPend, или OSTimeDly, или через какую-то другую процедуру).

Попробуйте либо сделать последовательный поток потоком с самым низким приоритетом в системе, либо вставить что-то в его код, чтобы позволить ему отказаться от управления процессором.(Например, ожидание семафора, когда нет доступных символов, семафор, который вы можете отправить из доступного данным прерывания.) Любой из них должен работать.

2 голосов
/ 15 августа 2010

uC / OS-II поддерживает только уникальные приоритеты. Также вам нужно что-то вроде OSTimeDLY (x) или какой-то другой элемент в ваших циклах задач, чтобы передать управление планировщику.

...