Перейти к содержанию
    

Многозадачность на AVR

Возможно ли как-то реализовать в AVRах переключение с одного потока команд на другие, которые выполняются "параллельно"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вполне возможно. Есть два, пути:

 

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

 

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

1. аналогично механизму WaitFor()/Sleep() в Windows.

2. короткие функции заведомо быстро выполняющиеся (с последовательным вызовом в основном цикле программы).

3. через простенький планировщик (который выполняется в контексте основного потока) и будет запускать периодические задачи через заданный интервал времени. Задачи не должны быть бесконечными, при завершении действия обязательно должны возвращать управление планировщику (механизми icall - ret).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или возьмите готовую scmRTOS от нашего уважаемого dxp и не мучайтесь долго.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или возьмите готовую scmRTOS от нашего уважаемого dxp и не мучайтесь долго.

Это для принудительного переключения задач (красиво, но ресурсоемко).

 

Как альтернатива, jacos - при определенном внимании к программированию задач позволяет очень эффективно реализовать псевдопараллельное исполнение независимых задач и обмен данными между ними. Сам в свое время попробовал - очень понравилось. Очень подробное описание (на русском языке) с множеством примеров. Хороша именно отличной оптимизацией под ряд контроллеров (в т.ч. AVR, PIC, MSP430).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вариант - построение кода на основе конечных автоматов. Может не так удобно как оси, но зато меньше ресурсов надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как альтернатива, jacos - при определенном внимании к программированию задач позволяет очень эффективно реализовать псевдопараллельное исполнение независимых задач и обмен данными между ними. Сам в свое время попробовал - очень понравилось. Очень подробное описание (на русском языке) с множеством примеров. Хороша именно отличной оптимизацией под ряд контроллеров (в т.ч. AVR, PIC, MSP430).

Спасибо за ссылку, очень хорошая штука, примеры хорошие - разобрался в первый же час, ресурсов мало (вроде) кушает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как альтернатива, jacos - при определенном внимании к программированию задач позволяет очень эффективно реализовать псевдопараллельное исполнение независимых задач и обмен данными между ними. Сам в свое время попробовал - очень понравилось. Очень подробное описание (на русском языке) с множеством примеров. Хороша именно отличной оптимизацией под ряд контроллеров (в т.ч. AVR, PIC, MSP430).

Спасибо за ссылку, очень хорошая штука, примеры хорошие - разобрался в первый же час, ресурсов мало (вроде) кушает.

Если есть вермя и желание, не расскажете ли подробнее обо всем?) Примеры задач, запущенных под осью; траблы с программированием, сборкой проекта и прочее? Я думаю многим было бы интересно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ссылку, очень хорошая штука, примеры хорошие - разобрался в первый же час, ресурсов мало (вроде) кушает.

Если есть вермя и желание, не расскажете ли подробнее обо всем?) Примеры задач, запущенных под осью; траблы с программированием, сборкой проекта и прочее? Я думаю многим было бы интересно.

В принципе тут всё подробно расписано: http://jacos.narod.ru/load/jacos_v1070.zip

Тут и очень хорошее подробное описание, и примеры прилагаются. А для сборки проекта потреюутся библиотеки (под IAR): http://jacos.narod.ru/load/libr_v1070_avr_iar.zip

Тут куча библиотек, но для проекта потребуется только одна, а как выбрать нужную библиотеку расписано в справке в разделе "библиотеки".

А из траблов программирования, то например что первое попалось на глаза это если компилировать с поддержкой функций-сервисов ОС в обработчиках прерываний, то программа почему-то вешается сразу. Также если разрешать работу USARTа и его прерывания в данном потоке, то в нём почему-то невозможно использовать функции OS_Stop_Task и OS_Delay, только OS_Cooperate работает, иначе программа вешается...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Напомню, что для поддержки сервисов в прерываниях нужно:

- использовать соответствующую версию библиотеки (с буквой i);

- разрешить нужные сервисы в явном виде в файле конфигурации;

- использовать в прерываниях версии сервисов, для того предназначенных (с окончанием на I).

 

Иначе будет что угодно, в том числе, и зависы.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Напомню, что для поддержки сервисов в прерываниях нужно:

- использовать соответствующую версию библиотеки (с буквой i);

- разрешить нужные сервисы в явном виде в файле конфигурации;

- использовать в прерываниях версии сервисов, для того предназначенных (с окончанием на I).

Иначе будет что угодно, в том числе, и зависы.

Этого я не учел, потому и зависало... Надо переустановить ruki.sys

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел внизу страницы ссылку http://www.pumpkininc.com/

Просмотрел описание предлагаемой там ОС и нашел разительное сходство с jacOS. Только стоит там она $750-1250, а jacOS бесплатно. Отсюда вопрос - кто с кого слизал? :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...