Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

[uquote="dosikus",url="/forum/viewtopic.php?p=3257066#p3257066"]В юзаемых тобой 32пЫк есть же DMA?[/uquote]
Есть. Они и в 24-ых есть. Только я их как-то "проехал" - сразу выбрал 32-ые.
Реклама
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: Вопросы по С/С++ (СИ)

Сообщение dm211 »

Ну разобрался я в том коде, вывожу на 7-сегм.,что хочу, но.. Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть! Обслуживание индикатора и кнопок только полпамяти занимает, я остальное своё добавил.тем более с библиотекой math.h- всё- памяти не хватает, придется отдирать 7-сегм. оттуда и убирать библу ос.
"ltkrn.h" и в майне несколько бесконечных циклов-это же ось-как я понимаю? Как у вас там у си-шников-несколько нитей чтоли.. :)
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Вопросы по С/С++ (СИ)

Сообщение arkhnchul »

[uquote="dm211",url="/forum/viewtopic.php?p=3257979#p3257979"]Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть![/uquote]
а что, собственно, такого? Предположу, что автору памяти вполне хватало)
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: Вопросы по С/С++ (СИ)

Сообщение dm211 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3258044#p3258044"][uquote="dm211",url="/forum/viewtopic.php?p=3257979#p3257979"]Блин, автор конечно жжет.этого кода, надо было в STM8S003 с такой ничтожной памятью ОС засунуть![/uquote]
а что, собственно, такого? Предположу, что автору памяти вполне хватало)[/uquote]
Ничего. просто встретил впервые ОС в МК. Автор конечно опытный и написал как знает для готовой платы своё.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Вопросы по С/С++ (СИ)

Сообщение baghear »

Добрый день, подскажите пожалуйста как сделать, чтобы компилятор не ругался
warning: #188-D: enumerated type mixed with another type
Подразумеваю приведение типа или типо того)))
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Вопросы по С/С++ (СИ)

Сообщение arkhnchul »

телепатирую: вы где-то присваиваете переменной с типом enum значение какого-то из int-ов, или наоборот.
Реклама
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: Вопросы по С/С++ (СИ)

Сообщение Apparatchik »

Здравствуйте.

Нужно циклически сдвинуть массив типа 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); // копируем из буфера в начало
}
P.S. контроллер STM32 компилятор GCC, на AVR под GCC тоже интересно.
«И всё-таки она вертится!»
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Apparatchik писал(а):контроллер STM32 компилятор GCC
по идее memcpy для 32-битной платформы должна активно использовать именно 32-битные пересылки, поэтому должна выигрывать у 16-битного копирования... хотя кто знает, сделано это в arm-libc или нет... да и я не в курсе, есть ли разница у ARM-ов...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Вопросы по С/С++ (СИ)

Сообщение baghear »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3265434#p3265434"]телепатирую: вы где-то присваиваете переменной с типом enum значение какого-то из int-ов, или наоборот.[/uquote]
Для чего вы вангуете?
Там это явно написано, меня интересует как убрать warning. Как дать понять компилятору, что делаю это осознано.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Вопросы по С/С++ (СИ)

Сообщение arkhnchul »

ну первый очевидный и правильный вариант - не делать так) если все-таки это нужно, то можно явно привести типы в нужных местах.
jcxz
Мудрый кот
Сообщения: 1731
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Вопросы по С/С++ (СИ)

Сообщение jcxz »

[uquote="baghear",url="/forum/viewtopic.php?p=3265557#p3265557"][uquote="arkhnchul",url="/forum/viewtopic.php?p=3265434#p3265434"]телепатирую: вы где-то присваиваете переменной с типом enum значение какого-то из int-ов, или наоборот.[/uquote]
Там это явно написано, меня интересует как убрать warning. Как дать понять компилятору, что делаю это осознано.[/uquote]
Естественно - явно привести типы. А вы чего ожидали?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25361
Зарегистрирован: Чт янв 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: Вопросы по С/С++ (СИ)

Сообщение Apparatchik »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3265666#p3265666"]Стесняюсь спросить, а зачем нужно двигать массив? Вообще то принято двигать указателями....[/uquote]
В конкретном случае нужно скомпенсировать отставние тока от напряжения при измерении трансформатором тока. Тоесть имеется выборка АЦП измерений за период и нужно её сдвинуть циклически на некоторое значение как можно быстрее, даже в ущерб памяти, главное скорость (ассемблер не предлагать). Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
«И всё-таки она вертится!»
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Вопросы по С/С++ (СИ)

Сообщение arkhnchul »

непонятно, зачем сами значения туда-сюда перекладывать. Организуйте кольцевую структуру и двигайте указатель на условное начало
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25361
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Вопросы по С/С++ (СИ)

Сообщение КРАМ »

[uquote="Apparatchik",url="/forum/viewtopic.php?p=3265744#p3265744"]В конкретном случае нужно скомпенсировать отставние тока от напряжения при измерении трансформатором тока.[/uquote]
Вам выше подтвердили мою сентенцию на этот счет.
Однако, а зачем вообще Вам нужно это фазирование тока и напряжения? Что Вы собираетесь посчитать?
У меня опять смутные подозрения на Ваш счет... :tea:
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: Вопросы по С/С++ (СИ)

Сообщение Apparatchik »

АЦП складывает выборку в массив за период, пока складывает надо обработать предыдущую. При активной нагрузке ток немного сдвинут относительно напряжения (а не должен) из-за измерительного трансформатора, это видно как на графике так и при вычислении коофициента мощности (PF). Для компенсации индуктивности трансформатора нужно ток сдвинуть относительно напряжения. В общем зачем эти подробности? Я же сказал что уже работает и просто спросил может можно сдвинуть как то быстрее. Нет так нет.
«И всё-таки она вертится!»
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Apparatchik писал(а):Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
то есть я угадал, предположив, что libc содержит оптимальную memcpy. тогда снова предположу, что еще быстрее сдвинуть можно при помощи DMA...

Добавлено after 1 minute 27 seconds:
Но вообще гоовря, вам дают верные советы: вместо сдвига буфера целиком можно обрабатывать, грубо говоря, i-ую выборку напряжения и (i+4)-ую выборку тока, вот и будет сдвиг...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: Вопросы по С/С++ (СИ)

Сообщение Apparatchik »

[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 элементов, но может менятся. Сдвинуть надо именно циклично, тоесть задние элемеенты должны оказатся с переди, это важно для следуйщих расчетов.
«И всё-таки она вертится!»
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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: Вопросы по С/С++ (СИ)

Сообщение Apparatchik »

Я Вашу мысль понял, но там есче нужно после сдвига сделать вот это (только не спрашивайте зачем):

Код: Выделить всё

	// пишем в первую половину массива разницу между первой и второй половиной,
	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);
	}
И только потом массив тока и напряжения используются в расчетах вместе по элементно. Массив напряжения подготавливается отдельно, но там все проще и быстро.
«И всё-таки она вертится!»
Ответить

Вернуться в «Разные вопросы по МК»