реклама на сайте
подробности

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Приведение типа указателя на элемент структуры
ViKo
сообщение Oct 17 2012, 10:51
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Допустим, имеется структура из байтов. Хочу инициализировать сразу 2 байта 16-битовым числом, или сразу 4 байта 32-битовым числом. Привожу указатель к нужному типу.
Код
typedef struct {
  __IO uint8_t A;
  __IO uint8_t B;
  uint16_t RES;
} DEV_t;

  DEV_t Dev;
  DEV_t *pDev = &Dev;

  pDev->A = 0x55;
  pDev->B = 0xAA;
  (uint16_t)pDev->A = 0x3333;
  (uint32_t)pDev->A = 0x01234567;


Код работает. Но Keil выдает предупреждения:
source\Exercises.c(117): warning: #1441-D: nonstandard cast on lvalue
Есть ли способ написать так, чтобы Keil не возмущался?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 17 2012, 11:11
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



*(uint16_t*)&Dev.A = 0x55AA;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 17 2012, 11:20
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Oct 17 2012, 14:11) *
*(uint16_t*)&Dev.A = 0x55AA;

Да, так работает без предупреждений.
И без специально созданного указателя. sm.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 17 2012, 11:27
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Но это хак, работоспособность которого зависит от выравнивания элементов структуры. Надо по крайней мере комментарий про это написать рядышкомsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 17 2012, 11:36
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Oct 17 2012, 14:27) *
Но это хак, работоспособность которого зависит от выравнивания элементов структуры. Надо по крайней мере комментарий про это написать рядышком

Для того и вводятся резервные места, ну, как в stm32xxx.h
Код
typedef struct
{
  __IO uint32_t DR;         /*!< CRC Data register,             Address offset: 0x00 */
  __IO uint8_t  IDR;        /*!< CRC Independent data register, Address offset: 0x04 */
  uint8_t       RESERVED0;  /*!< Reserved, 0x05                                      */
  uint16_t      RESERVED1;  /*!< Reserved, 0x06                                      */
  __IO uint32_t CR;         /*!< CRC Control register,          Address offset: 0x08 */
} CRC_TypeDef;

По такой аналогии и создавал. Правильное заполнение структуры будет обеспечено, а обращение возможно по любому (невыровненному) адресу. Cortex-M3 же.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 11:58
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ViKo @ Oct 17 2012, 14:36) *
Правильное заполнение структуры будет обеспечено, а обращение возможно по любому (невыровненному) адресу. Cortex-M3 же.

А на каких архитектурах при таком обращении возникнут проблемы (и какие)?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 17 2012, 12:06
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(_Артём_ @ Oct 17 2012, 14:58) *
А на каких архитектурах при таком обращении возникнут проблемы (и какие)?

*(uint32_t *) &Dev.B = 0x02468ACE;
для ARM7. обращение по невыровненому адресу.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 17 2012, 12:12
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(ViKo @ Oct 17 2012, 16:06) *
*(uint32_t *) &Dev.B = 0x02468ACE;
для ARM7. обращение по невыровненому адресу.

то есть перед объявлением добавляем __packed?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 12:18
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ViKo @ Oct 17 2012, 15:06) *
*(uint32_t *) &Dev.B = 0x02468ACE;
для ARM7. обращение по невыровненому адресу.

И что будет ? HardFault?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 17 2012, 12:19
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(toweroff @ Oct 17 2012, 15:12) *
то есть перед объявлением добавляем __packed?

У меня Cortex-M3, ничего не добавляю, и так хорошо. laughing.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 12:19
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(toweroff @ Oct 17 2012, 15:12) *
то есть перед объявлением добавляем __packed?

Без packed компилятор сам выравняет?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 17 2012, 12:20
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(_Артём_ @ Oct 17 2012, 15:18) *
И что будет ? HardFault?

А то! sm.gif
http://www.google.by/webhp?rlz=1C1GGGE_ruB...745&bih=925

Добавлю. Мне не нужно "утрамбовать" структуру. Наоборот, я описываю в структуре регистры внешнего устройства, в частности, контроллера ЖКИ. С расположением регистров по конкретным адресам. Все, как в упомянутой stm32xxx.h. А обращаться хочу не только по байтам, но и целыми словами.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 17 2012, 12:43
Сообщение #13


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(_Артём_ @ Oct 17 2012, 15:58) *
А на каких архитектурах при таком обращении возникнут проблемы (и какие)?

На многих, отличных от 8 бит.
Например, MSP430. По умолчанию выравнивание по границе слова.
Выровненный char займет 2 байта, старший байт 16р инициализатора вместо второго чара улетит в пустоту

Цитата(ViKo @ Oct 17 2012, 16:20) *
я описываю в структуре регистры внешнего устройства, в частности, контроллера ЖКИ.

Вот в таком случае аттрибут упаковки строго обязателен.
Иначе такие чудеса могут начаться..
Пишешь байт в один регистр, а он улетает в соседний или через несколько

Конечно, не ваш конкретный случай, но все же


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 17 2012, 12:46
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(MrYuran @ Oct 17 2012, 15:43) *
Вот в таком случае аттрибут упаковки строго обязателен.
Иначе такие чудеса могут начаться..
Пишешь байт в один регистр, а он улетает в соседний или через несколько

Так заполняю же все адреса подряд! RESERVED вставляю во все дыры! sm.gif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 17 2012, 12:54
Сообщение #15


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ViKo @ Oct 17 2012, 16:46) *
Так заполняю же все адреса подряд! RESERVED вставляю во все дыры! sm.gif

А неважно.
Выровняет по границе машинного слова (16/32/64) - и все ваши RESERVED превратятся в дополнительные 16/32/64р "дыры"
Очень аккуратно нужно действовать, иначе наколоться можно очень неприятно.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

6 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01525 секунд с 7
ELECTRONIX ©2004-2016