Есть. Они и в 24-ых есть. Только я их как-то "проехал" - сразу выбрал 32-ые.
Вопросы по С/С++ (СИ)
[uquote="dosikus",url="/forum/viewtopic.php?p=3257066#p3257066"]В юзаемых тобой 32пЫк есть же DMA?[/uquote]
Есть. Они и в 24-ых есть. Только я их как-то "проехал" - сразу выбрал 32-ые.
Есть. Они и в 24-ых есть. Только я их как-то "проехал" - сразу выбрал 32-ые.
- Реклама
- Сообщения: 208
- Зарегистрирован: Вс дек 10, 2006 19:26:13
Ну разобрался я в том коде, вывожу на 7-сегм.,что хочу, но.. Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть! Обслуживание индикатора и кнопок только полпамяти занимает, я остальное своё добавил.тем более с библиотекой math.h- всё- памяти не хватает, придется отдирать 7-сегм. оттуда и убирать библу ос.
"ltkrn.h" и в майне несколько бесконечных циклов-это же ось-как я понимаю? Как у вас там у си-шников-несколько нитей чтоли..
"ltkrn.h" и в майне несколько бесконечных циклов-это же ось-как я понимаю? Как у вас там у си-шников-несколько нитей чтоли..
[uquote="dm211",url="/forum/viewtopic.php?p=3257979#p3257979"]Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть![/uquote]
а что, собственно, такого? Предположу, что автору памяти вполне хватало)
а что, собственно, такого? Предположу, что автору памяти вполне хватало)
- Сообщения: 208
- Зарегистрирован: Вс дек 10, 2006 19:26:13
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3258044#p3258044"][uquote="dm211",url="/forum/viewtopic.php?p=3257979#p3257979"]Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть![/uquote]
а что, собственно, такого? Предположу, что автору памяти вполне хватало)[/uquote]
Ничего. просто встретил впервые ОС в МК. Автор конечно опытный и написал как знает для готовой платы своё.
а что, собственно, такого? Предположу, что автору памяти вполне хватало)[/uquote]
Ничего. просто встретил впервые ОС в МК. Автор конечно опытный и написал как знает для готовой платы своё.
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
Добрый день, подскажите пожалуйста как сделать, чтобы компилятор не ругался
warning: #188-D: enumerated type mixed with another type
Подразумеваю приведение типа или типо того)))
warning: #188-D: enumerated type mixed with another type
Подразумеваю приведение типа или типо того)))
- Реклама
телепатирую: вы где-то присваиваете переменной с типом enum значение какого-то из int-ов, или наоборот.
Здравствуйте.
Нужно циклически сдвинуть массив типа int16_t вправо, как думаете какая из реализаций будет работать быстрее:
или
P.S. контроллер STM32 компилятор GCC, на AVR под GCC тоже интересно.
Нужно циклически сдвинуть массив типа int16_t вправо, как думаете какая из реализаций будет работать быстрее:
Код: Выделить всё
void reverse_arr(int16_t *arr, uint16_t size) { // развернуть массив
uint16_t i;
int16_t temp;
for (i = 0; i < size / 2; i++) {
temp = arr[i];
arr[i] = arr[size - 1 - i];
arr[size - 1 - i] = temp;
}
}
void shift_arr(int16_t *arr, uint16_t shift, uint16_t size) { // циклически сдвинуть массив размером size на shift элементов
reverse_arr(&arr[size - shift], shift);
reverse_arr(arr, size - shift);
reverse_arr(arr, size);
}
Код: Выделить всё
void shift_arr(int16_t *arr, uint16_t shift, uint16_t size) { // циклически сдвинуть массив размером size на shift элементов
int16_t buf[100];
memcpy(buf, &arr[size - shift], shift * 2); // копируем последние елементы в буфер
memmove(&arr[shift], arr, (size - shift) * 2); // сдвигаем
memcpy(arr, buf, shift * 2); // копируем из буфера в начало
}
«И всё-таки она вертится!»
по идее memcpy для 32-битной платформы должна активно использовать именно 32-битные пересылки, поэтому должна выигрывать у 16-битного копирования... хотя кто знает, сделано это в arm-libc или нет... да и я не в курсе, есть ли разница у ARM-ов...Apparatchik писал(а):контроллер STM32 компилятор GCC
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3265434#p3265434"]телепатирую: вы где-то присваиваете переменной с типом enum значение какого-то из int-ов, или наоборот.[/uquote]
Для чего вы вангуете?
Там это явно написано, меня интересует как убрать warning. Как дать понять компилятору, что делаю это осознано.
Для чего вы вангуете?
Там это явно написано, меня интересует как убрать warning. Как дать понять компилятору, что делаю это осознано.
ну первый очевидный и правильный вариант - не делать так) если все-таки это нужно, то можно явно привести типы в нужных местах.
- Сообщения: 1750
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="baghear",url="/forum/viewtopic.php?p=3265557#p3265557"][uquote="arkhnchul",url="/forum/viewtopic.php?p=3265434#p3265434"]телепатирую: вы где-то присваиваете переменной с типом enum значение какого-то из int-ов, или наоборот.[/uquote]
Там это явно написано, меня интересует как убрать warning. Как дать понять компилятору, что делаю это осознано.[/uquote]
Естественно - явно привести типы. А вы чего ожидали?
Там это явно написано, меня интересует как убрать warning. Как дать понять компилятору, что делаю это осознано.[/uquote]
Естественно - явно привести типы. А вы чего ожидали?
[uquote="Apparatchik",url="/forum/viewtopic.php?p=3265438#p3265438"]Нужно циклически сдвинуть массив типа int16_t вправо, как думаете какая из[/uquote]
Стесняюсь спросить, а зачем нужно двигать массив? Вообще то принято двигать указателями....
Стесняюсь спросить, а зачем нужно двигать массив? Вообще то принято двигать указателями....
[uquote="КРАМ",url="/forum/viewtopic.php?p=3265666#p3265666"]Стесняюсь спросить, а зачем нужно двигать массив? Вообще то принято двигать указателями....[/uquote]
В конкретном случае нужно скомпенсировать отставние тока от напряжения при измерении трансформатором тока. Тоесть имеется выборка АЦП измерений за период и нужно её сдвинуть циклически на некоторое значение как можно быстрее, даже в ущерб памяти, главное скорость (ассемблер не предлагать). Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
В конкретном случае нужно скомпенсировать отставние тока от напряжения при измерении трансформатором тока. Тоесть имеется выборка АЦП измерений за период и нужно её сдвинуть циклически на некоторое значение как можно быстрее, даже в ущерб памяти, главное скорость (ассемблер не предлагать). Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
«И всё-таки она вертится!»
непонятно, зачем сами значения туда-сюда перекладывать. Организуйте кольцевую структуру и двигайте указатель на условное начало
[uquote="Apparatchik",url="/forum/viewtopic.php?p=3265744#p3265744"]В конкретном случае нужно скомпенсировать отставние тока от напряжения при измерении трансформатором тока.[/uquote]
Вам выше подтвердили мою сентенцию на этот счет.
Однако, а зачем вообще Вам нужно это фазирование тока и напряжения? Что Вы собираетесь посчитать?
У меня опять смутные подозрения на Ваш счет...
Вам выше подтвердили мою сентенцию на этот счет.
Однако, а зачем вообще Вам нужно это фазирование тока и напряжения? Что Вы собираетесь посчитать?
У меня опять смутные подозрения на Ваш счет...
АЦП складывает выборку в массив за период, пока складывает надо обработать предыдущую. При активной нагрузке ток немного сдвинут относительно напряжения (а не должен) из-за измерительного трансформатора, это видно как на графике так и при вычислении коофициента мощности (PF). Для компенсации индуктивности трансформатора нужно ток сдвинуть относительно напряжения. В общем зачем эти подробности? Я же сказал что уже работает и просто спросил может можно сдвинуть как то быстрее. Нет так нет.
«И всё-таки она вертится!»
то есть я угадал, предположив, что libc содержит оптимальную memcpy. тогда снова предположу, что еще быстрее сдвинуть можно при помощи DMA...Apparatchik писал(а):Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
Добавлено after 1 minute 27 seconds:
Но вообще гоовря, вам дают верные советы: вместо сдвига буфера целиком можно обрабатывать, грубо говоря, i-ую выборку напряжения и (i+4)-ую выборку тока, вот и будет сдвиг...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="ARV",url="/forum/viewtopic.php?p=3265903#p3265903"]то есть я угадал, предположив, что libc содержит оптимальную memcpy. тогда снова предположу, что еще быстрее сдвинуть можно при помощи DMA...[/uquote]
Видимо да, но она всеже копирует побайтно, для типа int16_t я размер умножил на 2.
[uquote="ARV",url="/forum/viewtopic.php?p=3265903#p3265903"]Но вообще гоовря, вам дают верные советы: вместо сдвига буфера целиком можно обрабатывать, грубо говоря, i-ую выборку напряжения и (i+4)-ую выборку тока, вот и будет сдвиг...[/uquote]
Выборки две, они набираются паралельно, на 400 элементов, но одну нужно сдвинуть относительно другой, обычно на 5-6 элементов, но может менятся. Сдвинуть надо именно циклично, тоесть задние элемеенты должны оказатся с переди, это важно для следуйщих расчетов.
Видимо да, но она всеже копирует побайтно, для типа int16_t я размер умножил на 2.
[uquote="ARV",url="/forum/viewtopic.php?p=3265903#p3265903"]Но вообще гоовря, вам дают верные советы: вместо сдвига буфера целиком можно обрабатывать, грубо говоря, i-ую выборку напряжения и (i+4)-ую выборку тока, вот и будет сдвиг...[/uquote]
Выборки две, они набираются паралельно, на 400 элементов, но одну нужно сдвинуть относительно другой, обычно на 5-6 элементов, но может менятся. Сдвинуть надо именно циклично, тоесть задние элемеенты должны оказатся с переди, это важно для следуйщих расчетов.
«И всё-таки она вертится!»
да все понятно уже. все получается абсолютно без сдвиговApparatchik писал(а):Выборки две, они набираются паралельно, на 400 элементов, но одну нужно сдвинуть относительно другой, обычно на 5-6 элементов, но может менятся. Сдвинуть надо именно циклично, тоесть задние элемеенты должны оказатся с переди, это важно для следуйщих расчетов.
Код: Выделить всё
int16_t buf_U[400];
int16_t buf_I[400];
#define SDVIG 5
//обрабатываете свои буферы С УЧЕТОМ СДВИГА как-то так
uint16_t index_I=SDVIG;
int32_t sum;
for(int i=0; i<400; i++){
sum += buf_U[i] * buf_I[index_I];
if(++index_I >= 400) index_I = 0;
} если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Я Вашу мысль понял, но там есче нужно после сдвига сделать вот это (только не спрашивайте зачем):
И только потом массив тока и напряжения используются в расчетах вместе по элементно. Массив напряжения подготавливается отдельно, но там все проще и быстро.
Код: Выделить всё
// пишем в первую половину массива разницу между первой и второй половиной,
for (i = max_index / 2, j = i; i < max_index; i++) {
current[i - j] -= current[i];
}
// во вторую половину пишем первую с противоположным знаком
for (i = max_index / 2, j = i; i < max_index; i++) {
current[i] = current[i - j] * (-1);
}
«И всё-таки она вертится!»


