TigerSHARC 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Интересно сравнить, где "красивше" будет реализация такой нехитрой задачи: прерывание вызывается раз в 1мс, после десяти прерываний необходимо вызвать функцию, после десяти вызовов функции вызвать другую функцию. с while(1), все понятно: заводим 2 глобальных счетчика и вперед щелкать инкременты в прерывании. С RTOS нешто проще как-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Интересно сравнить, где "красивше" будет реализация такой нехитрой задачи: прерывание вызывается раз в 1мс, после десяти прерываний необходимо вызвать функцию, после десяти вызовов функции вызвать другую функцию. с while(1), все понятно: заводим 2 глобальных счетчика и вперед щелкать инкременты в прерывании. С RTOS нешто проще как-то? Как вы собираетесь вызывать через 10 прерываний функцию? Если без ОСРВ то при вызове функции из прерывания вы будет находиться так же в прерывании, если не придумаете другой механизм вызова этой функции. Если с ОСРВ то будет то же самое (только вне прерывания) после 10 инкрементов в прерывании будет передано (например сообщение для вашей функции которая уже будет называться задачей и ожидать это сообщение) сообщение и если приоритет этой задачи (вашей функции) будет главным то по выходу из прерывания, планировщик переключит выполнение программы на эту функцию. Но вся эта магия приобретает интерес когда у вас будет несколько параллельных задач, например обработка АЦП в реальном времени (цифровая фильтрация), передача параметров по modbus и вывод значений на экран. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zelepuk 0 4 апреля, 2017 Опубликовано 4 апреля, 2017 (изменено) · Жалоба Как вы собираетесь вызывать через 10 прерываний функцию? Если без ОСРВ то при вызове функции из прерывания вы будет находиться так же в прерывании Зачем в прерывании вызывать функцию? обычно в прерывании дергаем флаг, а в цикле while(1) опрашиваем его. Изменено 4 апреля, 2017 пользователем Zelepuk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба Зачем в прерывании вызывать функцию? обычно в прерывании дергаем флаг, а в цикле while(1) опрашиваем его. Ну так и говорят, что "супер луп" с циклом while(1) и прерываниями будет хорошо работать только тогда, когда нет других многочисленных задач, которые также обслуживаются в основном цикле. Если других задач нет, время между взведением флага в прерывании и обработкой в главном цикле мало и почти детерминировано. Иначе это время сильно плавает и может выходить за допустимые рамки, и тогда алгоритм будет рушиться. Приоритет то у всех задач главного цикла одинаковый. А вот при наличии вытесняющей RTOS можно гибко настраивать приоритеты задач и время до обработки вашего "флага" будет более определенным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба Добавлю к словам Baser'a Зачем в прерывании вызывать функцию? обычно в прерывании дергаем флаг, а в цикле while(1) опрашиваем его. Что бы реакция МК была приближена к "мгновенной реакции", в ОСРВ это называется время реакции системы. А так можно все делать и без ОСРВ только это будет тяжелей поддерживать и координировать взаимосвязь и время работы "функций" в вашей программе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба Зачем в прерывании вызывать функцию? обычно в прерывании дергаем флаг, а в цикле while(1) опрашиваем его. Тут стоит соблюдать баланс - какие-то обработки можно и в прерывании делать, а что-то передать в основной цикл. Вопрос приоритетности подзадач обрабатывающих поступающие и отдаваемые данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба Добавлю к словам Baser'a Что бы реакция МК была приближена к "мгновенной реакции", в ОСРВ это называется время реакции системы. А так можно все делать и без ОСРВ только это будет тяжелей поддерживать и координировать взаимосвязь и время работы "функций" в вашей программе. Вы предлагаете прерывании обрабатывать данные или что? Мгновенная реакция - это конечно здорово, если нужно, например битик выставить в регистр, но FFT вы тоже считать в прерывании будете? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба Мгновенная реакция - это конечно здорово, если нужно, например битик выставить в регистр, но FFT вы тоже считать в прерывании будете? :) Да, именно в прерывании очень удобно делать FFT. Поскольку длительность всех прерываний автоматически логится SWO трассером и ведется статитстика. В системах жесткого реального времени самое важное - это профайлинг, а не RTOS, прерывания или что-то еще. А тут вы профайлинг получаете не пошевелив даже пальцем . У любого ARM-а есть туча свободных векторов прерываний и есть достаточное количество приоритетов у прерываний. Так что делать FFT в прерываниях я бы даже рекомендовал. Под RTOS типа Micrium OS такая концепция отлично ложится. Они кстати сегодня разослали предложение скачать триальную версию на 45 дней с Micrium Platform Builder. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба Мгновенная реакция - это конечно здорово, если нужно, например битик выставить в регистр, но FFT вы тоже считать в прерывании будете? :) А что вы так боитесь этого прерываний, это та же функция (ведь у вас ОС нет, которая может зависнуть в этот момент а есть голый микроконтроллер) которая будет вызываться в определенный момент, откладывая все остальные функции, а как закончится итерация вычисления FFT функция выйдет из обработчика и дальше ваши функции продолжат выполняться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Make_Pic 0 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Решил не создавать новую тему, а здесь спросить: Никогда не пользовался setjmp/longjmp для сохранения под Cortex M3,4 контекста - возможно ли сделать так же красиво, как по ссылке: setjmp/longjmp AVR Хотелось, если можно с примером кода (различие AVR/ARM). Или как в простой AVR-ской CoOS (файл в приложении) использование setjmp/longjmp: Какие компиляторы под ARM Cortex M3,4, GNU GCC, IAR... переваривают такое? COOS.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 186 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Никогда не пользовался setjmp/longjmp для сохранения под Cortex M3,4 контекста - возможно ли сделать так же красиво, как по ссылке: Сохранение/восстановление контекста делают все вытесняющие ОС. Возьмите Cortex-порт от любой и посмотрите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Make_Pic 0 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Сохранение/восстановление контекста делают все вытесняющие ОС. Возьмите Cortex-порт от любой и посмотрите. Спасибо! За смотрите туда, не знаю куда... Я конкретно спросил про использование/помощь здесь, а не рыться в исходниках Осов, тосов, ртосов. Что я уже делал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bve 1 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Из Вашего обработчика вызовите свободное прерывание с нужным приоритетом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 7 апреля, 2017 Опубликовано 7 апреля, 2017 · Жалоба Планируется разработка измерительного прибора ..... (1) Дело в том что нужно часто давать сигналы готовности данных на разных ступенях алгоритма. Использовать флаги - глобальные переменные неудобно (их будет слишком много). (2) Сообщить, какие "более красивые подходы" для этого используются. например на микрокотнтроллере можно использовать ОСРВ и ее средства взаимодействия между задачами, (3) а как быть когда нужно сделать демо-проект на PC (для последующего переноса на МК)? (4) Все это выглядит ужасно в бесконечном цикле. (1) организуйте для глобальных данных одну структуру. Если не хотите уходить от "глобализации" Работать со всеми глоб. данными можно через один указатель на нее. (2) "красиво" можно сделать и без ОС. Зависит от сложности задачи и целесообразности использования ОС. Многие ОС для МК имеют "порты" под PC/x86 (3) Проект для контроллера надо изначально писать с расчетом на "переносимость" - на уровне компиляторов для MK и PC. В PC прокт компилировать-запускать в своем "эмуляторе". (например вывод на SPI заменить на вывод в файл или консоль) (4) Если "главный цикл" в основе Вас устраиевает - посмотрите на оболочку protothread Dunkless. ОНО работает-компилируется и на MK, и на PC (проверено). По-сути это оболочка для цикла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Make_Pic 0 7 апреля, 2017 Опубликовано 7 апреля, 2017 · Жалоба Из Вашего обработчика вызовите свободное прерывание с нужным приоритетом. Вопрос об использовании setjmp/longjmp в контексте использования простой ос подобной или самой CooS, но вместо AVR для Cortex M3/4, например STM32F0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться