AVR. Учебный курс. Операционная система. Введение.Print This Post

Автор DI HALT
Опубликовано 14 марта 2009 
Рубрики: AVR. Учебный курс
Метки: ,

Рано или поздно наступает момент когда сложность алгоритма становится такой, что дальнейшее развитие и усложнение программы превращается в нетривиальную задачу. Очень легко запутаться и тяжело отлаживать эту портянку. Многие бегут от этих сложностей в языки высокого уровня, впрочем это не особо спасает — разница минимальна на самом деле и проще не становится.
Самое верное решение в данном случае — внедрение в проект операционной системы. Которая бы предоставляла API для решения задач, а также обеспечивала порядок работы всей системы.

В результате было написано микроядро. Камрад Serg2×2 подглядел концепцию в прошивке сотового телефона Motorola и портировал на микроконтроллер АТ89С2051, после ее перенесли на AVR, а я привел все в библиотечный и структурированный вид, обвязал все удобными макросами, а также подробно описал и задокументировал. Так что теперь интеграция ядра операционки в проект под микроконтроллер AVR занимает буквально пару минут работы Copy-Paste.

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

Параметры и системные требования микроядра:


Суть всех заморочек
Представь что ты пишешь простейшую программу — мигнуть светодиодом. Как ты это будешь реализовывать?
На ум сразу же приходит следующий алгоритм:

Просто, логично, понятно.

А если усложнить? Мигать будем не одним диодом, а тремя, да еще чтобы первый мигал с частотой в 1кГц, второй в 500Гц, а третий 200Гц. Представил сразу же в голове алгоритм? Наверняка тут же получил переклин мозга и немудрено. Линейно развернуть такую структуру весьма сложно, даже если применить таймеры. Да, на таймерах выкрутишься, но это пока диодов три, а если десять?

Как то же самое делается на микроядре:

Главный цикл

Таблица задач

Все. Основной алгоритм получается практически линейным. Остальное делает ядро. Не меняя структуры можно добавить еще задач, навешать их в любом порядке. И это практически не повлияет на выполнение остального кода, разве что придется немного скорректировать настройки таймера.

По договоренности с издательством Gameland я, до выхода журнала не буду раскрывать всех подробностей. В мартовском журнале Хакер будет статья по микроядру, после выхода журнала я еще немного подожду и со спокойной душой продолжу.

Пока же можете скачать готовую программу на микроядре и посмотреть что там как. Может разберетесь :)

Комментарии

16 комментариев на «AVR. Учебный курс. Операционная система. Введение.»


  1. ArgusB 14 марта 2009 12:00

    Тююю. Так не интересно. Называется Поматросил и бросил… Вот после выхода статьи и писал бы. А со светодиодами задачка просто решается. Тут надо понимать, что тупить можно не только в цикле, но и занимаясь при этом полезными делами. И ещё - что алгоритм, разрезаный на 10 кусочков, работает точно так же, как был бы единым. Так что две переменных и один таймер. Причём всё “в лоб”. Крутим цикл, каждый раз проверяем на соответствие граничным значениям, и в зависимости от - гасим или зажигаем. Ещё и скважность мигания регулироваться будет. Так что пример крайне неудачный, тут никакая “система” не нужна. Лучшая система, парни, находится у вас на плечах. Типа шапку вы на ей носите, а ещё туда кушаете.

    DI HALT

    Это не поматросил и бросил, это называется буржуйским словом Тизер :)


  2. GrayCat 15 марта 2009 1:24

    Посмотрите _русскую_ доку на операционку “JacOS”: jacos.narod.ru - там очень хорошо рассказывается, что такое ОС в применении к микроконтроллерам, зачем это нужно и как применять. Сам JacOS, к сожалению, сдох, но вот описалово - “нетленка” forever!

    Я лично сейчас осваиваю AvrX: http://www.barello.net/avrx/ - операционка для AVR, заточена под использование из C (WinAVR), но сама написана на АСМе ;) Пока нравится.

    DI HALT

    О! зашибенная вещь. Потяжелей конечно, но зато фарша в ней дофига.


  3. smokie 15 марта 2009 5:45

    Конкретно с 10 (и вообще любым количеством) светодиодов довольно просто решается через переменные-счетчики. На каждый диод заводится свой счетчик и инициализируется некоторым значением. За каждый проход цикла уменьшается значение всех счетчиков, и те из них, которые достигли нуля, означают что пора включать (выключать) соответствующий диод. После этого значение этого счетчика перезагружается. Естественно, они должны быть рассчитаны заранее, чтобы обеспечить требуемую задержку.

    DI HALT

    В любом случае надо городить кучу проверяющих условий. Проверку каждого на совпадение, замедление таймера и еще дофига параметров.

    SWG

    Я в таких случаях делаю проще. Делаю прерывание по таймеру, например, 1 мсек. В обработчике прерывания проверяю счетчики, если не 0, - декремент.
    Главный проверяет состояния счетчиков, если не 0 включает светодиод, иначе выключает. Остается по мере надобности забрасывать в программные счетчики нужные значения в мс. Аналогично делаю встроенные часы и календарь, только там инкремент до нужного значения и, например, при 60 в счетчике секунд обнуляю его с инкрементом минутного, если он достиг 60, сбрасываю в 0, и инкрементирую счетчик часов, и т.д.
    Для больших задержек делаю декремент нужного по инкременту секунд, или минут, или часов и т.д.


  4. Nikita Nazarenko 15 марта 2009 18:39

    а об этом что можешь сказать?

    http://ru.wikipedia.org/wiki/FreeRTOS
    http://www.freertos.org/

    DI HALT

    Больно универсальна. А намек на то, что дескать для понятности написана в основном на си уже говорит о том, что жирная и неторопливая. Критические вещи надо писать на асме, тем более такие как ОС :)

    НУ и запустится она скорей на МК не младше чем АТМега64


  5. mmb 28 марта 2009 1:32

    Десь копеек за отечественного производителя…
    uOS
    1
    2

    DI HALT

    Видел. Слишком тяжела. Надо чтобы на Тини2313 запускалась и еще места под прикладную часть было хотя бы 70%


  6. topor123 07 июня 2009 17:01

    дык ето что ж –чтобы например на atmege8 32-мя каналами светодиодов мигать с шимом и читать из внешней пэзэушки(twi) значения шим надо обязательно rtos?

    DI HALT

    Нет конечно, можно и на флагах сфигачить, но на РТОС будет проще. Я так уже все на ней делаю, обленился :) Тем более после обрезки ядро занимает 300+ байт всего.

    topor123

    Программист и не ленивый–это не программист(ни сисадмин и даже не сисоп(если кто помнит что это такое)

    первое знакомство с микроконтролерами начал с пиков на асме. Но так как паскаль
    ближе решил на АДА(для AVR)-быстро, классно и главное как роман читаешь не то что Си. Ну не нраятся мне эти printf(~%’зю зю :~”Если в программе есть циклы она зацикливается, если в программе есть лупы она…

    т.е. асм для AVR учить..видно не отвертишься –БЛИН. Жаль task(ВОТ ЭТО МОЩА) адовский для AVR не работает(мозги б были реализовал на уровне компилятора я имею Ввиду).


  7. sergey2b 24 Авг 2009 5:07

    Мартовский номер Хакера уже вышел.
    Опубликуте пожалуйста статью как пользоваться вашей rtos.

    DI HALT

    По RTOS написано как минимум уже статьи четыре. Архитектура, принцип работы, пример работы. Пошарь по метке RTOS и найдешь.

Оставьте свой отзыв

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


Материалы сайта являются авторскими. Копирование и публикация материалов без активной ссылки на первоисточник запрещено.

Реклама: