Stm32 с чего начать изучение...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Stm32 с чего начать изучение...
оффтоп: я вырос, состоялся и почти состарился на 8-битных МК, а так же на PASCAL, в котором если массив байтный - можно быть на 100500% уверенным, что там будут именно байты, и "словами" туда компилятор никогда сам не полезет. а в Си, с его "вольными стандартами" (и на 32-битах) далеко не факт, что массив переменных short short int будет именно массивом байтов, поскольку компилятор имеет полное право организовать память так, как ему покажется лучше по условиям оптимизации... и я теряюсь.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Stm32 с чего начать изучение...
Ну, на счёт массива байт :
всегда будет байтовым. И компилятор не имеет права делать ячейки другой длины.
Код: Выделить всё
uint8_t arr[16];
Re: Stm32 с чего начать изучение...
Никто вам загадки не загадывает, делать нам больше нечего, только загадки придумывать. Сами сначала изучите, кто и как формирует исполняемый код вашей программы, а потом уже дуйте губёшки и фыркайте.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
........
Добавлено after 4 minutes 34 seconds:
Видимо, то, как работает процессор, вы не поняли.ARV писал(а):PASCAL, в котором если массив байтный - можно быть на 100500% уверенным, что там будут именно байты
То, что вы работаете с байтами, совершенно не означает, что в памяти массив байт займёт ровно столько, сколько байт вы указали при его определении. Это понятно?
А чтобы меньше гундеть не по делу, поставьте Паскаль для STM32 и не мучайте людям мозг.
- linux_rulezz
- Вымогатель припоя
- Сообщения: 584
- Зарегистрирован: Пн сен 15, 2025 08:43:23
- Откуда: Маленький СССР посреди шариатской республики
Re: Stm32 с чего начать изучение...
С этой прагмой pack поаккуратней быть нужно. А то ведь те же Cortex-M0 при попытке обращения к невыровненным данным и в хардфолт уйдут!..
А чтобы посылать ровно столько, сколько нужно, достаточно слать структуру как "send((uint8_t*)&mystruct, 2)". Пусть в ОЗУ лежит выровненная, главное - что она и так двухбайтная.
Ну, а для особо привередливых, можно и так:
Кстати, во всех структурах и подобных типах данных стоит избегать неявных типов вроде int, short и т.п.
P.S. А что за тип bool? Если это "родной" из стандарта C23, то это - тупо char. Лучше все-таки не выпендриваться, а написать uint8_t или uint16_t (ну или даже uint32_t, если там у вас больше 16 флагов).
А чтобы посылать ровно столько, сколько нужно, достаточно слать структуру как "send((uint8_t*)&mystruct, 2)". Пусть в ОЗУ лежит выровненная, главное - что она и так двухбайтная.
Ну, а для особо привередливых, можно и так:
Код: Выделить всё
typedef union{
struct{
uint8_t field0 : 1;
...
uint8_t field15 : 1;
}
uint8_t data[2];
} fields_t;P.S. А что за тип bool? Если это "родной" из стандарта C23, то это - тупо char. Лучше все-таки не выпендриваться, а написать uint8_t или uint16_t (ну или даже uint32_t, если там у вас больше 16 флагов).
Windows must die!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Stm32 с чего начать изучение...
tonyk, Ну что Вы заладили со своей памятью ? Человек же явно сказал, что ему нужно выравнивание полей структуры.
И причём тут процессор и объявление массива байт ? Ну совсем же о другом человек говорит.
И причём тут процессор и объявление массива байт ? Ну совсем же о другом человек говорит.
- linux_rulezz
- Вымогатель припоя
- Сообщения: 584
- Зарегистрирован: Пн сен 15, 2025 08:43:23
- Откуда: Маленький СССР посреди шариатской республики
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Stm32 с чего начать изучение...
Не уйдут. Компилятор учитывает выравнивание.linux_rulezz писал(а):при попытке обращения к невыровненным данным и в хардфолт уйдут!.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Stm32 с чего начать изучение...
[uquote="ARV",url="/forum/viewtopic.php?p=4790328#p4790328"]То есть мой вопрос в итоге сводится к следующему: по умолчанию структура пакуется в минимальное количество байт или для этого надо какие-то опции включить?[/uquote]
Посмотрите пример.
Посмотрите пример.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Stm32 с чего начать изучение...
ну, посмотрел. и какой вывод мне сделать?
что размер структуры определяется наибольшим размером типа её поля? честно говоря, логика этого варианта мне не очень понятна...
или другой? тогда какой?
что размер структуры определяется наибольшим размером типа её поля? честно говоря, логика этого варианта мне не очень понятна...
или другой? тогда какой?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Stm32 с чего начать изучение...
Минимальный размер структуры - 1 байт. Если число битов превысит этот порог, размер структуры увеличится кратно 8 битам или 1 байту
- linux_rulezz
- Вымогатель припоя
- Сообщения: 584
- Зарегистрирован: Пн сен 15, 2025 08:43:23
- Откуда: Маленький СССР посреди шариатской республики
Re: Stm32 с чего начать изучение...
[uquote="Аlex",url="/forum/viewtopic.php?p=4790367#p4790367"]Компилятор учитывает выравнивание.[/uquote]
Уйдут, если явно указать packed! Проверено!
Уйдут, если явно указать packed! Проверено!
Windows must die!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Stm32 с чего начать изучение...
[uquote="Rapra",url="/forum/viewtopic.php?p=4790390#p4790390"]Минимальный размер структуры - 1 байт. Если число битов превысит этот порог, размер структуры увеличится кратно 8 битам или 1 байту[/uquote]
это так не всегда. именно из-за этого "не всегда" я и задаю тут вопросы
это так не всегда. именно из-за этого "не всегда" я и задаю тут вопросы
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Stm32 с чего начать изучение...
Не берусь судить за все компиляторы и архитектуры, но стоит попробовать рибуты aligned с разным размером выравнивания и packed.
А в архитектуре АРМ вообще нет труъ-битовых инструкций. Они как бы есть, но работают иначе.
А в архитектуре АРМ вообще нет труъ-битовых инструкций. Они как бы есть, но работают иначе.
Re: Stm32 с чего начать изучение...
[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-ти ног.
Нет. Bool, true и false в C23 - ключевые слова. Просвещайтесь: Modern C, хотя, конечно, лучше сразу C++ учить )
ps. Всплыла инфа про новые бюджетные STM32C5... 40nm, 144MHz Cortex-M33, в корпусах от 20-ти ног.
Re: Stm32 с чего начать изучение...
Но физически bool имеет размерность минимально адресуемой величины, то есть, 1 байт. Поскольку 1 бит адресовать не получится. Ну с в остальном bool довольно неплохо смотрится с точки зрения восприятия. False - это 0, true - это не 0.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Stm32 с чего начать изучение...
хоть это не в тему, но физическая реализация bool, по моему скромному мнению, должна быть отдана на усмотрение компилятора.
[не]боюсь прослыть профаном, но, как мне представляется, в ARM доступ к байту на самом деле есть доступ к 32 битам с маскированием старших 24-x... и никакой разницы в размерах bool нет (и быть не должно). имхо
[не]боюсь прослыть профаном, но, как мне представляется, в ARM доступ к байту на самом деле есть доступ к 32 битам с маскированием старших 24-x... и никакой разницы в размерах bool нет (и быть не должно). имхо
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Stm32 с чего начать изучение...
В АРМах доступ к байту возможен - есть побайтовые инструкции. Хотя внутренние регистры ядра все 32-битные
А bool действительно должен иметь минимально возможный алресуемый размер, поскольку у него всего два состояния - true и false.
А bool действительно должен иметь минимально возможный алресуемый размер, поскольку у него всего два состояния - true и false.
- linux_rulezz
- Вымогатель припоя
- Сообщения: 584
- Зарегистрирован: Пн сен 15, 2025 08:43:23
- Откуда: Маленький СССР посреди шариатской республики
Re: Stm32 с чего начать изучение...
[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!
Однако, они задают ТИП данных. И этот тип - 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!
Re: Stm32 с чего начать изучение...
[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4790788#p4790788"]Однако, они задают ТИП данных. И этот тип - char![/uquote]
Этот тип - bool! Даже старый _Bool не являлся псевдонимом для char:
Этот код выведет 1, а для char было бы 11.
Этот тип - bool! Даже старый _Bool не являлся псевдонимом для char:
Код: Выделить всё
_Bool a = 10;
printf("%i", ++a);Re: Stm32 с чего начать изучение...
[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4790788#p4790788"]// презираю тех, кто ввел дебильные "true/false/bool"[/uquote]
Фуууу
Басню "Обезьяна и очки" Крылов не про вас ли писал, случаем? 
очень даже наглядно и логично.
А как бы это выглядело с интом:
Попробуйте догадаться, переменная endPosition обозначает именно значение в единицах измерения, или же обозначает просто факт достижения конечного положения?
Так что тип bool - штука полезная для читаемости и логичности кода. Без нее пришлось бы прописывать отдельные дефайны #define FALSE 0 и #define TRUE !FALSE
Фуууу
Код: Выделить всё
bool endPosition;
if(GetPosition() == 50) endPosition = true;
else endPosition = false;
А как бы это выглядело с интом:
Код: Выделить всё
int endPosition;
if(GetPosition() == 50) endPosition = 1;
else endPosition = 0;
Так что тип bool - штука полезная для читаемости и логичности кода. Без нее пришлось бы прописывать отдельные дефайны #define FALSE 0 и #define TRUE !FALSE