реклама на сайте
подробности

 
 
> Работа с медленной периферией
Arlleex
сообщение Dec 28 2017, 17:52
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Использую микроконтроллер на процессорном ядре Cortex-M4F - STM32F429.
Программа построена на основе ОСРВ FreeRTOS.
Есть 5 независимых задач, внутри которых обрабатываются некоторые массивы данных.
Есть аппаратные прерывания от таймеров с жесткой временной диаграммой, нарушать которую нельзя: через равные отрезки времени считываются данные с полутора десятков внешних АЦП по SPI, при этом сами таймеры формируют управление CS этих АЦП, а также сам цикл чтения из SPI данных. По завершению сканирования (около 200 выборок) выдается семафор в приоритетную задачу FreeRTOS о готовности результата.
Одна из задач отвечает за опрос датчиков температуры DS18B20, подключенной к обычной линии GPIO (не к UART-у), т.е. вся организация протокола 1-Wire программная. Я решил, что настраивать прерывания для временных параметров таймслотов слишком накладно и непроизводительно, поэтому сделал опрос флагов совпадения таймера и рулил ножкой GPIO в низкоприоритетной задаче RTOS. Однако логично было предположить (а позже и убедиться на отладочной плате), что высокоприоритетные задачи могут перебить эту задачу, например, в момент таймслота чтения, и целостность временного отрезка таймслота будет нарушена - считаются неправильные данные.
Поместил обращения с датчиком в критическую секцию, но сам понимаю что это так себе выход - времянка более приоритетных прерываний таймера для АЦП куда важнее, поэтому никаких критических секций быть не должно. И тут я задумался: а как вообще в таких ситуациях поступать? То есть как обслуживать низкоскоростной интерфейс, временную диаграмму которого нельзя перебивать для корректной работы, в то же время не повышая приоритет задачи, в которой работает опрос датчиков, и тем более, не вводя критические секции? Ведь как бы получается самоблокирующие критерии расстановки приоритетов задач...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Forger
сообщение Dec 28 2017, 18:17
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Arlleex @ Dec 28 2017, 20:52) *
То есть как обслуживать низкоскоростной интерфейс, временную диаграмму которого нельзя перебивать для корректной работы, в то же время не повышая приоритет задачи, в которой работает опрос датчиков, и тем более, не вводя критические секции?

Если не переписывать сильно код, то как вариант: снять статистику всех происходящих событий (например, бесплатная SystemView от Segger) и оптимизировать код под эти данные.
Другой вариант: для медленных программных интерфейсов использовать аппаратные таймеры, благо в таких толстых камнях таймеров выше крыши.
Ну и классический совет для любой системы - убирать из обработчиков прерываний длительные расчеты и действия, вынося их в фон задач, "пробуждая" их соотв. сервисами ОС.
Нельзя забывать про DMA, которая, например, отлично подходит для опроса кучи каналов АЦП.
Т.е. в сильно перегруженной системе нужно переносить программные дела в аппаратные по максимуму.

Цитата(Arlleex @ Dec 28 2017, 20:52) *
через равные отрезки времени считываются данные с полутора десятков внешних АЦП по SPI, при этом сами таймеры формируют управление CS этих АЦП, а также сам цикл чтения из SPI данных.

В данном случае скорее всего подключать схемотехников для переделки платы. Я бы ставил отдельный дешевый контроллер, который бы делал подобную "тупую" работу.
Как вариант, возможно, стоило сразу ставить двухядерный Cortex, например от NXP.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Dec 28 2017, 20:26
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата
Другой вариант: для медленных программных интерфейсов использовать аппаратные таймеры, благо в таких толстых камнях таймеров выше крыши.

Один аппаратный таймер задействован как раз для формирования временной диаграммы опроса АЦП. В обработчиках прерываний по совпадению и переполнению построена логика небольшого конечного автомата, который:
1) опускает линии CS необходимых АЦП;
2) выжидает минимальное допустимое время между активизацией CS и первым импульсом синхронизации SCK;
3) отправляет посылку по SPI в АЦП (при этом предполагая, что посылка точно отправится за конечное время);
4) читает данные в буфер;
5) выжидает минимальное допустимое время между последним синхроимпульсом SCK и деактивацией CS АЦП;
6) выдает семафор в приоритетную задачу о том, что можно производить расчет на текущем шаге (заложено математикой процесса).

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

Таким же образом хотел сделать конечный автомат обслуживания таймслотов 1-Wire на прерываниях аппаратного таймера: но тут есть но - можно прикинуть накладные расходы по времени входа в прерывание по отношению к полезному времени:
- частота работы МК - 180МГц; значит на вход/выход в/из прерывания будет составлять 0,133(3)мкс (24 такта);
- для DS18B20 характерны времена, кратные 1мкс, поэтому в худшем случае получаем 1/0,133(3) = 7,5 полезных команд в теле обработчика прерывания.
Короче говоря, не густо, микросекундные прерывания в топку сразу (хотя это тоже понятно на самом деле, микросекундные прерывания это верх кощунства по отношению к МК).

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

Сообщение отредактировал Arlleex - Dec 28 2017, 20:32
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Arlleex   Работа с медленной периферией   Dec 28 2017, 17:52
|- - Forger   Цитата(Arlleex @ Dec 28 2017, 23:26) - дл...   Dec 28 2017, 20:53
- - ViKo   Очевидно, времени, чтобы прочитать все данные с вн...   Dec 28 2017, 19:12
- - SasaVitebsk   По АЦП в принципе согласен. У меня примерно та же ...   Dec 28 2017, 19:23
- - kolobok0   Цитата(Arlleex @ Dec 28 2017, 20:52) ..за...   Dec 28 2017, 21:06
- - scifi   1-wire удобно делается на уарте, там нет всей этой...   Dec 29 2017, 07:01
|- - kolobok0   Цитата(scifi @ Dec 29 2017, 10:01) 1-wire...   Dec 29 2017, 07:36
|- - AlexandrY   Цитата(kolobok0 @ Dec 29 2017, 09:36) ......   Dec 29 2017, 07:50
||- - kolobok0   Цитата(AlexandrY @ Dec 29 2017, 10:50) .....   Dec 29 2017, 07:53
||- - AlexandrY   Цитата(kolobok0 @ Dec 29 2017, 09:53) в п...   Dec 29 2017, 08:10
||- - kolobok0   Цитата(AlexandrY @ Dec 29 2017, 11:10) Я ...   Dec 29 2017, 08:26
||- - scifi   Цитата(kolobok0 @ Dec 29 2017, 11:26) ну ...   Dec 29 2017, 08:37
|- - scifi   Цитата(kolobok0 @ Dec 29 2017, 10:36) есл...   Dec 29 2017, 08:12
|- - amiller   Цитата(kolobok0 @ Dec 29 2017, 10:36) есл...   Dec 29 2017, 08:53
||- - kolobok0   Цитата(amiller @ Dec 29 2017, 11:53) Пред...   Dec 29 2017, 09:19
||- - Сергей Борщ   QUOTE (kolobok0 @ Dec 29 2017, 11:19) есл...   Dec 29 2017, 09:52
||- - kolobok0   Цитата(Сергей Борщ @ Dec 29 2017, 12:52) ...   Dec 29 2017, 10:07
||- - jcxz   Цитата(Сергей Борщ @ Dec 29 2017, 11:52) ...   Dec 29 2017, 11:22
||- - aaarrr   Цитата(jcxz @ Dec 29 2017, 14:09) В чём з...   Dec 29 2017, 11:24
||- - jcxz   Цитата(aaarrr @ Dec 29 2017, 13:24) А на ...   Dec 29 2017, 11:36
||- - HHIMERA   Цитата(jcxz @ Dec 29 2017, 15:36) Для пер...   Dec 29 2017, 22:42
|- - Сергей Борщ   QUOTE (kolobok0 @ Dec 29 2017, 09:36) есл...   Dec 29 2017, 09:00
|- - jcxz   Цитата(Сергей Борщ @ Dec 29 2017, 11:00) ...   Dec 29 2017, 10:56
|- - kolobok0   Цитата(jcxz @ Dec 29 2017, 13:49) Насколь...   Dec 29 2017, 11:01
- - jcxz   Цитата(Arlleex @ Dec 28 2017, 19:52) То е...   Dec 29 2017, 10:42
|- - aaarrr   Цитата(jcxz @ Dec 29 2017, 13:40) Работу ...   Dec 29 2017, 10:43
||- - mantech   Цитата(aaarrr @ Dec 29 2017, 13:43) То ес...   Dec 29 2017, 13:37
||- - aaarrr   Цитата(mantech @ Dec 29 2017, 16:37) ...х...   Dec 29 2017, 13:42
|- - kolobok0   Цитата(jcxz @ Dec 29 2017, 13:42) Работу ...   Dec 29 2017, 10:45
- - Arlleex   Forger, ЦитатаЗачем дергать прерывания раз в 1мкс?...   Dec 29 2017, 23:10
|- - Forger   Цитата(Arlleex @ Dec 30 2017, 02:10) Если...   Dec 30 2017, 08:05
|- - kolobok0   Цитата(Arlleex @ Dec 30 2017, 02:10) ...н...   Dec 30 2017, 13:19
|- - HHIMERA   Цитата(kolobok0 @ Dec 30 2017, 16:19) все...   Dec 30 2017, 14:25
|- - kolobok0   Цитата(HHIMERA @ Dec 30 2017, 17:25) Это ...   Dec 30 2017, 14:58
|- - Сергей Борщ   QUOTE (kolobok0 @ Dec 30 2017, 16:58) я с...   Dec 30 2017, 20:25
|- - HHIMERA   Цитата(Сергей Борщ @ Dec 30 2017, 23:25) ...   Dec 30 2017, 20:50
|- - Rst7   QUOTE (Сергей Борщ @ Dec 30 2017, 22:25) ...   Jan 1 2018, 21:16
|- - Forger   ЦитатаCPU load просто смешной.Кстати, а как вы его...   Jan 1 2018, 21:30
|- - Rst7   QUOTE (Forger @ Jan 1 2018, 23:30) Кстати...   Jan 1 2018, 22:11
|- - Forger   Цитата(Rst7 @ Jan 2 2018, 01:11) Да есть ...   Jan 1 2018, 23:23
|- - Rst7   QUOTE (Forger @ Jan 2 2018, 01:23) Лишь х...   Jan 2 2018, 00:05
|- - Forger   Цитата(Rst7 @ Jan 2 2018, 03:05) Я достат...   Jan 2 2018, 00:25
- - Arlleex   Сергей Борщ, Цитата...одновременный прием четырех ...   Dec 30 2017, 21:14
|- - Сергей Борщ   QUOTE (Arlleex @ Dec 30 2017, 23:14) Серг...   Dec 30 2017, 21:38
|- - jcxz   Цитата(Arlleex @ Dec 30 2017, 23:14) Прер...   Dec 31 2017, 14:40
- - Alechek   Почему для 1820 упоминается только ногодрыг/таймер...   Jan 10 2018, 09:49
- - mantech   Цитата(Alechek @ Jan 10 2018, 12:49) Поче...   Jan 10 2018, 13:56


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 09:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016