Stm32 с чего начать изучение...

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Stm32 с чего начать изучение...

Сообщение ARV »

оффтоп: я вырос, состоялся и почти состарился на 8-битных МК, а так же на PASCAL, в котором если массив байтный - можно быть на 100500% уверенным, что там будут именно байты, и "словами" туда компилятор никогда сам не полезет. а в Си, с его "вольными стандартами" (и на 32-битах) далеко не факт, что массив переменных short short int будет именно массивом байтов, поскольку компилятор имеет полное право организовать память так, как ему покажется лучше по условиям оптимизации... и я теряюсь.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Re: Stm32 с чего начать изучение...

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

Ну, на счёт массива байт :

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

uint8_t   arr[16];
всегда будет байтовым. И компилятор не имеет права делать ячейки другой длины.
tonyk
Это не хвост, это антенна
Сообщения: 1305
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: Stm32 с чего начать изучение...

Сообщение tonyk »

ARV писал(а):так и будете загадки мне загадывать?
Никто вам загадки не загадывает, делать нам больше нечего, только загадки придумывать. Сами сначала изучите, кто и как формирует исполняемый код вашей программы, а потом уже дуйте губёшки и фыркайте.
Вот вы просите компилятор упаковать структуру в два байта (Alex):

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

#pragma pack(push, 2)

typedef struct{
  bool fld1 : 1;
  bool fld2 : 1;
} my_struct;

#pragma pack(pop)
А вот фрагмент скрипта линкёра одного из моих проектов:

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

SECTIONS
{
  .bkpsram :
  {
    . = ALIGN(1);
    KEEP(*(.bkpsram))
    . = ALIGN(4);
  } >BKPSRAM

......
  .plc_params :
  {
    . = ALIGN(2);
    
    KEEP (*(.plc_params))
                    
    /*. = ALIGN(2);*/
  } >SECTOR_1_2
........
В зависимости от того, в какой сегмент вы укажите линковщику положить вашу структуру, займёт она в памяти 2 или 4 байта.

Добавлено after 4 minutes 34 seconds:
ARV писал(а):PASCAL, в котором если массив байтный - можно быть на 100500% уверенным, что там будут именно байты
Видимо, то, как работает процессор, вы не поняли.
То, что вы работаете с байтами, совершенно не означает, что в памяти массив байт займёт ровно столько, сколько байт вы указали при его определении. Это понятно?
А чтобы меньше гундеть не по делу, поставьте Паскаль для STM32 и не мучайте людям мозг.
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Stm32 с чего начать изучение...

Сообщение linux_rulezz »

С этой прагмой pack поаккуратней быть нужно. А то ведь те же Cortex-M0 при попытке обращения к невыровненным данным и в хардфолт уйдут!..
А чтобы посылать ровно столько, сколько нужно, достаточно слать структуру как "send((uint8_t*)&mystruct, 2)". Пусть в ОЗУ лежит выровненная, главное - что она и так двухбайтная.
Ну, а для особо привередливых, можно и так:

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

typedef union{
 struct{
    uint8_t field0 : 1;
    ...
    uint8_t field15 : 1;
 }
 uint8_t data[2];
} fields_t;
Кстати, во всех структурах и подобных типах данных стоит избегать неявных типов вроде int, short и т.п.

P.S. А что за тип bool? Если это "родной" из стандарта C23, то это - тупо char. Лучше все-таки не выпендриваться, а написать uint8_t или uint16_t (ну или даже uint32_t, если там у вас больше 16 флагов).
Windows must die!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Stm32 с чего начать изучение...

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

tonyk, Ну что Вы заладили со своей памятью ? Человек же явно сказал, что ему нужно выравнивание полей структуры.
И причём тут процессор и объявление массива байт ? Ну совсем же о другом человек говорит.
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Stm32 с чего начать изучение...

Сообщение linux_rulezz »

Вот, например: флаги на 1 байт.
Windows must die!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Stm32 с чего начать изучение...

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

linux_rulezz писал(а):при попытке обращения к невыровненным данным и в хардфолт уйдут!.
Не уйдут. Компилятор учитывает выравнивание.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Stm32 с чего начать изучение...

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=4790328#p4790328"]То есть мой вопрос в итоге сводится к следующему: по умолчанию структура пакуется в минимальное количество байт или для этого надо какие-то опции включить?[/uquote]
Посмотрите пример.
Изображение
изображение_2026-02-18_143509290.png
(94.19 КБ) 258 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Stm32 с чего начать изучение...

Сообщение ARV »

ну, посмотрел. и какой вывод мне сделать?
что размер структуры определяется наибольшим размером типа её поля? честно говоря, логика этого варианта мне не очень понятна...
или другой? тогда какой?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Rapra
Грызет канифоль
Сообщения: 259
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Stm32 с чего начать изучение...

Сообщение Rapra »

Минимальный размер структуры - 1 байт. Если число битов превысит этот порог, размер структуры увеличится кратно 8 битам или 1 байту
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Stm32 с чего начать изучение...

Сообщение linux_rulezz »

[uquote="Аlex",url="/forum/viewtopic.php?p=4790367#p4790367"]Компилятор учитывает выравнивание.[/uquote]
Уйдут, если явно указать packed! Проверено!
Windows must die!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Stm32 с чего начать изучение...

Сообщение ARV »

[uquote="Rapra",url="/forum/viewtopic.php?p=4790390#p4790390"]Минимальный размер структуры - 1 байт. Если число битов превысит этот порог, размер структуры увеличится кратно 8 битам или 1 байту[/uquote]
это так не всегда. именно из-за этого "не всегда" я и задаю тут вопросы
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Rapra
Грызет канифоль
Сообщения: 259
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Stm32 с чего начать изучение...

Сообщение Rapra »

Не берусь судить за все компиляторы и архитектуры, но стоит попробовать рибуты aligned с разным размером выравнивания и packed.
А в архитектуре АРМ вообще нет труъ-битовых инструкций. Они как бы есть, но работают иначе.
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Stm32 с чего начать изучение...

Сообщение Adrift »

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4790362#p4790362"]P.S. А что за тип bool? Если это "родной" из стандарта C23, то это - тупо char.[/uquote]
Нет. Bool, true и false в C23 - ключевые слова. Просвещайтесь: Modern C, хотя, конечно, лучше сразу C++ учить )

ps. Всплыла инфа про новые бюджетные STM32C5... 40nm, 144MHz Cortex-M33, в корпусах от 20-ти ног.
Rapra
Грызет канифоль
Сообщения: 259
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Stm32 с чего начать изучение...

Сообщение Rapra »

Но физически bool имеет размерность минимально адресуемой величины, то есть, 1 байт. Поскольку 1 бит адресовать не получится. Ну с в остальном bool довольно неплохо смотрится с точки зрения восприятия. False - это 0, true - это не 0.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Stm32 с чего начать изучение...

Сообщение ARV »

хоть это не в тему, но физическая реализация bool, по моему скромному мнению, должна быть отдана на усмотрение компилятора.
[не]боюсь прослыть профаном, но, как мне представляется, в ARM доступ к байту на самом деле есть доступ к 32 битам с маскированием старших 24-x... и никакой разницы в размерах bool нет (и быть не должно). имхо
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Rapra
Грызет канифоль
Сообщения: 259
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Stm32 с чего начать изучение...

Сообщение Rapra »

В АРМах доступ к байту возможен - есть побайтовые инструкции. Хотя внутренние регистры ядра все 32-битные
А bool действительно должен иметь минимально возможный алресуемый размер, поскольку у него всего два состояния - true и false.
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Stm32 с чего начать изучение...

Сообщение linux_rulezz »

[uquote="Adrift",url="/forum/viewtopic.php?p=4790656#p4790656"]Bool, true и false в C23 - ключевые слова.[/uquote]
Однако, они задают ТИП данных. И этот тип - char!
// презираю тех, кто ввел дебильные "true/false/bool" в C23! Из-за этих тридварасов приходится отдельно для чужих библиотек флаги выставлять -std=gnu99.
В C вообще нафиг тип bool не вперся, т.к. есть старый добрый int! Ну или uint8_t…

Добавлено after 1 minute 27 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=4790769#p4790769"]в ARM доступ к байту на самом деле есть доступ к 32 битам с маскированием старших 24-x...[/uquote]
Нет. Если бы это было так, то uint8_t[10] занимала бы не 10 (12) байт, а 40!
Windows must die!
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Stm32 с чего начать изучение...

Сообщение Adrift »

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4790788#p4790788"]Однако, они задают ТИП данных. И этот тип - char![/uquote]
Этот тип - bool! Даже старый _Bool не являлся псевдонимом для char:

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

_Bool a = 10;
printf("%i", ++a);
Этот код выведет 1, а для char было бы 11.
Rapra
Грызет канифоль
Сообщения: 259
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Stm32 с чего начать изучение...

Сообщение Rapra »

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4790788#p4790788"]// презираю тех, кто ввел дебильные "true/false/bool"[/uquote]
Фуууу :)) Басню "Обезьяна и очки" Крылов не про вас ли писал, случаем? :))

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

bool endPosition;
if(GetPosition() == 50) endPosition = true;
else endPosition = false;
очень даже наглядно и логично.
А как бы это выглядело с интом:

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

int endPosition;
if(GetPosition() == 50) endPosition = 1;
else endPosition = 0;
Попробуйте догадаться, переменная endPosition обозначает именно значение в единицах измерения, или же обозначает просто факт достижения конечного положения?
Так что тип bool - штука полезная для читаемости и логичности кода. Без нее пришлось бы прописывать отдельные дефайны #define FALSE 0 и #define TRUE !FALSE
Ответить

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