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

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

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3924649#p3924649"]Не знаешь, GCC так и не научили __RBIT в компайлтайме считать?[/uquote]
Вроде нет. 10-й в этом или следующем месяце появится, может там будет.

Добавлено after 1 hour 31 minute 30 seconds:
Хм, а превью gcc 10 для ARM оказывается еще в начале лета появился...
Реклама
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3919380#p3919380"]...
Я в похожей ситуации его ловил на 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];
}
[/uquote]

поясните, пожалуйста, почему приключился hardfault ?
и к чему здесь принуждает компилятор применение volatile ?
размещению p в озу?
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a797945",url="/forum/viewtopic.php?p=3924833#p3924833"]поясните, пожалуйста, почему приключился hardfault ?
и к чему здесь принуждает компилятор применение volatile ?[/uquote]
Там использовалась большая таблица, внутри 16-ти битные значения, соответственно адрес выровнен по границе 2-х байт, но копирование происходит сразу по 32 бита, потому нужна поддержка невыровненного доступа или придется увеличивать таблицу в 2 раза, а она и так 70КБ. M3/M4 поддерживают невыровненный доступ не для всех инструкций копирования и компилятор как раз генерил LDRD где такой поддержки нет. А с volatile он подставлял пару LDR и все работало. Возможно это непосредственно связано с ограничениями налагаемыми на volatile переменные, но думаю другой компилятор может руководиться другими правилами кодогенерации, так что по нормальному тут нужно задействовать инлайн ассм, но т.к. это был тестовый проект, то оставил как есть... Для WS2812 нужно 24 байта на диод, там можно выровнять массив с таблицей и не переживать :)

ps. Да, на самом деле адрес был (volatile uint32_t*)addr и 4 копирования.
pps. Там, на мой взгляд, сама таблица достаточно интересная... Кто догадается как использовалась такая строка? :)

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

00000000100000001100000011100000111100001111100011111100111111101111111
11010101001010101101010111010100000101111101001000011010111101101000010
01011100010001001100101100100100111001101001101101111001000111010001101
110010100010110110011101110110001010110000101001111010110001100110001
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS писал(а):Легко. Ничего это в данном случае не меняет.
У вас "неправильный" компилятор и он дает неправильный мед!
Вот GCC.
СпойлерИзображение
С константой тоже самое.
СпойлерИзображение
VladislavS писал(а):Надеюсь, предложения саму функцию заменить макросом не последует?
В этом нет необходимости. Будет предложение сменить компилятор на нормальный, а не то что вы используете, чтобы не вводить людей в заблуждение.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Reflector",url="/forum/viewtopic.php?p=3924614#p3924614"]

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

return  __CLZ(__RBIT(value));
[/uquote]Смотри какая красота!
СпойлерИзображение
CLZ.png
(51.3 КБ) 110 скачиваний
Добавлено after 10 minutes 11 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3924878#p3924878"]Будет предложение сменить компилятор на нормальный, а не то что вы используете, чтобы не вводить людей в заблуждение.[/uquote]У вас есть методика поделить компиляторы на нормальные и нет? Судя по логам, Compiler Exploer использует "/opt/compiler-explorer/arm/gcc-arm-none-eabi-9-2019-q4-major/" - официально раздаваемый ARM компилятор. И версия всего на одну ступень ниже последней.
СпойлерИзображение
gcc.png
(59.65 КБ) 92 скачивания
И как узнать, что ваш пример не в режиме C++ скомпилирован?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS писал(а):У вас есть методика поделить компиляторы на нормальные и нет?
Сравните асм мой и ваш и найдите разницу.
Вы утверждаете что C++ генерирует лучший код чем Си https://radiokot.ru/forum/viewtopic.php ... 5#p3924275
И при этом зачем-то использовали разные версии CGG (8.2 для Си и 9.2.1 для C++).
На деле оказалось что между асм кодом Си и C++ разницы вообще нет.
VladislavS писал(а):И как узнать, что ваш пример не в режиме C++ скомпилирован?
У вас на компе нет компиля что не можете проверить?
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Мурик",url="/forum/viewtopic.php?p=3924896#p3924896"]Вы утверждаете что C++ генерирует лучший код чем Си[/uquote]Не надо перевирать! Мой пост был под заголовком "зачем нужны современные компиляторы, языки программирования и их стандарты". Можете сходить и проверить. Всё остальное ваши домыслы.

[uquote="Мурик",url="/forum/viewtopic.php?p=3924896#p3924896"]И при этом зачем-то использовали разные версии CGG (8.2 для Си и 9.2.1 для C++).[/uquote]Это не мой выбор, а Compiler Exploer. Брал максимально свежие версии из доступных для выбора.

[uquote="Мурик",url="/forum/viewtopic.php?p=3924896#p3924896"]На деле оказалось что между асм кодом Си и C++ разницы вообще нет.[/uquote]На очевидной константе. Достаточно слегка усложнить задачу и...
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS писал(а):Это не мой выбор, а Compiler Exploer.
Разве есть GCC только для Си или только для плюсов? Видимо баг в ИДЕ.
Что мешало использовать нормальную ИДЕ с текущей версией GCC?
VladislavS писал(а):Достаточно слегка усложнить задачу и...
Каждый конкретный случай нужно рассматривать в отдельности. По моему вы сильно недооцениваете компилятор Си.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Мурик",url="/forum/viewtopic.php?p=3924916#p3924916"]Что мешало использовать нормальную ИДЕ с текущей версией GCC?[/uquote]Неужели на скриншотах не видно, что это не IDE?

[uquote="Мурик",url="/forum/viewtopic.php?p=3924916#p3924916"]Каждый конкретный случай нужно рассматривать в отдельности.[/uquote]Ничего не получится. Как только мы пойдём в зону, где С++ имеет преимущества, то равноценного ответа просто не будет из-за отсутствия присутствия.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3924881#p3924881"]Смотри какая красота![/uquote]
Да, но для M0 мой код будет быстрее в 3 раза еще и меньше по размеру :)
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

Спасибо
ответ исчерпывающий :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Хватит уже версии gcc сравнивать: толку-то, когда clang рвет gcc как тузик грелку?
Правда, я и сам gcc пока собираю (GCC 10.2.0)...
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Reflector",url="/forum/viewtopic.php?p=3924927#p3924927"]Да, но для M0 мой код будет быстрее в 3 раза еще и меньше по размеру :)[/uquote]Это даже не обсуждается. Но "политика партии" гласит, что стандартную библиотеку пишут программисты выше среднего и алгоритмы в ней обычно лучше того, что напишет среднестатистический программист. Если вы написали лучше - это заслуживает уважения. Будем надеяться, стандартная библиотека подтянется. У них, конечно, работы по преводу её на 20-й не позавидуешь.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

ARV, прикрутил я карточку SD, любая работает, даже моя проблемная.
Перепробовал кучу библиотек, точнее 3, та которая в инете FatFS требует 512+ байт рам, но она на f100 работает.
Моя библиотека работает, но не хочет перемещаться по файлу, не стал разбираться.
Остановился на той, которая у вас в проекте, но она не работала, точнее работала но через раз,
я ее заставил работать, нашел отличие, вся проблема была вот в этом участке кода функции disk_initialize
Спойлер

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

	if(!SD_present()){
		return STA_NODISK;
	}
я его выкинул, не зачем долбить карту пока она не в режиме spi, то ответит, то нет
Инициализируется на скорости 48МГц/256 потом переключается на 48МГц/2.
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3924850#p3924850"]... Кто догадается как использовалась такая строка? :)

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

00000000100000001100000011100000111100001111100011111100111111101111111
...
[/uquote]

побитное "лекало" для 8-ми разрядов ?
дотошно не проверял, но на глаз и функционально - вроде, оно.
м-да, без высшего образования, только со второй попытки допер. :(
снимаю шляпу, я б невжизнь такое не придумал.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a797945",url="/forum/viewtopic.php?p=3926753#p3926753"]побитное "лекало" для 8-ми разрядов ?[/uquote]
Если я правильно понял, то да :) Суть в том, что в той строке есть все комбинации от 00000000 до 11111111, при этом размер строки 283 символа вместо 8 * 256, т.е. она меньше в 7.24 раза. Есть еще небольшая вторая таблица для пересчета индекса, а нужно это было потому что данные выводились на дисплей и один бит из моей строки соответствовал двум байтам цвета, в итоге для 16-ти цветов без упаковки будет таблица на 512КБ и есть проект где она в таком виде и присутствует, а у меня таблица 73КБ и данные из нее выводятся на дисплей непосредственно из флеша. Таблица для диодов всего 2КБ, была бы она побольше можно было бы применить данный подход и к ней тоже.
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

да функционирование я при первой попытке "расшифровал", но завис - не сходились размерности,
только при втором "штурме" наконец дошло. :)
я не за диоды, сама задачка увлекла.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a797945",url="/forum/viewtopic.php?p=3926783#p3926783"]но завис - не сходились размерности[/uquote]
Идеальный размер - это 8 + 255 = 263, чтобы получить 283 мне пришлось написать программу и думаю всего 20 лишних символов - это очень хороший результат :)
Нашел транзистор. Понюхал.
Сообщения: 156
Зарегистрирован: Вс сен 06, 2020 16:06:10

Сообщение iddqd »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3924946#p3924946"]Хватит уже версии gcc сравнивать: толку-то, когда clang рвет gcc как тузик грелку?[/uquote]
Хотелось бы каких-то более убедительных обоснований вот этого момента. На каких вариантах ARM? И с какими параметрами? А то раньше clang вообще скоростью компила хвастался, но это было в ущерб оптимизации. А как сделали оптимизацию сравнимо с gcc так и скоростью компила резко перестали хвастаться "почему-то". Как насчет опубликовать какие-то результаты, с конкретикой, чтоли? Ну там версии, ключи, тип процессора, и по какому именно параметру "рвет"?
Друг Кота
Аватара пользователя
Сообщения: 7059
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

Пришли с Али заказанные STM32F042K6. Вроде работают, прошиваются и стираются. Решил первый проект с этим МК в IAR запилить. Проект создал. Теперь, думаю, нужно к нему заголовочники из CMSIS подключить. С сайта ST скачиваю STM32Cube_FW_F0_V1.11.0, иду в привычную директорию C:\Users\***\Desktop\STM32Cube_FW_F0_V1.11.0\Drivers\CMSIS\Device\ST\STM32F0xx\Include. Поиском винды ищу файлы с упоминанием STM32F042K6. Винда многозначительно молчит. Почувствовав недоброе прошелся поиском по всем папкам либы. Нашлись упоминания STM32F042K6 в разном гуане вроде примеров для Кейл и разного мусора типа Нуклео.

Два вопроса. ST всегда так делает? И что теперь мне делать?
Астролябия-сама меряет, было бы что мерять!!!
Ответить

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