Распределение ресурсов МК

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 04 фев 2014, 12:49

Добрый день!
Хотелось бы спросить у знатоков.
Есть много данных которые необходимо считать контроллеру stm32f10x.
Все данные я считаю в прерывании, за одно прерывание МК не успевает всё просчитать(нужно целых 10), как мне поступать?
Числа с плавающей запятой не использую, правда есть кубический корень, который считается много раз, и умножение в общем много всего.

Keroronsk
Сообщения: 21

Сообщение Keroronsk » 04 фев 2014, 13:53

В прерывании ставить флаг, обрабатывать всё в main-е?

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 04 фев 2014, 16:23

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

Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 04 фев 2014, 19:03

Да интересная идея, но данные необходимо считать как можно быстрее, желательно влезть в одно прерывание, если не получится то тогда в 2 или 3. Какие могут быть ещё варианты?
Пока время расчёта занимает 10 прерываний 250us, что очень плохо(
Конечно можно взять проц помощнее, но хотелось бы как то оптимизировать, только не знаю как.
Последний раз редактировалось stm32 04 фев 2014, 19:10, всего редактировалось 1 раз.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 04 фев 2014, 19:10

Какие могут быть ещё варианты?

Отдать расчет внешнему устройству, к примеру.

Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 04 фев 2014, 19:12

Это компу отдать данные считать?
Я думал меня здесь пошлют к ПЛИСам))
Где то на в инете видел, что ПЛИС если идёт речь о расчётах вне конкуренции по сравнению с МК) Могу ошибаться т.к. с ПЛИС не знаком вообще(

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 04 фев 2014, 19:17

Можно компу, можно другому МК, можно ПЛИСине. Если важно получить жесткий рилтайм, все методы хороши.

Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 04 фев 2014, 19:24

Устройство автономное должно быть, комп сразу отпадает. Другому МК как вариант конечно и плис тоже) Также важна цена)
Попробую конечно пока оптимизировать код, посмотрим что получится.
Всем спасибо за ответы!

Qic
Сообщения: 985

Сообщение Qic » 05 фев 2014, 00:12

Остаётся только оптимизация математики - максимально упростить вычисления.
Перейти на более производительный мк, не менее логично как оптимизация математики.
Ну и от безысходности второй мк / плис. (Суперскалярная архитектура, привет!)

Аватара пользователя
N1X
Сообщения: 321
Откуда: Беларусь, Гомель

Сообщение N1X » 05 фев 2014, 13:55

Если не секрет и можете озвучить задачу - вариантов может стать больше ;)

Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 05 фев 2014, 17:53

Озвучить задачу к сожалению не могу.
Ещё наверняка кто то пользуется в МК при умножении и делении на 2^n битовыми сдвигами.
Когда то встречал такой способ только применительно к дробям.
Как мне данные с АЦП пересчитывать в напряжени, допустим измеряется напряжение МК на нижнем плече делителя, далее я захожу в прерывание и привожу его к нормальному умножая Данные_АЦП_12бит * K / 4095. Где K дробный коэффициент. Понятия не имею как считать здесь по другому, но я бы сделал так:
1. Можно конечно сделать таблицу где будет 4095 элементов и вообще ничего не считать, зараннее всё просчитав в экселе.
2. Можно как то битовыми сдвигами намутить дробный коэффициент К.
Только вот вариант 2 я не знаю как сделать, точнее не помню.
Есть пару мест в коде где извлекается квадратный и кубический корень.
Для быстрого извлечения квадратного корня наверное есть какие то ускоренные мат. ф-ии нашёл темку для квадратного корня ST Forum

Proletariat
Сообщения: 88
Откуда: Москва-Киров

Сообщение Proletariat » 05 фев 2014, 21:42

Задачу озвучить все равно надо. Не раскрывай всех подробностей. Но что важно: сколько датчиков, какой samplerate нужен, т.е. как много данных в секунду с одного датчика. Если ты это выводишь на экран человеку, то больше 5-10 раз в секунду вообще не нужно, в этом смысле, в прерываниях нужно выставиь флаги, а работать с датчиками в Mainloop. Если нужны все данные, например дляизмерения спектра, то данные нужно собирать сырые, не обрабатывая их, копить и потом уже скопом обрабатывать используя оптимальные алгоритмы. Пока сложно гадать и ответ правильный и оптимальный тяжело найти. Потому как не зная задачу трудно предложить альтернативу используемым методам. Вопрос - нафига нужны данные в объеме 12bit*4kHz (я так понимаю, что это твоя реальная скорость сейчас)?

Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 05 фев 2014, 23:44

12bit * 40kHz
Ацп в стм32 быстрый успевает за 1/4 периода обмерить что нужно если не меньше, всё это нужно для быстродействия системы, если что то пойдёт не так чтобы можно было вовремя всё запретить и все ключи закрыть.
Данные никому не выводятся и не планируется.
Просто АЦП считывает напряжение и по определённым формулам рассчитывает скважности, формулы правда огроменные.
Последний раз редактировалось stm32 06 фев 2014, 13:25, всего редактировалось 2 раза.

Аватара пользователя
N1X
Сообщения: 321
Откуда: Беларусь, Гомель

Сообщение N1X » 06 фев 2014, 11:24

А нельзя от обратного пойти? Постчитать порог безопасного уровня и просто сравнивать?

Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 06 фев 2014, 13:27

Можно. Я правильно понимаю вы про то чтобы не считать Данные_АЦП_12бит * K / 4095, а привести порог к АЦП. Можно да, но дальше значение Данные_АЦП_12бит * K / 4095 используется при расчётах, и есть места где оказывается под кубическим корнем в квадрате.

Qic
Сообщения: 985

Сообщение Qic » 06 фев 2014, 13:37

Ну а К что такое? Оноже не каждый раз новое, только при его изменении пересчитывать K/4096. Уже меньше времени занято.

Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 06 фев 2014, 14:48

В К уже учтено 1/4096.

Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 06 фев 2014, 19:19

Удалось сократить до 175us.
Однако не избавился от корней что очен плохо.
Смотрел в файле math.h там ф-ии извлечения корней только для флоат и дабл типов и имеют существенное отличие по времени друг от друга, а я везде использую целочисленные значения. Может кто то испльзовал альтернативные ф-ии чтобы извлекать строго инты, наверняка они будут раза в 2 быстрей, если не в 3.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 06 фев 2014, 19:23

Стоит углубиться в математику, и, в особенности, в CORDIC

gylka
Сообщения: 14
Откуда: Киев

Сообщение gylka » 06 фев 2014, 20:26

stm32 писал(а):Смотрел в файле math.h там ф-ии извлечения корней только для флоат и дабл типов и имеют существенное отличие по времени друг от друга, а я везде использую целочисленные значения. Может кто то испльзовал альтернативные ф-ии чтобы извлекать строго инты, наверняка они будут раза в 2 быстрей, если не в 3.

То есть чтобы даже в вычислениях были только целые?
Я конечно понимаю что тупо слать нагугленное, так как наверное автор сам искал, но вряд ли найдется больше инфы чем на СО (тему оптимальных корней поднимали в инете миллион раз :) )
http://stackoverflow.com/questions/1100 ... arm-thumb2
http://stackoverflow.com/questions/4930 ... t-of-sqrtn
http://www.finesse.demon.co.uk/steven/sqrt.html

Ну и дальше можно еще просмотреть в похожих темах на СО, но этих должно хватить, имхо

Аватара пользователя
stm32
Сообщения: 101

Сообщение stm32 » 06 фев 2014, 20:36

Спасибо за ссылки, буду смотреть.

Proletariat
Сообщения: 88
Откуда: Москва-Киров

Сообщение Proletariat » 06 фев 2014, 21:43

Так, все равно не понятно, из всего что написано понял следующее
1. Данные АЦП служат для высчитывания неких крайних условий, по которым необходимо запарковать всю систему. Нельзя ли свести задачу к обратной, как это предлагалось ранее. Заранее высчитать какие пороговые значения должны быть у АЦП, при выходе за пределы - парковать систему. Не надо вычислять никаких корней, просто преобразовать ваши пороговые значения к константам АЦП и определить пороги срабатывания для всех каналов.
2. Какая должна быть реакция на события? Сколько времени занимает парковка системы? Время реакции, как я понял у вас составляет 170мкс, Его можно смело увеличивать до времени парковки системы. Поскольку быстрее вы все равно не запаркуетесь, а значит необходимости получать раньше на 100 мкс сигнал на парковку не имеет смысла. Время парковки системы подразумевает ввод-вывод токов, замыкание размыкание ключей и оно будет зависеть от конкретной схемы. Непонятно. В реальноссти поток данных в 500кбит/сек для того чтобы вовремя запарковать систему - это очень жирно.

golf2109
Сообщения: 1

Сообщение golf2109 » 14 фев 2015, 12:38

int16_t cordic2 (int32_t from)
{
register uint32_t mask=0x40000000;
register uint32_t sqr=0;
do {
register int32_t temp = sqr | mask;
sqr >>= 1;
if (temp <= from){
sqr |= mask;
from -= temp;
};
} while (mask >>= 2);
if (sqr < from) sqr++;
return ((uint16_t)sqr);
}

Аватара пользователя
piroJ0KE
Сообщения: 130
Откуда: Киёв

Сообщение piroJ0KE » 24 фев 2015, 18:47

"Корни" - заготовить табличку готовую, нэ, не годится?

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей