Распределение ресурсов МК
Добрый день!
Хотелось бы спросить у знатоков.
Есть много данных которые необходимо считать контроллеру stm32f10x.
Все данные я считаю в прерывании, за одно прерывание МК не успевает всё просчитать(нужно целых 10), как мне поступать?
Числа с плавающей запятой не использую, правда есть кубический корень, который считается много раз, и умножение в общем много всего.
Хотелось бы спросить у знатоков.
Есть много данных которые необходимо считать контроллеру stm32f10x.
Все данные я считаю в прерывании, за одно прерывание МК не успевает всё просчитать(нужно целых 10), как мне поступать?
Числа с плавающей запятой не использую, правда есть кубический корень, который считается много раз, и умножение в общем много всего.
Если не нужен сильный рилтайм, можно данные скидывать в буфер, возводить флаг, а мэйн забирает данные и считает что нужно. Так, к примеру, работает звук в большинстве компьютерных ОС.
Да интересная идея, но данные необходимо считать как можно быстрее, желательно влезть в одно прерывание, если не получится то тогда в 2 или 3. Какие могут быть ещё варианты?
Пока время расчёта занимает 10 прерываний 250us, что очень плохо(
Конечно можно взять проц помощнее, но хотелось бы как то оптимизировать, только не знаю как.
Пока время расчёта занимает 10 прерываний 250us, что очень плохо(
Конечно можно взять проц помощнее, но хотелось бы как то оптимизировать, только не знаю как.
Последний раз редактировалось stm32 04 фев 2014, 19:10, всего редактировалось 1 раз.
Какие могут быть ещё варианты?
Отдать расчет внешнему устройству, к примеру.
Это компу отдать данные считать?
Я думал меня здесь пошлют к ПЛИСам))
Где то на в инете видел, что ПЛИС если идёт речь о расчётах вне конкуренции по сравнению с МК) Могу ошибаться т.к. с ПЛИС не знаком вообще(
Я думал меня здесь пошлют к ПЛИСам))
Где то на в инете видел, что ПЛИС если идёт речь о расчётах вне конкуренции по сравнению с МК) Могу ошибаться т.к. с ПЛИС не знаком вообще(
Можно компу, можно другому МК, можно ПЛИСине. Если важно получить жесткий рилтайм, все методы хороши.
Устройство автономное должно быть, комп сразу отпадает. Другому МК как вариант конечно и плис тоже) Также важна цена)
Попробую конечно пока оптимизировать код, посмотрим что получится.
Всем спасибо за ответы!
Попробую конечно пока оптимизировать код, посмотрим что получится.
Всем спасибо за ответы!
Остаётся только оптимизация математики - максимально упростить вычисления.
Перейти на более производительный мк, не менее логично как оптимизация математики.
Ну и от безысходности второй мк / плис. (Суперскалярная архитектура, привет!)
Перейти на более производительный мк, не менее логично как оптимизация математики.
Ну и от безысходности второй мк / плис. (Суперскалярная архитектура, привет!)
Если не секрет и можете озвучить задачу - вариантов может стать больше
Озвучить задачу к сожалению не могу.
Ещё наверняка кто то пользуется в МК при умножении и делении на 2^n битовыми сдвигами.
Когда то встречал такой способ только применительно к дробям.
Как мне данные с АЦП пересчитывать в напряжени, допустим измеряется напряжение МК на нижнем плече делителя, далее я захожу в прерывание и привожу его к нормальному умножая Данные_АЦП_12бит * K / 4095. Где K дробный коэффициент. Понятия не имею как считать здесь по другому, но я бы сделал так:
1. Можно конечно сделать таблицу где будет 4095 элементов и вообще ничего не считать, зараннее всё просчитав в экселе.
2. Можно как то битовыми сдвигами намутить дробный коэффициент К.
Только вот вариант 2 я не знаю как сделать, точнее не помню.
Есть пару мест в коде где извлекается квадратный и кубический корень.
Для быстрого извлечения квадратного корня наверное есть какие то ускоренные мат. ф-ии нашёл темку для квадратного корня ST Forum
Ещё наверняка кто то пользуется в МК при умножении и делении на 2^n битовыми сдвигами.
Когда то встречал такой способ только применительно к дробям.
Как мне данные с АЦП пересчитывать в напряжени, допустим измеряется напряжение МК на нижнем плече делителя, далее я захожу в прерывание и привожу его к нормальному умножая Данные_АЦП_12бит * K / 4095. Где K дробный коэффициент. Понятия не имею как считать здесь по другому, но я бы сделал так:
1. Можно конечно сделать таблицу где будет 4095 элементов и вообще ничего не считать, зараннее всё просчитав в экселе.
2. Можно как то битовыми сдвигами намутить дробный коэффициент К.
Только вот вариант 2 я не знаю как сделать, точнее не помню.
Есть пару мест в коде где извлекается квадратный и кубический корень.
Для быстрого извлечения квадратного корня наверное есть какие то ускоренные мат. ф-ии нашёл темку для квадратного корня ST Forum
-
- Сообщения: 88
- Откуда: Москва-Киров
Задачу озвучить все равно надо. Не раскрывай всех подробностей. Но что важно: сколько датчиков, какой samplerate нужен, т.е. как много данных в секунду с одного датчика. Если ты это выводишь на экран человеку, то больше 5-10 раз в секунду вообще не нужно, в этом смысле, в прерываниях нужно выставиь флаги, а работать с датчиками в Mainloop. Если нужны все данные, например дляизмерения спектра, то данные нужно собирать сырые, не обрабатывая их, копить и потом уже скопом обрабатывать используя оптимальные алгоритмы. Пока сложно гадать и ответ правильный и оптимальный тяжело найти. Потому как не зная задачу трудно предложить альтернативу используемым методам. Вопрос - нафига нужны данные в объеме 12bit*4kHz (я так понимаю, что это твоя реальная скорость сейчас)?
12bit * 40kHz
Ацп в стм32 быстрый успевает за 1/4 периода обмерить что нужно если не меньше, всё это нужно для быстродействия системы, если что то пойдёт не так чтобы можно было вовремя всё запретить и все ключи закрыть.
Данные никому не выводятся и не планируется.
Просто АЦП считывает напряжение и по определённым формулам рассчитывает скважности, формулы правда огроменные.
Ацп в стм32 быстрый успевает за 1/4 периода обмерить что нужно если не меньше, всё это нужно для быстродействия системы, если что то пойдёт не так чтобы можно было вовремя всё запретить и все ключи закрыть.
Данные никому не выводятся и не планируется.
Просто АЦП считывает напряжение и по определённым формулам рассчитывает скважности, формулы правда огроменные.
Последний раз редактировалось stm32 06 фев 2014, 13:25, всего редактировалось 2 раза.
А нельзя от обратного пойти? Постчитать порог безопасного уровня и просто сравнивать?
Можно. Я правильно понимаю вы про то чтобы не считать Данные_АЦП_12бит * K / 4095, а привести порог к АЦП. Можно да, но дальше значение Данные_АЦП_12бит * K / 4095 используется при расчётах, и есть места где оказывается под кубическим корнем в квадрате.
Ну а К что такое? Оноже не каждый раз новое, только при его изменении пересчитывать K/4096. Уже меньше времени занято.
Удалось сократить до 175us.
Однако не избавился от корней что очен плохо.
Смотрел в файле math.h там ф-ии извлечения корней только для флоат и дабл типов и имеют существенное отличие по времени друг от друга, а я везде использую целочисленные значения. Может кто то испльзовал альтернативные ф-ии чтобы извлекать строго инты, наверняка они будут раза в 2 быстрей, если не в 3.
Однако не избавился от корней что очен плохо.
Смотрел в файле math.h там ф-ии извлечения корней только для флоат и дабл типов и имеют существенное отличие по времени друг от друга, а я везде использую целочисленные значения. Может кто то испльзовал альтернативные ф-ии чтобы извлекать строго инты, наверняка они будут раза в 2 быстрей, если не в 3.
Стоит углубиться в математику, и, в особенности, в CORDIC
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
Ну и дальше можно еще просмотреть в похожих темах на СО, но этих должно хватить, имхо
-
- Сообщения: 88
- Откуда: Москва-Киров
Так, все равно не понятно, из всего что написано понял следующее
1. Данные АЦП служат для высчитывания неких крайних условий, по которым необходимо запарковать всю систему. Нельзя ли свести задачу к обратной, как это предлагалось ранее. Заранее высчитать какие пороговые значения должны быть у АЦП, при выходе за пределы - парковать систему. Не надо вычислять никаких корней, просто преобразовать ваши пороговые значения к константам АЦП и определить пороги срабатывания для всех каналов.
2. Какая должна быть реакция на события? Сколько времени занимает парковка системы? Время реакции, как я понял у вас составляет 170мкс, Его можно смело увеличивать до времени парковки системы. Поскольку быстрее вы все равно не запаркуетесь, а значит необходимости получать раньше на 100 мкс сигнал на парковку не имеет смысла. Время парковки системы подразумевает ввод-вывод токов, замыкание размыкание ключей и оно будет зависеть от конкретной схемы. Непонятно. В реальноссти поток данных в 500кбит/сек для того чтобы вовремя запарковать систему - это очень жирно.
1. Данные АЦП служат для высчитывания неких крайних условий, по которым необходимо запарковать всю систему. Нельзя ли свести задачу к обратной, как это предлагалось ранее. Заранее высчитать какие пороговые значения должны быть у АЦП, при выходе за пределы - парковать систему. Не надо вычислять никаких корней, просто преобразовать ваши пороговые значения к константам АЦП и определить пороги срабатывания для всех каналов.
2. Какая должна быть реакция на события? Сколько времени занимает парковка системы? Время реакции, как я понял у вас составляет 170мкс, Его можно смело увеличивать до времени парковки системы. Поскольку быстрее вы все равно не запаркуетесь, а значит необходимости получать раньше на 100 мкс сигнал на парковку не имеет смысла. Время парковки системы подразумевает ввод-вывод токов, замыкание размыкание ключей и оно будет зависеть от конкретной схемы. Непонятно. В реальноссти поток данных в 500кбит/сек для того чтобы вовремя запарковать систему - это очень жирно.
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);
}
{
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);
}
"Корни" - заготовить табличку готовую, нэ, не годится?
Вернуться в «Микроконтроллеры и ПЛИС»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 19 гостей