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

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

Сообщение ARV »

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

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

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

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

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

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

Сообщение 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 и не мучайте людям мозг.
Вымогатель припоя
Аватара пользователя
Сообщения: 674
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Сообщение 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!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение linux_rulezz »

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

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

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

Сообщение VladislavS »

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

Сообщение ARV »

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

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

Сообщение Rapra »

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

Сообщение linux_rulezz »

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

Сообщение ARV »

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

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

Сообщение Rapra »

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

Сообщение 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-ти ног.
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

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

Сообщение ARV »

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

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

Сообщение Rapra »

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

Сообщение 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!
Контактная информация:
Вымогатель припоя
Сообщения: 556
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение 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.
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение 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»