пятница, 25 декабря 2015 г.

RTOS и режим SSX

Существует модель выполнения процесса SSX (Single shot execution).
Идея ее проста - процесс представляет из себя функцию, из которой обязан выйти по истечении короткого времени.
Никаких while недопускается (почти).
Для реализации такой концепции, необходимо особым образом реализовывать потоки, но оно того стоит, так как экономится память, процессорное время и код становится намного проще.
Давайте сначала представим данную модель на очень примитивном примере, а затем будем ее совершенствовать.
Пример будет такой, у нас есть основной поток, или как его принято называть super loop.
В нем мы будем проверять нашажие кнопки, и включать красный светодиод.
И еще один поток, мигающий светодиодом.
Кроме потоков нам нужен планировшик, он должен запускать потоки, останавливать и так далее.
К планировщику нужен таймер.
Перед началом работы, запускам таймер, который должен генерировате прерывание раз  в какойто квант времени.

В обработчике прерывания от таймера прячется планировщик:

OnTimer1OVF()
{
  IF(Флаг_выполнения_потока)
  {
      //Сейчас мы не можем обрабатывать другие потоки
  }
  ELSE
  {
      FOR(i=0, i < Количество_потоков, i++)
      {
            IF(потоки[i].зазор >= потоки[i].период)
           {
            //Время с момента завершения предыдущего вызова потока, превысило или равно,                        желаемуму периоду выполнения потока, можно вызывать снова.
                Флаг_выполнения_потока = 1;              
                потоки[i].зазор = 0;
                потоки[i].shot();
                return();
           }
      }
  }
}
Завтра допишу!