|
|
  |
Организация программ, дайте вектор куда копать |
|
|
|
Mar 31 2017, 07:52
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Планируется разработка измерительного прибора, принимающего данные от АЦП в прерывании, складывающего данные в буфер и обрабатывающего данные пос ложному алгоритму. Дело в том что нужно часто давать сигналы готовности данных на разных ступенях алгоритма. Использовать флаги - глобальные переменные неудобно (их будет слишком много). Сообщить, какие "более красивые подходы" для этого используются. например на микрокотнтроллере можно использовать ОСРВ и ее средства взаимодействия между задачами, а как быть когда нужно сделать демо-проект на PC (для последующего переноса на МК)?
Например есть такая задача: 1)АЦП складывает данные непрерывно в кольцевой буфер 2) Раз в миллисекунду данные из буфера обрабатываются результат сохраняется в переменную. 3) после 10й итерации по пункту 2 (т.е. раз в 10 миллисекунд) нужно делать усреднение данных
У меня сейчас в функции, которая реализует п.2 просто есть счетчик итераций в виде переменной. Я опрашиваю эту переменную, и, как только она равна 10 - запускаю функию, реализующую п.3 Все это выглядит ужасно в бесконечном цикле.
Подскажите, как сделать грамотно.
Сообщение отредактировал Zelepuk - Mar 31 2017, 08:00
|
|
|
|
|
Mar 31 2017, 08:24
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(ViKo @ Mar 31 2017, 11:19)  Я понял так, программа делает то, что от нее требуется. Кому какое дело, как она устроена? Кроме разработчика,желающего сделать красиво. Так и сделайте, как считаете. Сравните. Переделайте еще 5 раз. Нормальный процесс. Эт понятно. мне интересно как можно считать. На уме был только суперлуп...  но есть понимание что тогда прога будет изобиловать глобальными переменными. Я про подходы говорю. Интересно как можно сделать. Вот статья в тему интересная: https://habrahabr.ru/post/148805/ Я вот например хочу сделать на FreeRTOS, но как тогда удобно сделать чтобы проект запустился и на PC. На PC запускаю для демонстрационных целей.
|
|
|
|
|
Mar 31 2017, 08:52
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Zelepuk @ Mar 31 2017, 09:52)  У меня сейчас в функции, которая реализует п.2 просто есть счетчик итераций в виде переменной. Я опрашиваю эту переменную, и, как только она равна 10 - запускаю функию, реализующую п.3 Подскажите, как сделать грамотно. В ISR, который пишет данные в буфер, смотреть сколько данных накопилось в буфере, и если их больше чем сколько-то - посылать сообщение в майл-бокс. А под ОС есть задача, которая ждёт на этом мэйл-боксе, и получив сообщение, запускается, читает и обрабатывает данные из буфера, до его опустошения. Потом снова идёт на ожидание мэйл-бокса. Это классический подход к реализации задач обработки событий под ОС. И в том числе цикл обработки сообщений винды (основной рабочий цикл любой GUI-программы) так работает. И все задачи работающие с данными из периферии (или генерящие туда данные) у меня так построены.
|
|
|
|
|
Mar 31 2017, 09:09
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Zelepuk @ Mar 31 2017, 11:24)  Эт понятно. мне интересно как можно считать. На уме был только суперлуп...  но есть понимание что тогда прога будет изобиловать глобальными переменными. Я про подходы говорю. Интересно как можно сделать. Вот статья в тему интересная: https://habrahabr.ru/post/148805/ Я вот например хочу сделать на FreeRTOS, но как тогда удобно сделать чтобы проект запустился и на PC. На PC запускаю для демонстрационных целей. FreeRTOS не лучший выбор. Я бы рекомендовал Micrium OSГораздо быстрее, понятнее и компактнее чем FreeRTOS. Там кстати очень ценная фишка для риалтайма появилась - работа сервисов без запрещения прерываний. Глобальные флаги не так плохи как кажется. Когда у вас появится больше 5-и источников прерываний по 1 мс и около десятка задач, просто чтобы поддерживать все необходимые интерфейсы как вот здесь:
и когда использование процессора подойдет к 80%, то вы быстро поймете, что стоит вместо сервисов RTOS использовать глобальные флаги или иначе потеряете реальное время. Хороший способ - это критичные прерывания сделать прерываниями ядра, и чтобы они выставляли глобальные флаги и софтварно прерывания с сервисами RTOS. Это очень эффективный способ прореживания прерываний PendSV и укорачивания времени выполнения остальных прерываний. Но на PC вы это не перенесете, это все очень архитектурно привязано к железу. Риалтайм в принципе не отладить на PC.
|
|
|
|
|
Mar 31 2017, 09:23
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AlexandrY @ Mar 31 2017, 11:09)  FreeRTOS не лучший выбор. Я бы рекомендовал Micrium OSГораздо быстрее, понятнее и компактнее чем FreeRTOS. Поддерживаю! Цитата(AlexandrY @ Mar 31 2017, 11:09)  Но на PC вы это не перенесете, это все очень архитектурно привязано к железу. Риалтайм в принципе не отладить на PC. Перенести можно, если разделить на middle-ware и собственно low level IO с периферией. Сам делал и отлаживал так когда сложный драйвер. Из железа ему нужен был только IO с UART. Так что нижний уровень драйвера на МК - это был IO в/из кольцевых буферов в ISR-ах, а на PC - в те же самые буфера в/из файловых функций WinAPI + система сообщений к задаче обработке - мэйл-боксы под Микриум, и соотв. средства синхронизации под винду. Основной код драйвера - выполнялся в виде задачи обработки событий, которая была общая для Win и для Микриум. Очень удобно было отлаживать. Там 95% всего объёма составляло это middle-ware. Да собственно так же организована FatFS. Её тоже можно выполнять под любой ОС хоть под виндой. Написав простую low level IO прослойку.
|
|
|
|
|
Mar 31 2017, 09:55
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
2 ТС - какой у вас целевой процессор и ресурсы? Если они позволяют развернуться с RTOS и всем, что к ней прилагается (в самом общем смысле), то можно взять что нибудь, что работает и под РС тоже (eCos непример) и написать на ней. Получите то, что хотите - и РС для отладки и МК в качестве конечной цели. Если же с ресурсвми на МК не густо, то перенос чего либо с РС на МК дело непростое - проще сделать слой совместимости и писать поверх него (как вам тут уже советовали). Но это дополнительная работа (и может быть очень не малая  ) Есть промежуточный подход - выделить из задачи блоки, напрямую не зависищие от аппаратуры, написать их отдельными модулями и сделать для них unit тесты (для отладки) Тогда большую (или меньшую, если не повезет  ) часть можно будет отладить на РС, но собирать это все в кучу придется на МК (и run time взаимодествие между модулями тоже придется делать на МК)
|
|
|
|
|
Mar 31 2017, 10:20
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(jcxz @ Mar 31 2017, 12:23)  Перенести можно, если разделить на middle-ware и собственно low level IO с периферией. Micrium OS с самого рождения имела порт по Windows. А нынче у нее под Windows выполняется всё: файловая, сетевые стеки, GUI, USB Весь список виден в Micrium Platform Builder. Но риалтайм ( т.е. как быстро обрабатываются задачи и прерывания и как расходуются ресурсы процессора) это отладить не помогает. На PC я отлаживаю исключительно сторонние программные модули с неизвестным потреблением памяти. Все остальное не оправдано, поскольку такие IDE как IAR с SWD компилируют и загружают на целевую платформу почти с такой же скоростью как и в Visual Studio под Windows
|
|
|
|
|
Mar 31 2017, 10:28
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Lagman @ Mar 31 2017, 12:42)  Эх, была бы она бесплатная, хотя бы как раньше, купил книгу и используй как хочешь. Хотя после того как micrium был куплен Silicon Labs может и бесплатно уже распространяется? Бесплатная то она бесплатная, но мне только через 2 месяца пришел ответ типа извините мы были перегружены запросами, хотим продолжить общение. И на очередной запрос опять зависли. Цитата(jcxz @ Mar 31 2017, 13:24)  Это да, но под виндой лучше дело с логгированием и сохранением разных отладочных данных (есть файловая система для этого). И это сохранение практически не влияет на работу отлаживаемого кода. RTT через SWD логгирует с той же скоростью и также может писать в файлы. Но главное эти логи можно оставить в релизной версии. Т.е. сорсы не приходится править и захламлять условными препроцессорными директивами. Кстати вот как я тестировал FatFS на целевой платформе - https://geektimes.ru/post/274416/Ну зачем мне там нужно было бы делать это на PC?
|
|
|
|
|
Mar 31 2017, 12:12
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(jcxz @ Mar 31 2017, 11:52)  В ISR, который пишет данные в буфер, смотреть сколько данных накопилось в буфере, и если их больше чем сколько-то - посылать сообщение в майл-бокс. А под ОС есть задача, которая ждёт на этом мэйл-боксе... Вот вопрос как это делается, где почитать/посмотреть/скачать пример этого... Цитата(AlexandrY @ Mar 31 2017, 13:20)  Но риалтайм ( т.е. как быстро обрабатываются задачи и прерывания и как расходуются ресурсы процессора) это отладить не помогает. Собственно на PC не нужно отлаживать реалтайм, на PC нужно показать как все это работает. Например вместо считывания данных в прерывании считывать данные из файла. Вопрос только как именно это сделать, если на мк есть прерывание и функциа типа ISR_ADC(), то на PC(в консольном приложении) как имитировать периодический вызов функции чтения из файла?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|