WaitFor реализация для Cortex M3 - PullRequest
       0

WaitFor реализация для Cortex M3

0 голосов
/ 25 августа 2010

Я использую stm32f103 с GCC и имею задачу, которую можно описать следующим псевдокодом:

void http_server() {
  transmit(data, len);
  event = waitfor(data_sent_event | disconnect_event | send_timeout_event);
}

void tcp_interrupt() {
  if (int_reg & DATA_SENT) {
    emit(data_send_event);
  }
}

void main.c() {
  run_task(http_server);
}

Я знаю, что все встроенные ОС предлагают такую ​​функциональность, но они слишком велики для этогоодиночная задачаМне не нужны вытеснения, мьютексы, очереди и другие функции.Просто ожидание флагов во вторичных задачах и поднятие этих флагов в прерываниях.Надеюсь, кто-то знает хороший учебник по этой теме или есть фрагмент кода переключения контекста и ждет реализации.

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Вам, вероятно, понадобится использовать конечный автомат, управляемый прерываниями .

0 голосов
/ 25 августа 2010

Существует несколько IP-стеков, которые не зависят от операционной системы или даже от прерываний. На ум приходит lwip (легкий вес ip). Я использовал это косвенно, как это было предоставлено xilinx. У фридайсов, возможно, был один, конечно, приходят на ум пакетные драйверы crynwr, для которых, без сомнения, были построены стеки.

Насколько возможно более простой вопрос. Ваш код находится на переднем плане в функции waitfor (), которая, кажется, хочет быть бесконечным циклом, ожидающим изменения некоторых глобальных переменных. И прерывание приходит вместе, вызывает обработчик прерывания, который при большой работе стека (чтобы знать, что это tcp-прерывание) вызывает tcp_interrupt, который изменяет флаги, прерывание завершается, и теперь waitfor видит глобальный флаг изменения. Переключение контекста - это прерывание, встроенное в процессор, не требующее операционной системы или чего-либо еще, глобальная переменная или два и isr. Переключение контекста и флаги / события являются халявой по сравнению со стеком tcp / ip. UDP значительно проще, вам действительно нужно tcp кстати?

Если вы хотите активировать более одного из этих waitfor (), в основном вы не хотите, чтобы в одном waitfor () находилось только одно передовое задание. Тогда я бы сделал одну из двух вещей. проведите опрос переднего плана, вместо wait (что-то) измените его на if (checkfor (что-то)) {затем сделайте что-то}.

Или настройте свою систему так, чтобы обработчик прерываний, который в вашем псевдокоде уже очень сложен, чтобы знать, что это данные пакета tcp, глубже изучает заголовок tcp и знает, что нужно вызвать функцию http_server () для событий порта 80, и другие функции для других событий, которые вы могли бы ждать. Так что в этом случае вместо серии многозадачных функций, которые ждут (), создайте единый список событий и ищите их в ISR. Используйте таймер, прерывание и глобальные переменные для тайм-аутов (сбросьте счетчик при получении пакета, увеличьте счетчик по прерыванию по таймеру, если счетчик достигнет N, а затем произошел тайм-аут, вызовите функцию обработчика задачи тайм-аута).

...