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

Кто любит RISC в жизни, заходим, не стесняемся.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

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

Сообщение tonyk »

Eddy_Em писал(а):Еще натыкался неоднократно на странность: с одними и теми же (за исключением архитектуры, понятное дело) флагами на F072 memcpy работал, а на F103 приводил к хардфолту. Вот, проверил на G070 - тоже memcpy к хардфолту приводит
Попробуй почитать доки и заменить memcpy() на memmove().
Eddy_Em писал(а):Вообще, самый идеал — совершенно не пользоваться libc
То есть изобретать свой велосипед. Зачем?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352159#p4352159"]Бдыщ: не работает прошивка. Убираю -flto — работает![/uquote][uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352182#p4352182"]А еще я вспомнил, почему --specs=nano.specs как-то комментировал: с этим делом у меня тоже прошивка не работала.[/uquote][uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352182#p4352182"]на F072 memcpy работал, а на F103 приводил к хардфолту.[/uquote][uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352182#p4352182"]Вот, проверил на G070 - тоже memcpy к хардфолту приводит, пришлось свой использовать.[/uquote][uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352182#p4352182"]Я вот с F303 возился: флоаты заработали, арифметические операции с ними — тоже, а вот sqrt — хрена с два![/uquote]
Прямо триллер какой-то. Может, что-то в консерватории подправить?
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS, stm32f030f4p6 при -42 градуса отказывается работать, при -36 работает. Какой у этого хваленного stm температурный диапазон?
В гараже почте -50 аон на 80с31 запускается и работает.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

А я тут причём? Я их делаю что-ли?

[uquote="Dimon456",url="/forum/viewtopic.php?p=4352308#p4352308"]stm32f030f4p6 при -42 градуса отказывается работать, при -36 работает.[/uquote]Ну, так и должно быть.

[uquote="Dimon456",url="/forum/viewtopic.php?p=4352308#p4352308"]Какой у этого хваленного stm температурный диапазон?[/uquote]В даташит заглянуть не судьба?

[uquote="Dimon456",url="/forum/viewtopic.php?p=4352308#p4352308"]В гараже почте -50 аон на 80с31 запускается и работает.[/uquote]У нас G071 без кварца на -60 запускаются, если что. Да и по опыту других контроллеров - первым кварц отваливается. Внешнее тактирование обычно сильно ниже -50 позволяет работать.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352159#p4352159"]Послушал я тут советчиков и добавил -flto в опции компилятора. Но не проверил сразу. Бдыщ: не работает прошивка. Убираю -flto — работает!
Вот такие пироги. Странно, что у других все ОК с этой опцией.[/uquote]

У меня подобное наблюдалось и связано было с тем, что обработчики векторов прерываний с flto выбрасывались (они в стартапе вроде бы с "weak" объявлены, и из-за этого и выбрасывались). Решалось, если не ошибаюсь, компиляцией .S файлов (читай, стартапа) без этой опцией, а прочих (C-шников) - с ней.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

WiseLord, о, как интересно. Спасибо, попробую
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

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

const intvec_elem __vector_table[] __attribute__((used, section(".vectors"))) =
{ (intvec_elem)__STACK_TOP, &__Reset_Handler,
  &NMI_Handler,
  &HardFault_Handler,
  ...
};
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Так вот мой стартап. Честно стырил из opencm3 и переделал под G0.
Возможно, добавление атрибута "used" действительно поможет, ХЗ. Я вообще с этими дурацкими атрибутами стараюсь как можно меньше дела иметь. Я пользуюсь C89, лишь изредка втыкая фичи C99. То, что там позже наворотили — бред собачий!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

А как подругому? Либо used, либо использовать в коде для инициализации VTOR (G0 это не касается), например.

Вообще, в CMSIS есть макрос __VECTOR_TABLE_ATTRIBUTE, там на разные компиляторы всё задефайнено как надо.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

VladislavS, спасибо. Действительно, нужно было указать атрибут "used". Код стал примерно на килобайт меньше (6.5к → 5.5к), при этом все нормально работает.
Вообще не понимаю, как получается такая оптимизация...

P.S. Попробовал с предыдущим (где тупо UART): сначала размер упал с 1636Б до 1556Б, но USART не работал. Тут я вспомнил, что у меня переменные, меняющиеся в прерываниях, не были помечены волатильными. Размер увеличился до 1592Б, но при этом все работает!
Даже несчастный blink с 880Б на 8Б "похудел" (уж что там было оптимизировать — вообще не понимаю).
Для меня это — магия какая-то. Как и то, что на -O2 gcc не выкинул мои переменные, не помеченные волатильными. Я-то всю жизнь считал, что единственная возможность оптимизации — это указание -O с числом или s…

Добавлено after 15 minutes 31 second:
О, и memcpy заработало! И даже код стал на 4 байта меньше, чем с моим аналогом…
А вот в "сниппете" с гольным усартом использование memcpy, наоборот, увеличило код. Подозреваю, что в данном случае gcc инлайнит его. В общем, хрен поймешь, что там в этой -flto происходит.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352628#p4352628"]О, и memcpy заработало![/uquote]
Ничего себе, получается твой код и у других людей теперь работает! :)
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

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

Сообщение azhel12 »

Обновил версию компилятора с 10 на 12, теперь при компиляции получаю предупреждения:
warning: _close is not implemented and will always fail и то же самое для seek, read, write.

Искал решение, если верно понял, дело в используемой библиотеке libc, на форумах и SO советовали выставить флаг --specs=nosys.specs, но не помогло. Кто-то сталкивался с таким?

P.S. С новым компилятором еще прошивка стала больше, тестовая моргалка диодом выросла с 300 байтов до 380, надеюсь, что из-за той же проблемы.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

CPP_FLAGS := -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -Wall

LD_FLAGS := -Wl,--gc-sections -nostartfiles -specs=nano.specs -specs=nosys.specs

И конструкторы вызвать руками в старатпе.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

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

Сообщение azhel12 »

Спасибо, сейчас попробую
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="azhel12",url="/forum/viewtopic.php?p=4352735#p4352735"]Искал решение, если верно понял, дело в используемой библиотеке libc, на форумах и SO советовали выставить флаг --specs=nosys.specs, но не помогло. Кто-то сталкивался с таким?[/uquote]
У меня такое наоборот появляется если --specs=nosys.specs добавить, стоит только --specs=nano.specs.

Добавлено after 1 hour 13 minutes 57 seconds:
[uquote="azhel12",url="/forum/viewtopic.php?p=4352735#p4352735"]С новым компилятором еще прошивка стала больше, тестовая моргалка диодом выросла с 300 байтов до 380, надеюсь, что из-за той же проблемы.[/uquote]
Проверил на халовском блинке, для gcc 10.3 и 12.2 получилось 728 и 752 байт. На C++ не проверить т.к. мои либы и на gcc 11 уже не скомпилируются... В любом случае не существенно, особенно учитывая, что простой переход с STM32F0 на G0 размер флеша удваивает или даже учетверяет, это те кто пишут на С для тинек выбирают компилятор по размеру генерируемого кода :)
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Reflector, ну, у меня наоборот получилось. С тем же -flto абсолютно одинаковый "блинк" (который тупо мыргает, а если нажмешь кнопочку - морзянкой "SOS" отмигивает) на G0 вышел 872Б, а на F0 — 1136Б.
И да, чем старше версия gcc, тем жирней получается прошивка, как ни странно…

Добавлено after 1 minute 48 seconds:
[uquote="azhel12",url="/forum/viewtopic.php?p=4352735#p4352735"]warning: _close is not implemented and will always fail и то же самое для seek, read, write.[/uquote]
Это должно вылезать, лишь если "запрещенные" функции вроде printf использовать. А на простом "блинке" их же нет.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352893#p4352893"]у меня наоборот получилось. С тем же -flto абсолютно одинаковый "блинк" (который тупо мыргает, а если нажмешь кнопочку - морзянкой "SOS" отмигивает) на G0 вышел 872Б, а на F0 — 1136Б.[/uquote]
Абсолютно одинаковый блинк не может быть настолько больше на мк с таким-же ядром, значит видимо флаги не одинаковые. Я вообще про то, что раньше были мелкие F0 с флешем 16/32KB, а теперь у таких же G0 его 16/32/64KB.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

А что, у всех STM32, где есть RTC (скажем, тот огрызок, что у F103, таковым назвать язык не поворачивается), дата и время хранятся в таком покоцанном идиотском формате? Ладно б использовали чистый BCD, но там поля от 1 до 4 бит длиной! Может, в каких-то моделях есть вменяемые регистры RTC, чтобы можно было к ним сразу, как к полям структуры доступ иметь?
Начал ковыряться с RTC G070, замучился функции преобразования типов данных рисовать. И опять куча делений, блин!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4353202#p4353202"]А что, у всех STM32, где есть RTC (скажем, тот огрызок, что у F103, таковым назвать язык не поворачивается), дата и время хранятся в таком покоцанном идиотском формате?[/uquote]
У самых новых, STM32U5 и еще не анонсированном H5, есть binary mode помимо BCD.
Если что я так делал:
Спойлер

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

enum class WeekDay { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };

static uint32_t packTime(const Time& time) 
{ 
    return toBcd(time.hour) << RTC_TR_HU_Pos | toBcd(time.min) << RTC_TR_MNU_Pos | toBcd(time.sec); 
}

static uint32_t toBcd(uint32_t value) { return (value / 10) << 4 | (value % 10); }

static uint32_t fromBcd(uint32_t value, int secondFieldSize)
{
	uint32_t mask = (1 << secondFieldSize) - 1;
	return (value & 15) + ((value >> 4) & mask) * 10;
}

static void setDateTime(const Time* time, const Date* date = nullptr, WeekDay week = WeekDay::Sunday)
{
	if(time)  RTC->TR = packTime(*time);
	if(date)  RTC->DR = toBcd(date->year - 2000) << RTC_DR_YU_Pos | toBcd(date->month) << RTC_DR_MU_Pos | 
                                    toBcd(date->day) | uint32_t(week) << RTC_DR_WDU_Pos;
}

static void getDateTime(Time* time, Date* date = nullptr, WeekDay* week = nullptr)
{
	uint32_t dr, tr;
	do
	{
		tr = RTC->TR;
		dr = RTC->DR;
	} while (tr != RTC->TR);

	if (time)
	{
		time->hour = fromBcd(tr >> RTC_TR_HU_Pos, 2);
		time->min = fromBcd(tr >> RTC_TR_MNU_Pos, 3);
		time->sec = fromBcd(tr, 3);
	}

	if (date)
	{
		date->year = 2000 + fromBcd(dr >> RTC_DR_YU_Pos, 4);
		date->month = fromBcd(dr >> RTC_DR_MU_Pos, 1);
		date->day = fromBcd(dr, 2);			
	}

	if (week)  *week = WeekDay((dr >> RTC_DR_WDU_Pos) & 7);
}
Добавлено after 41 minute:
О, доки на STM32C0 появились.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Вот и у меня примерно такая же огромная портянка получается, разве что деление на 10 через сдвиги, т.к. cortex-m0+
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Ответить

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