Вопросы по С/С++ (СИ)
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
[uquote="dosikus",url="/forum/viewtopic.php?p=3257066#p3257066"]В юзаемых тобой 32пЫк есть же DMA?[/uquote]
Есть. Они и в 24-ых есть. Только я их как-то "проехал" - сразу выбрал 32-ые.
Есть. Они и в 24-ых есть. Только я их как-то "проехал" - сразу выбрал 32-ые.
- Реклама
Re: Вопросы по С/С++ (СИ)
Ну разобрался я в том коде, вывожу на 7-сегм.,что хочу, но.. Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть! Обслуживание индикатора и кнопок только полпамяти занимает, я остальное своё добавил.тем более с библиотекой math.h- всё- памяти не хватает, придется отдирать 7-сегм. оттуда и убирать библу ос.
"ltkrn.h" и в майне несколько бесконечных циклов-это же ось-как я понимаю? Как у вас там у си-шников-несколько нитей чтоли..
"ltkrn.h" и в майне несколько бесконечных циклов-это же ось-как я понимаю? Как у вас там у си-шников-несколько нитей чтоли..
Re: Вопросы по С/С++ (СИ)
[uquote="dm211",url="/forum/viewtopic.php?p=3257979#p3257979"]Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть![/uquote]
а что, собственно, такого? Предположу, что автору памяти вполне хватало)
а что, собственно, такого? Предположу, что автору памяти вполне хватало)
Re: Вопросы по С/С++ (СИ)
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3258044#p3258044"][uquote="dm211",url="/forum/viewtopic.php?p=3257979#p3257979"]Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть![/uquote]
а что, собственно, такого? Предположу, что автору памяти вполне хватало)[/uquote]
Ничего. просто встретил впервые ОС в МК. Автор конечно опытный и написал как знает для готовой платы своё.
а что, собственно, такого? Предположу, что автору памяти вполне хватало)[/uquote]
Ничего. просто встретил впервые ОС в МК. Автор конечно опытный и написал как знает для готовой платы своё.
Re: Вопросы по С/С++ (СИ)
Добрый день, подскажите пожалуйста как сделать, чтобы компилятор не ругался
warning: #188-D: enumerated type mixed with another type
Подразумеваю приведение типа или типо того)))
warning: #188-D: enumerated type mixed with another type
Подразумеваю приведение типа или типо того)))
- Реклама
Re: Вопросы по С/С++ (СИ)
телепатирую: вы где-то присваиваете переменной с типом enum значение какого-то из int-ов, или наоборот.
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: Вопросы по С/С++ (СИ)
Здравствуйте.
Нужно циклически сдвинуть массив типа 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); // копируем из буфера в начало
}
«И всё-таки она вертится!»
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
по идее memcpy для 32-битной платформы должна активно использовать именно 32-битные пересылки, поэтому должна выигрывать у 16-битного копирования... хотя кто знает, сделано это в arm-libc или нет... да и я не в курсе, есть ли разница у ARM-ов...Apparatchik писал(а):контроллер STM32 компилятор GCC
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3265434#p3265434"]телепатирую: вы где-то присваиваете переменной с типом enum значение какого-то из int-ов, или наоборот.[/uquote]
Для чего вы вангуете?
Там это явно написано, меня интересует как убрать warning. Как дать понять компилятору, что делаю это осознано.
Для чего вы вангуете?
Там это явно написано, меня интересует как убрать warning. Как дать понять компилятору, что делаю это осознано.
Re: Вопросы по С/С++ (СИ)
ну первый очевидный и правильный вариант - не делать так) если все-таки это нужно, то можно явно привести типы в нужных местах.
Re: Вопросы по С/С++ (СИ)
[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]
Естественно - явно привести типы. А вы чего ожидали?
- КРАМ
- Друг Кота
- Сообщения: 25367
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы по С/С++ (СИ)
[uquote="Apparatchik",url="/forum/viewtopic.php?p=3265438#p3265438"]Нужно циклически сдвинуть массив типа int16_t вправо, как думаете какая из[/uquote]
Стесняюсь спросить, а зачем нужно двигать массив? Вообще то принято двигать указателями....
Стесняюсь спросить, а зачем нужно двигать массив? Вообще то принято двигать указателями....
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: Вопросы по С/С++ (СИ)
[uquote="КРАМ",url="/forum/viewtopic.php?p=3265666#p3265666"]Стесняюсь спросить, а зачем нужно двигать массив? Вообще то принято двигать указателями....[/uquote]
В конкретном случае нужно скомпенсировать отставние тока от напряжения при измерении трансформатором тока. Тоесть имеется выборка АЦП измерений за период и нужно её сдвинуть циклически на некоторое значение как можно быстрее, даже в ущерб памяти, главное скорость (ассемблер не предлагать). Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
В конкретном случае нужно скомпенсировать отставние тока от напряжения при измерении трансформатором тока. Тоесть имеется выборка АЦП измерений за период и нужно её сдвинуть циклически на некоторое значение как можно быстрее, даже в ущерб памяти, главное скорость (ассемблер не предлагать). Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
«И всё-таки она вертится!»
Re: Вопросы по С/С++ (СИ)
непонятно, зачем сами значения туда-сюда перекладывать. Организуйте кольцевую структуру и двигайте указатель на условное начало
- КРАМ
- Друг Кота
- Сообщения: 25367
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы по С/С++ (СИ)
[uquote="Apparatchik",url="/forum/viewtopic.php?p=3265744#p3265744"]В конкретном случае нужно скомпенсировать отставние тока от напряжения при измерении трансформатором тока.[/uquote]
Вам выше подтвердили мою сентенцию на этот счет.
Однако, а зачем вообще Вам нужно это фазирование тока и напряжения? Что Вы собираетесь посчитать?
У меня опять смутные подозрения на Ваш счет...
Вам выше подтвердили мою сентенцию на этот счет.
Однако, а зачем вообще Вам нужно это фазирование тока и напряжения? Что Вы собираетесь посчитать?
У меня опять смутные подозрения на Ваш счет...
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: Вопросы по С/С++ (СИ)
АЦП складывает выборку в массив за период, пока складывает надо обработать предыдущую. При активной нагрузке ток немного сдвинут относительно напряжения (а не должен) из-за измерительного трансформатора, это видно как на графике так и при вычислении коофициента мощности (PF). Для компенсации индуктивности трансформатора нужно ток сдвинуть относительно напряжения. В общем зачем эти подробности? Я же сказал что уже работает и просто спросил может можно сдвинуть как то быстрее. Нет так нет.
«И всё-таки она вертится!»
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
то есть я угадал, предположив, что libc содержит оптимальную memcpy. тогда снова предположу, что еще быстрее сдвинуть можно при помощи DMA...Apparatchik писал(а):Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
Добавлено after 1 minute 27 seconds:
Но вообще гоовря, вам дают верные советы: вместо сдвига буфера целиком можно обрабатывать, грубо говоря, i-ую выборку напряжения и (i+4)-ую выборку тока, вот и будет сдвиг...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: Вопросы по С/С++ (СИ)
[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 элементов, но может менятся. Сдвинуть надо именно циклично, тоесть задние элемеенты должны оказатся с переди, это важно для следуйщих расчетов.
«И всё-таки она вертится!»
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
да все понятно уже. все получается абсолютно без сдвигов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;
} если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: Вопросы по С/С++ (СИ)
Я Вашу мысль понял, но там есче нужно после сдвига сделать вот это (только не спрашивайте зачем):
И только потом массив тока и напряжения используются в расчетах вместе по элементно. Массив напряжения подготавливается отдельно, но там все проще и быстро.
Код: Выделить всё
// пишем в первую половину массива разницу между первой и второй половиной,
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);
}
«И всё-таки она вертится!»


