STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3919377#p3919377"]Верной дорогой к HardFault идёте, товарищи :)[/uquote]
Я в похожей ситуации его ловил на F1/F3, если volatile не добавлять:

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

for (int x = 0; x < 32; x++)
{
	uint8_t pixels = VRAM[pixelsOffset++];
	uint8_t attr = VRAM[attrOffset++];
	uint32_t index = scrTableIndex[pixels];
	uint32_t addr = (uint32_t)scrTable8 + 564 * (attr & 0x7F) + index;

	auto p = (volatile uint64_t*)addr;
	*buf++ = p[0];
	*buf++ = p[1];
}
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3917055#p3917055"]Насколько я помню когда ARV рассказывал про этот "трюк", то речь шла о таблице во флеше.[/uquote]Поместил таблицу во флеш.
Оставил вариант с memcpy, 2% это не в счет.

Переписал Вариант_1 под F0, 254 светика, расход по оперативной памяти составил 2904 байта, по моим подсчетам осталось 160 байт.
На F0 светики работают идеально, 800 кГц, вот это вопрос - по чему на F100 капризничает.

Теперь тесты: контроллер STM32F030F4P6
на частоте 32МГц тест VladislavS показал 14мкс,
на частоте 48МГц - 9мкс.

Перешел на частоту 48МГц, тест ARV для CNT=254
СпойлерИзображение
При меньшем количестве светиков осциллограмма та же.
Скрипт "Мультирун" при CNT=60 забирает половину времени.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Что ещё за мой тест да ещё с такой позорной времянкой? Забери его себе. :shock:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, ну что сказать - ни знаю, я не программист.
F030 отличается от F100, F030 какой-то кастрированный чип, у него и набор команд меньше.
Сначала код был написан на F100, потом перенесен на F030, и он на F030 не заработал.
Мне удалось победить impure_data ценой +2к непонятно какого кода во флеше.
Пришлось отказаться от функции printf и использовать свою xprintf.
Но моя xprintf не работает без этой impure_data, пришлось добавить printf, всего одну команду

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

printf("\n");
что дает прирост лишнего +2к непонятно какого кода, но за то без impure_data.
Хотел свою xprintf поменять на printf, еще +2к коду во флеше надо.

Кроме всего прочего на F030 отказалась работать конструкция

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

*((uint64_t*)&DMABuffer[0]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].g]);
хоть с volatile, хоть без.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3920603#p3920603"]Кроме всего прочего на F030 отказалась работать конструкция

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

*((uint64_t*)&DMABuffer[0]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].g]);
хоть с volatile, хоть без.[/uquote]
Вероятно проблема в отсутствии поддержки невыровненного доступа у M0, а у тебя массивы байт... Был бы у них тип uint64_t, как я предлагал сделать, компилятор бы сам массивы выровнял, а memcpy пытается оптимизировать и должен проверять можно ли копировать по 32 бита, если нельзя, то вероятно копирует побайтно, что еще медленнее.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Reflector писал(а):а memcpy пытается оптимизировать и должен проверять можно ли копировать по 32 бита, если нельзя, то вероятно копирует побайтно, что еще медленнее.
но я могу таблицу выровнять __attribute__((aligned(1024))) ?
Reflector писал(а):Был бы у них тип uint64_t, как я предлагал сделать
можно поподробнее?
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3920623#p3920623"]но я могу таблицу выровнять __attribute__((aligned(1024))) ?[/uquote]
Регистры 32-х битные, достаточно по границе 4-х байт выровнять.
можно поподробнее?

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

const uint64_t table[256];
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Reflector писал(а):Регистры 32-х битные, достаточно по границе 4-х байт выровнять.
что 4 что 1024 не помогло.
Reflector писал(а):

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

const uint64_t table[256];
Говорил же, поподробнее.
Сделал так
Спойлер

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

	*((volatile uint64_t*)&DMABuffer[0]) = tablica[pixeld[pixel_cnt].g];
	*((volatile uint64_t*)&DMABuffer[8]) = tablica[pixeld[pixel_cnt].r];
	*((volatile uint64_t*)&DMABuffer[16]) = tablica[pixeld[pixel_cnt].b];
Теперь таблица
Спойлер

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

#define HIGH      26	//38=0x26			
#define LOW       13	//19=0x13

#define _CONCAT_(x,a,s,d,f,g,h,j,k)		x ## a ## s ## d ## f ## g ## h ## j ## k
#define CONCAT(x,a,s,d,f,g,h,j,k)		_CONCAT_(x,a,s,d,f,g,h,j,k)
const uint64_t tablica [256] =
{
		CONCAT(0x,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW),
		CONCAT(0x,LOW,LOW,LOW,LOW,LOW,LOW,LOW,HIGH),
		CONCAT(0x,LOW,LOW,LOW,LOW,LOW,LOW,HIGH,LOW),
		CONCAT(0x,LOW,LOW,LOW,LOW,LOW,LOW,HIGH,HIGH),
		CONCAT(0x,LOW,LOW,LOW,LOW,LOW,HIGH,LOW,LOW),
		CONCAT(0x,LOW,LOW,LOW,LOW,LOW,HIGH,LOW,HIGH),
		CONCAT(0x,LOW,LOW,LOW,LOW,LOW,HIGH,HIGH,LOW),
		CONCAT(0x,LOW,LOW,LOW,LOW,LOW,HIGH,HIGH,HIGH),
		CONCAT(0x,LOW,LOW,LOW,LOW,HIGH,LOW,LOW,LOW),
Что на F100 что и на F030, одинаковая картина: к примеру если красный то обязательно на максимуме то есть FF. А так цвета совпадают. Но ... что то не так.

А так Вариант_2 выдает 4мкс.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3920732#p3920732"]Говорил же, поподробнее.
Сделал так

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

	*((volatile uint64_t*)&DMABuffer[0]) = tablica[pixeld[pixel_cnt].g];
[/uquote]
Нужно всего-то скопировать несколько элементов из одного массива в другой, подробнее - это разве что самому все написать :) DMABuffer надеюсь тоже выровнял?
Последний раз редактировалось Reflector Сб ноя 07, 2020 22:24:40, всего редактировалось 2 раза.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Reflector писал(а):Нужно всего-то скопировать несколько элементов из одного массива в другой
Только сейчас глянул, он переворачивает байты. Поменял так

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

#define _CONCAT_(x,a,s,d,f,g,h,j,k)		x ## k ## j ## h ## g ## f ## d ## s ## a
и все встало на свои места.
Ваш этот вариант 5мкс выдает.
Reflector писал(а):DMABuffer надеюсь тоже выровнял?
Нет, когда игрался c F100, добился стабильности только тогда когда между светиками делаю паузу, то есть вот так
Спойлер

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

	*((volatile uint64_t*)&DMABuffer[0]) = tablica[pixeld[pixel_cnt].g];
	*((volatile uint64_t*)&DMABuffer[8]) = tablica[pixeld[pixel_cnt].r];
	*((volatile uint64_t*)&DMABuffer[16]) = tablica[pixeld[pixel_cnt].b];
	DMABuffer[24] = 0;
    }
    else
    {
так и дальше использую.
Ваш вариант все равно выдает предупреждение
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3920603#p3920603"]Кроме всего прочего на F030 отказалась работать конструкция[/uquote]
Я знал, я знал :)

Как же дорого обходится не слушать советы бывалых.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS писал(а):Как же дорого обходится не слушать советы бывалых.
И чем это обошлось? МК, лента и компутер?

Reflector, выровнял буфер дма и таблицу

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

__attribute__((aligned(4)))
Ваш вариант
Спойлер

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

	*((volatile uint64_t*)&DMABuffer[0]) = tablica[pixeld[pixel_cnt].g];	
	*((volatile uint64_t*)&DMABuffer[8]) = tablica[pixeld[pixel_cnt].r];
	*((volatile uint64_t*)&DMABuffer[16]) = tablica[pixeld[pixel_cnt].b];
до выравнивания выдавал 5мкс, после выравнивания 2мкс. Осталось убрать warning?

Так же с выравниванием 2мкс выдает этот вариант, до выравнивания было 9мкс
Спойлер

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

   memcpy(&DMABuffer[0], &tablica[pixeld[pixel_cnt].g], 8);	
	memcpy(&DMABuffer[8], &tablica[pixeld[pixel_cnt].r], 8);	
	memcpy(&DMABuffer[16], &tablica[pixeld[pixel_cnt].b], 8);
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3921011#p3921011"]
VladislavS писал(а):Как же дорого обходится не слушать советы бывалых.
И чем это обошлось?[/uquote]Болью. Больно смотреть на эти мучения. :cry: Вот думаю, предложить или нет добавить преобразование HSV->RGB на лету?
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS писал(а): Вот думаю, предложить или нет добавить преобразование HSV->RGB на лету?
У на уже есть преобразование HSV->RGB.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3921011#p3921011"]Осталось убрать warning?[/uquote]
У меня на gcc 9.2 даже если добавить -Wstrict-aliasing никаких предупреждений нет. Попробуй так:
Спойлер

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

	volatile uint64_t* p = (uint64_t*)DMABuffer;
	p[0] = tablica[pixeld[pixel_cnt].g];
	p[1] = tablica[pixeld[pixel_cnt].r];
	p[2] = tablica[pixeld[pixel_cnt].b];
И паузы между диодами не нужны, в документации про них ничего не сказано и если работает только с паузой, значит она маскирует какую-то ошибку, которая все равно может проявляться, только реже.

Добавлено after 37 minutes 15 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3921022#p3921022"]У на уже есть преобразование HSV->RGB.[/uquote]
Есть функция для 8-ми биток где целых 8 делений и это запускается на мк без аппаратного деления. Ее раза в 3 спокойно можно ускорить.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Reflector писал(а):Попробуй так:
Работает, 2мкс, warning нету.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3921022#p3921022"]У на уже есть преобразование HSV->RGB.[/uquote]

А оно у вас точно правильное?
Потому что пока я не написал своё правильное преобразование HSV > RGB, ни один глупый пример из инета не заработал как надо.
Проверьте ненасыщенные цвета около перехода синий - красный.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Пытаюсь сократить количество конечных точек в USB CDC, неиспользуемую INTERRUPT IN назначил десятым номером, все работало. Затем решил объединить OUT и IN bulk. И вот здесь-то непонятно что происходит: данные по USB принимаются до тех пор, пока не начнется передача. Началась передача — все, данные приниматься перестают.
Обработчик такой сейчас (для опытов пока обе точки IN3 и OUT3):

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

static void rxtx_Handler(){
    uint16_t epstatus = KEEP_DTOG(USB->EPnR[3]);
    if(RX_FLAG(epstatus)){
        rxNE = 1;
        epstatus = (epstatus & ~(USB_EPnR_STAT_TX | USB_EPnR_CTR_RX)) ^ USB_EPnR_STAT_RX; // set valid RX, clear RX ctr
    }else{
        tx_succesfull = 1;
        epstatus = (epstatus & ~(USB_EPnR_CTR_TX|USB_EPnR_STAT_TX|USB_EPnR_STAT_RX)); // clear TX ctr
    }
    USB->EPnR[3] = epstatus;
}
Fixed: сам рукожоп, во втором случае забыл valid RX!
Последний раз редактировалось Eddy_Em Пн ноя 09, 2020 11:06:30, всего редактировалось 1 раз.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="GARMIN",url="/forum/viewtopic.php?p=3921067#p3921067"]А оно у вас точно правильное?[/uquote]
Скорее всего. Я делал по-другому и результаты были полностью идентичны функции из проекта ARV.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

GARMIN писал(а):А оно у вас точно правильное?
Не совсем.
Я могу оперировать параметром H, S и V всегда равны FF.
Вот картинка
СпойлерИзображение
Я зажёг светики с шагом H=5, то есть от 0 до FF.
Последние два светика должны быть чисто красные, а они не красные, а FF0010.
Про это я знал, но как-то было "до лампочки".
Ответить

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