stm32 и работа со стуктурами и указателями

Кто любит RISC в жизни, заходим, не стесняемся.
horoc
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Сб янв 24, 2015 21:07:59

Re: stm32 и работа со стуктурами и указателями

Сообщение horoc »

Офтопну :))) , не про указатели!
При работе с памятью, бывает удобно пользоваться union
Например, есть структура Calibrations, в ней переменные с "именами". С помощью union можно обращаться по имени и как к массиву.

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

typedef struct {
	parametr_int SetPoint1;
	parametr_int DacPoint1;
	parametr_int SetPoint2;
	parametr_int DacPoint2;
	parametr_int AdcPoint1;
	parametr_int AdcPoint2;
	} Calibrations;
	
typedef union {
	parametr_int m[sizeof(Calibrations)/sizeof(parametr_int)];
	Calibrations n;
	} uCalibrations;
uCalibrations С1;
C1.n.SetPoint1=2;
C1.m[0]=2;

Еще пример 
typedef union {
	uint8_t u8[2];
	uint16_t u16;
	} data;
data Ds;
Ds.u16=0xEEDD;

uint8_t r;
r=Ds.u8[1];// тот же результат r=0x00FF & (Ds.u16>>8);
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: stm32 и работа со стуктурами и указателями

Сообщение Myp3ik »

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

long y = (long *)(&x)
y - имеет тип long. Из x мы получаем указатель на long. В итоге получается, что в тип long мы присваиваем long* (тип указателя). Компилятор выдаст предупреждение о разности типов.

Должно быть так

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

long *y = (long *)(&x)
Вот из-за таких приколов (даже у опытных программистов) указатели и не любят :)))
Иван Сусанин - первый полупроводник :solder:
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32 и работа со стуктурами и указателями

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

Myp3ik писал(а):Компилятор выдаст предупреждение о разности типов.
Можно написать так :

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

long    y = (long)(&x);
И будет вполне корректная операция, без всяких варнингов.
:)
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: stm32 и работа со стуктурами и указателями

Сообщение YS »

Ну, я вот указатели люблю. :)

Но это очень мощная штука, и этим инструментом надо пользоваться аккуратно и дозированно. Не следует делать сложно, если можно сделать просто.

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

С указателями:

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

uint16_t x;
uint16_t y;

((uint8_t *)(&y))[0] = ((uint8_t *)(&x))[1];
((uint8_t *)(&y))[1] = ((uint8_t *)(&x))[0];
Со сдвигами:

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

uint16_t x;
uint16_t y;

y = ((x & 0x00FF) << 8) | ((x & 0xFF00) >> 8);
Вторая запись гораздо прозрачнее, а главное, будет работать совершенно одинаково где угодно, т.к. порядок доступа к памяти гарантируется самим компилятором. Например, операция

( (x & 0xFF00) >> 8 )

всегда вернет именно старший байт, вне зависимости от того, как они расположены в памяти.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Эиком - электронные компоненты и радиодетали
Sanchosd
Родился
Сообщения: 8
Зарегистрирован: Вт май 04, 2010 22:04:50

Re: stm32 и работа со стуктурами и указателями

Сообщение Sanchosd »

Ух, навалили вы тут...
спасибо за ответы, с интересом почитал, но многое пока неясно мне, но это чисто иоя проблема, умения в С слишком вялые.

YS- не могу понять как тут в профиль зайти к пользователю.. вроде залогинен...
Напишите ссылку свой свой блог.
Пусть почти мертв, но эот не делает информацию из него менее живой.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: stm32 и работа со стуктурами и указателями

Сообщение ARV »

[uquote="Аlex",url="/forum/viewtopic.php?p=3607244#p3607244"]Можно написать так :

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

long    y = (long)(&x);
И будет вполне корректная операция, без всяких варнингов.
:)[/uquote]можно то можно, лишь бы понимать, что именно будет в итоге сделано - то ли, что хотелось? конкретно здесь в переменную y (не являющуюся указателем) будет помещен адрес переменной x
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: stm32 и работа со стуктурами и указателями

Сообщение Myp3ik »

У STM32 поменять байты местами можно еще проще 8)

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

uint16_t x = 0x1234;

x = __REV16(x);

// x = 0x3412;
Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: stm32 и работа со стуктурами и указателями

Сообщение СКАЗОЧНИК »

Что это такое?
__REV16(x)
Станислав
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: stm32 и работа со стуктурами и указателями

Сообщение YS »

можно то можно, лишь бы понимать, что именно будет в итоге сделано - то ли, что хотелось?
Конечно то, что хотелось - варнинг исчезнет! :wink:

:)))
Что это такое?
Встроенная функция CMSIS, дающая доступ к инструкции процессора, которая меняет байты местами.

Вообще, у меня есть сильное ощущение, что современный компилятор, увидев типичный для задачи перестановки байт код, сам подставит нужную инструкцию в ходе оптимизации. Можно проверить, но мне лень. :)

Могу сказать, что я иногда очень изумлялся, глядя дизассемблированный код, сгенерированный AVR-GCC. Мне временами казалось, что компилятор разумен. :shock:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: stm32 и работа со стуктурами и указателями

Сообщение ARV »

YS писал(а):код, сгенерированный AVR-GCC. Мне временами казалось, что компилятор разумен.
ага. а иногда думаешь, что он обкуренный ушлёпок :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: stm32 и работа со стуктурами и указателями

Сообщение YS »

Напишите ссылку свой свой блог.
http://embedderslife.wordpress.com/

https://habr.com/en/users/lamptester/posts/
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: stm32 и работа со стуктурами и указателями

Сообщение СКАЗОЧНИК »

Нашел я про порядок следования байтов в памяти. АРМ архитектура работает по little-endian, младшим вперед (LSB). (также у х86 процов интеловских).
Моторола и ТСР протокол работают наоборот.
Также в АРМ применяется и смешанный порядок...
Последний раз редактировалось СКАЗОЧНИК Ср апр 03, 2019 13:35:08, всего редактировалось 1 раз.
Станислав
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32 и работа со стуктурами и указателями

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

[uquote="ARV",url="/forum/viewtopic.php?p=3607259#p3607259"]лишь бы понимать, что именно будет в итоге сделано - то ли, что хотелось?[/uquote]А мне всегда казалось, что такой подход нужно применять для любого кода, а не только для подобных строчек :)

Да и трудно не понять, что получим в итоге. y объявлен как переменная, и, естественно, работа с ней как с указателем будет невозможна (если не приводить её значение к указателю). Вариантов других не вижу... :dont_know:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: stm32 и работа со стуктурами и указателями

Сообщение ARV »

Аlex писал(а):Вариантов других не вижу...
а я задаю себе вопрос: а зачем простой переменной присваивать адрес другой? это ведь операция, наиболее характерная для переменной-указателя. отсюда и сомнения: а на самом ли деле написавший это хотел поместить адрес в простую переменную, или по ошибке звездочку потерял? :dont_know:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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