Машина времени для крошек.

AVR
При программировании микроконтроллеров часто требуется отслеживать временные промежутки. Даже банальное «помигать светодиодом» требует учета времени погашенного состояния и времени светимости.

В Си есть функция delay_ms(X), которая выполняет пустой цикл X ms, то есть по сути вешает проц на X*fcpu/1000 тактов, так как ничего иного в это время он делать не может.

Многие прогеры, намучившись с этой функцией (или ей подобными), переходят на использование прерываний и аппаратных таймеров, но тут другая засада — их всегда мало.

Каждый выкручивается как может, например навешивает на один таймер несколько функций, использует биты счетчика как флаги, впрягает в нарты сторожевую собаку… вариаций много, но всегда новый проект означает новые выеживания, поиски решения в ограниченном пространстве.

Пройдя все эти стадии, я наконец-то дорос до понимания, что «что-то тут не так». Нарисовалась необходимость диспетчеризации задач по таймеру.
Прочитав AVR. Учебный Курс. Архитектура Программ Часть 2 в очередной раз убедился, что изобрел велосипед… ну и пусть, это просто еще один вариант решения.


Читать дальше
  • +2
  • 24 января 2018, 13:02
  • iva
  • 1

Уже не такой простой диспетчер с динамической очередью задач для PIC12F/16F

Доброго времени суток. Опять я со своими ассемблером и ПЫК16. Вот наконец-то, как и запланировал, дописал свою «Недо ОС» на ассемблере под Пики. Кому интересно, с чего начиналось — могут почитать здесь: we.easyelectronics.ru/Gnusmas/prostoy-dispetcher-s-fiksirovannoy-ocheredyu-zadach-dlya-pic16.html

В этой итерации я шагнул гораздо дальше. Настолько дальше, что следующей итерацией должно уже быть что-то на Си. Но я все же прошу заглянуть адептов асcемблера и высказать свое 'фе' по поводу качества и функционала моего кода, чтобы я был твердо уверен, что выжал все, что можно было.
Из того что усовершенствовано по сравнению с предыдущим проектом:
  1. Очередь задач из фиксированной переделана в динамическую, в виде кольцевого буфера, размер котрого задеться в файле настройки ОС
  2. Проект «Недо ОС» разбит на несколько файлов: файл «ядра», файл задач, файл настройки ОС, файл макросов общего употребления
  3. Все возможные настройки системы упакованы в макросы и по максиму автоматизированы. То есть расчитано, что Вы зайдете в файл настройки системы Nedo_OS_v1.4.h, внесете в него необходимые Вам параметры ОС, а дальше все само подстроится и создастся. Вам останется только написать обработчик для каждой Вашей задачи.
  4. Исправление банальных ляпов вроде переписи содержимого таймера в конце, а не начале обработчика прерывания, что устраняет неравномерность возникновения прерываний при разном количестве таймеров, и прочие мелочи.

Сейчас проект (8 светодиодов мигают каждый со своей частотой) занимает 269 слов памяти программ и 52 байта ОЗУ, влазя таким образов во все 12F и 16F камни. На 16F84 остается 755 слов памяти программ (3/4 доступного объема) 16 байт ОЗУ (1/4 доступного обьема). Как видим, добавление очереди задач в виде кольцевого буфера и номера целевой задачи для каждого таймера съело львиную долю ОЗУ. Замечания и пожелания приветствуются.