Массив во флеш памяти, const, ф-ция hal

Кто любит RISC в жизни, заходим, не стесняемся.
Professor Chaos
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс мар 21, 2021 11:06:04

Re: Массив во флеш памяти, const, ф-ция hal

Сообщение Professor Chaos »

Dimon456 писал(а):вопрос возникает - можно ли еще уменьшить размер функции если использовать так
Вы тут кода написали - прямо сборник антипаттернов проектирования. Вредные советы, как не надо делать.
Даже если какие-то трюки позволят вам сократить размер функции на несколько байт, вреда от такого подхода в долгосрочной перспективе будет больше.
Функции, использующие глобальные переменные, совершенно не гибкие и имеют побочные эффекты, о которых ничего неизвестно из их объявления (прототипа). Никогда не используйте глобальных переменных в функциях. Если надо - передавайте их в функцию через параметры (как именно - по значению или по указателю/ссылке - это уже другой вопрос).
А статические локальные переменные - они на то и локальные, что за пределами функции не видны. Вы сами специально делаете их локальными именно для этого. Так что не надо окольными путями пытаться получить доступ к ним извне функции, где они определены. Если они нужны вам ещё где-то (в других функциях) - делайте их глобальными и передавайте в функции через параметры.
Реклама
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Массив во флеш памяти, const, ф-ция hal

Сообщение NStorm »

Dimon456, уберите volatile тогда уж из 1го примера. И разницы не будет. Какая разница, какой "размер функции", когда общий размер когда не уменьшится?

Добавлено after 3 minutes 1 second:
Функции, использующие глобальные переменные, совершенно не гибкие и имеют побочные эффекты, о которых ничего неизвестно из их объявления (прототипа). Никогда не используйте глобальных переменных в функциях. Если надо - передавайте их в функцию через параметры (как именно - по значению или по указателю/ссылке - это уже другой вопрос).
Соглашусь, но в embedded иногда имеет место использование глобальных переменных из функций именно из-за экономии ресурсов. Тут иногда приходится жертвовать гибкостью и изящностью кода в угоду лишним байтам и тактам.
Реклама
Professor Chaos
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс мар 21, 2021 11:06:04

Re: Массив во флеш памяти, const, ф-ция hal

Сообщение Professor Chaos »

NStorm писал(а):в embedded иногда имеет место использование глобальных переменных из функций именно из-за экономии ресурсов. Тут иногда приходится жертвовать гибкостью и изящностью кода в угоду лишним байтам и тактам.
Пусть каждый для себя решает, в каждом конкретном случае.
Замечу лишь, что ситуация, когда без глобальных переменных не обойтись никак - это обработчики прерываний. Чтобы изменить в функци-обработчике значение какой-либо переменной (флага события, например), а потом прочитать её в основном цикле, необходимо, чтобы переменная эта была глобальной. Передать её по указателю/ссылке в обработчик не получится, т.к. прототип любого обработчика - void Handler(void) - не имеет параметров.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Массив во флеш памяти, const, ф-ция hal

Сообщение Dimon456 »

Для меня сократить размер функции на несколько байт, пусть даже через костыли и не правильно, - это большой плюс.
Если вкратце, вот те переменные и та функция
Спойлер

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

#define DDS_NDMA	512
static uint16_t DmaBuff[DDS_NDMA] __attribute__ ((aligned(4)));
static uint32_t Omega __attribute__ ((aligned(4)));

union BytByte {
struct {
uint16_t h;
unsigned char b0: 1;
unsigned char b1: 1;
unsigned char b2: 1;
unsigned char b3: 1;
unsigned char b4: 1;
unsigned char b5: 1;
unsigned char b6: 1;
unsigned char b7: 1;
unsigned char b8: 1;
unsigned char b9: 1;
unsigned char b10: 1;
unsigned char b11: 1;
unsigned char b12: 1;
unsigned char b13: 1;
unsigned char b14: 1;
unsigned char b15: 1;
} bit;
volatile uint32_t byte;
}__attribute__ ((aligned(4)));

#define	IRQ_MASK	0x0000F000	//DMA_ISR_TCIF4

void DMA1_Channel4_5_IRQHandler(void)
{
	uint16_t *dp;
	uint32_t irq; uint16_t n;

	static union BytByte myBByte;

	DMA1->IFCR = irq = DMA1->ISR & IRQ_MASK;	
	dp = &DmaBuff[(irq & DMA_ISR_TCIF4) ? DDS_NDMA / 2 : 0];	

	n = DDS_NDMA / 2;		
	do {
		myBByte.byte += Omega;
		*dp = myBByte.bit.b15;
	dp += 1;
	} while (--n != 0);
}
Это dds-синтез, просто эксперимент, не цепляйтесь. На выходе меандр.
На myBByte.byte += Omega построен сумматор. Omega задается в не функции, в функции она не меняется.
myBByte.bit.b15 - бит переполнения.
Все что мне удалось выжить на stm32f030 72МГц это 3МГц, а надо больше.
NCO модуль в PIC качается частотой 16МГц, хотя бы 8МГц вытянуть.
Обидно что такой высокопроизводительный stm32, обвешанный с ног до головы таймерами и дма, не имеет в своем составе NCO модуля, или хотя бы что бы таймер работал в режиме сумматора, а не в режиме счетчика.

Какие будут предложения по уменьшению размера кода?
Реклама
Эиком - электронные компоненты и радиодетали
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Массив во флеш памяти, const, ф-ция hal

Сообщение NStorm »

Dimon456, каким образом по вашему перемещение переменной в локальную сократит объем кода?
Реклама
Professor Chaos
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс мар 21, 2021 11:06:04

Re: Массив во флеш памяти, const, ф-ция hal

Сообщение Professor Chaos »

Dimon456 писал(а):вот те переменные и та функция
В рамках этой темы обсуждать это бессмысленно. Доступ к любым статическим данным (адреса которых известны при сборке программы и неизменны все время её работы) осуществляется одинаково, по их адресу, независимо от их вида: глобальные, глобальные статические или локальные статические.
Хотите попросить советов по оптимизации своего кода - лучше создать для этого отдельную тему. Искать надо где-то в других направлениях.
Реклама
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: Массив во флеш памяти, const, ф-ция hal

Сообщение a797945 »

позвольте маленький вопрос (не по теме):
еще не имел дело с бит.полями, в приведенном коде, здесь:
*dp = myBByte.bit.b15;
будет записываться 0х0000 либо 0х0001, так ?
или что ...
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Массив во флеш памяти, const, ф-ция hal

Сообщение NStorm »

[uquote="a797945",url="/forum/viewtopic.php?p=4003687#p4003687"]будет записываться 0х0000 либо 0х0001, так ?[/uquote]
Так. 3го не дано, т.к. 1 бит отведен.
Ответить

Вернуться в «ARM»