|
Приведение типа указателя на элемент структуры |
|
|
|
Oct 17 2012, 10:51
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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 не возмущался?
|
|
|
|
|
 |
Ответов
|
Oct 17 2012, 11:36
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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 же.
|
|
|
|
|
Oct 17 2012, 15:18
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(ViKo @ Oct 17 2012, 14:36)  Для того и вводятся резервные места, ну, как в stm32xxx.h Не надо брать пример с индуистского кода. Правильный ответ(причем, всегда) Код typedef struct { __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ union { __IO uint8_t reg8bit; /*!< CRC Independent data register, Address offset: 0x04 */ uint32_t IDR_space; } IDR; __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ } CRC_TypeDef; Почему у них идеологически не так? Патамушо эти хедеры не для того, чтобы ими пользоваться!
|
|
|
|
|
Oct 17 2012, 17:31
|

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

|
Цитата(_Pasha @ Oct 17 2012, 18:18)  Не надо брать пример с индуистского кода. Правильный ответ(причем, всегда) ... Я тоже кинулся было править stm32f2xx.h, когда увидел, что не могу одной командой установить и сбросить биты в порту. Из-за Код ... __IO uint16_t BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */ __IO uint16_t BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */ // __IO uint32_t BSRR; // GPIO port bit set/reset: 0xRRRRSSSS, Address offset: 0x18 ... } GPIO_TypeDef; Причем, BSRRL отвечает за установку бита, а BSRRH - за сброс. Но при пользовании объединениями в имени регистра появляется дополнительное обозначение, которого не хочу. Поэтому приведение типа указателя для меня более приемлемо. А насчет библиотеки - функциями не пользуюсь. А насчет определения битов - #define меня устраивают. Главное, чтобы код не разбухал.
|
|
|
|
|
Oct 17 2012, 18:22
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(ViKo @ Oct 17 2012, 20:31)  Я тоже кинулся было править stm32f2xx.h, когда увидел, что не могу одной командой установить и сбросить биты в порту. Из-за[кусь] Поэтому приведение типа указателя для меня более приемлемо. Не пойму, кто заремил BSRR, милое дело © Код Inline void pin_set_by_msk(const GPIO_typedef *port, const uint16_t msk, const bool state) { port->BSRR = state?(msk):(msk<<16); } компиляется в минимум,- жаль, редко, когда в две-это при интенсивных операциях -инструкции
Сообщение отредактировал _Pasha - Oct 17 2012, 18:24
|
|
|
|
|
Oct 17 2012, 18:35
|

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

|
Цитата(_Pasha @ Oct 18 2012, 00:22)  Не пойму, кто заремил BSRR, милое дело © Дык, индусы, кто ж ещё  Причём битовые маски оставили как для 32-битного BSRR. (Это для F2xx.) Я всё же такого не стерпел, и переписал это определение. _Pasha, так в каком случае индуистский подход с ручными отступами в структурах может привести к неправильному результату? Или здесь речь чисто об эстетике?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 17 2012, 18:50
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(AHTOXA @ Oct 17 2012, 21:35)  _Pasha, так в каком случае индуистский подход с ручными отступами в структурах может привести к неправильному результату? Или здесь речь чисто об эстетике?  Вообще-то подозрения в выравнивании - не мои. Если MrYuran сталкивался, думаю, он поделится. Хотя, странно -fpack-struct=8 должен бы, как представляется... Я только выразил недоумение по поводу головоломок там, где их быть не должно, при передвижении на круглых колесах, тсз.
Сообщение отредактировал _Pasha - Oct 17 2012, 18:52
|
|
|
|
|
Oct 18 2012, 05:12
|

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

|
Цитата(_Pasha @ Oct 17 2012, 22:50)  Вообще-то подозрения в выравнивании - не мои. Если MrYuran сталкивался, думаю, он поделится. Сталкивался, не то слово. MSPGCC образца 2008 года и iostructures.h Причем, там явно было указано __attribute__ (("packed")) под каждой структурой, однако ж.. После серии необъяснимых чудес пришлось лезть в листинг и сверять адреса регистров. Помогло только -fpack-struct, когда все структуры принудительно упаковывались. После того все переписал на макросы Волкова. Конечно, не так красиво, зато работает железно. Хотя, сейчас поглядел... Код #if defined(__MSP430_HAS_PORT0__) struct port0_t { ioregister_t in; /* Input */ ioregister_t out; /* Output */ ioregister_t dir; /* Direction */ ioregister_t ifg; /* Interrupt Flag */ ioregister_t ies; /* Interrupt Edge Select */ ioregister_t ie; /* Interrupt Enable */ };
__MSP430_EXTERN__ struct port0_t port0 asm("0x0010"); #endif Здесь почему-то упаковки нет.. Странно.. Это в корне меняет дело, а я на компилятор грешил. Но суть то этого не меняется. Автоматически выровненная структура "прореживается" и все адреса сползают.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Oct 18 2012, 06:14
|

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

|
Цитата(MrYuran @ Oct 18 2012, 11:12)  Это в корне меняет дело ... Но суть то этого не меняется. Жжоте Тем не менее. test.c: Код typedef struct { unsigned char a; unsigned char b; }str;
char zzz[1 - 2*(sizeof(str) != 2)]; gcc -c test.c - порядок. avr-gcc -c test.c - порядок. arm-kgp-gcc -c test.c - порядок. arm-none-eabi-gcc -c test.c - порядок. msp430-gcc -c test.c - порядок. Что надо сделать, чтобы "проредило"?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 18 2012, 06:25
|

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

|
Цитата(AHTOXA @ Oct 18 2012, 10:14)  Что надо сделать, чтобы "проредило"? Я не знаю, что надо сделать, но точно знаю теперь, чего не надо.. Не надо использовать такие структуры без принудительной упаковки, во избежание. Мне совершенно было не смешно, когда port1.out.pin3 = 1 махал битами в регистре dir вместо out (а это ещё надо было найти)
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
Сообщений в этой теме
ViKo Приведение типа указателя на элемент структуры Oct 17 2012, 10:51    _Артём_ Цитата(ViKo @ Oct 17 2012, 14:36) Правиль... Oct 17 2012, 11:58     ViKo Цитата(_Артём_ @ Oct 17 2012, 14:58) А на... Oct 17 2012, 12:06      toweroff Цитата(ViKo @ Oct 17 2012, 16:06) *(uint3... Oct 17 2012, 12:12       ViKo Цитата(toweroff @ Oct 17 2012, 15:12) то ... Oct 17 2012, 12:19       _Артём_ Цитата(toweroff @ Oct 17 2012, 15:12) то ... Oct 17 2012, 12:19      _Артём_ Цитата(ViKo @ Oct 17 2012, 15:06) *(uint3... Oct 17 2012, 12:18       ViKo Цитата(_Артём_ @ Oct 17 2012, 15:18) И чт... Oct 17 2012, 12:20     MrYuran Цитата(_Артём_ @ Oct 17 2012, 15:58) А на... Oct 17 2012, 12:43      ViKo Цитата(MrYuran @ Oct 17 2012, 15:43) Вот ... Oct 17 2012, 12:46       MrYuran Цитата(ViKo @ Oct 17 2012, 16:46) Так зап... Oct 17 2012, 12:54        ViKo Цитата(MrYuran @ Oct 17 2012, 15:54) А не... Oct 17 2012, 13:10     _Артём_ Цитата(_Pasha @ Oct 17 2012, 18:18) Патам... Oct 17 2012, 15:44      _Pasha Цитата(_Артём_ @ Oct 17 2012, 18:44) Инте... Oct 17 2012, 16:21       AHTOXA А в каком случае может не сработать индуистский ва... Oct 17 2012, 16:48       Дмитриос Цитата(_Pasha @ Oct 17 2012, 20:21) Я тут... Oct 17 2012, 20:22        _Pasha Цитата(Дмитриос @ Oct 17 2012, 23:22) Про... Oct 17 2012, 20:39         Дмитриос Цитата(_Pasha @ Oct 18 2012, 00:39) STM32... Oct 17 2012, 20:53          _Pasha Цитата(Дмитриос @ Oct 17 2012, 23:53) А р... Oct 17 2012, 21:31       ViKo Цитата(_Pasha @ Oct 17 2012, 21:22) Не по... Oct 17 2012, 18:33         AHTOXA Цитата(_Pasha @ Oct 18 2012, 00:50) Вообщ... Oct 17 2012, 18:59          _Pasha Цитата(AHTOXA @ Oct 17 2012, 21:59) А в ч... Oct 17 2012, 19:17           ViKo Цитата(_Pasha @ Oct 17 2012, 22:17) В дан... Oct 17 2012, 19:20           AHTOXA Цитата(_Pasha @ Oct 18 2012, 01:17) В дан... Oct 18 2012, 03:39            _Pasha Цитата(AHTOXA @ Oct 18 2012, 06:39) Да не... Oct 18 2012, 07:44             ViKo Цитата(_Pasha @ Oct 18 2012, 10:44) Ну не... Oct 18 2012, 07:54              _Pasha Цитата(ViKo @ Oct 18 2012, 10:54) Приведе... Oct 18 2012, 08:43           Палыч Цитата(AHTOXA @ Oct 18 2012, 10:14) Что н... Oct 18 2012, 06:55            esaulenka Цитата(Палыч @ Oct 18 2012, 10:55) Встави... Oct 18 2012, 12:23             _pv Цитата(esaulenka @ Oct 18 2012, 19:23) Ко... Oct 18 2012, 15:51       ViKo Цитата(_Pasha @ Oct 17 2012, 21:22) port-... Oct 17 2012, 18:47        AHTOXA Цитата(ViKo @ Oct 18 2012, 00:47) Это есл... Oct 17 2012, 18:52         ViKo Цитата(AHTOXA @ Oct 17 2012, 21:52) Вообщ... Oct 17 2012, 18:56        _Pasha Цитата(ViKo @ Oct 17 2012, 21:47) Это есл... Oct 17 2012, 18:56 toweroff Ух как у меня все это перекликается... и с volatil... Oct 17 2012, 17:07 toweroff Итак, добавляю
есть две области в ARM968E-S
в пер... Oct 17 2012, 17:47 toweroff Админы, я так понимаю, здесь свой колхоз
я это вс... Oct 17 2012, 18:41 AHTOXA Цитата(MrYuran @ Oct 18 2012, 12:25) Я не... Oct 18 2012, 07:49 Палыч Цитата(AHTOXA @ Oct 18 2012, 11:49) Нет, ... Oct 18 2012, 08:16  AHTOXA Цитата(Палыч @ Oct 18 2012, 14:16) А тепе... Oct 18 2012, 08:45   ReAl Цитата(AHTOXA @ Oct 18 2012, 11:45) Пока ... Oct 18 2012, 14:47    AHTOXA Цитата(ReAl @ Oct 18 2012, 20:47) Там, я ... Oct 18 2012, 16:20     ViKo Цитата(AHTOXA @ Oct 18 2012, 19:20) Можно... Oct 19 2012, 04:41      AHTOXA Цитата(ViKo @ Oct 19 2012, 10:41) Если пр... Oct 19 2012, 04:59       ViKo Цитата(AHTOXA @ Oct 19 2012, 07:59) Какая... Oct 19 2012, 05:49        AHTOXA Цитата(ViKo @ Oct 19 2012, 11:49) Мы же е... Oct 19 2012, 07:31         _Pasha Цитата(AHTOXA @ Oct 19 2012, 10:31) Так в... Oct 19 2012, 09:27 XVR Вообще то компиляторы упаковывают структуры не от ... Oct 18 2012, 08:23 ViKo Цитата(XVR @ Oct 18 2012, 11:23) int :16... Oct 18 2012, 08:27  XVR Цитата(ViKo @ Oct 18 2012, 12:27) лишнееД... Oct 18 2012, 08:47 ViKo К счастью, в железе STM32 адреса устройств уже рас... Oct 19 2012, 09:32 _Pasha Цитата(ViKo @ Oct 19 2012, 12:32) К счаст... Oct 19 2012, 09:57 =GM= Цитата(ViKo @ Oct 17 2012, 09:51) Допусти... Oct 26 2012, 20:10 _Pasha Есть Грабля!
CODEtypedef struct
{
char id[2]... Nov 9 2012, 18:48 Сергей Борщ QUOTE (_Pasha @ Nov 9 2012, 20:48) CODEty... Nov 9 2012, 19:29 AHTOXA Цитата(_Pasha @ Nov 10 2012, 00:48)
Ест... Nov 9 2012, 19:33  _Pasha Цитата(AHTOXA @ Nov 9 2012, 22:33) Да вро... Nov 9 2012, 19:43 ViKo Всплыл вопрос, кажется, подойдет в эту тему.
Созда... Dec 20 2013, 09:45 MrYuran Цитата(ViKo @ Dec 20 2013, 13:45) 1. Что ... Dec 20 2013, 10:35 ig_z QUOTE (ViKo @ Dec 20 2013, 11:45) 2. Как ... Dec 20 2013, 11:05 XVR Цитата(ViKo @ Dec 20 2013, 13:45) 1. Что ... Dec 24 2013, 09:55 Сергей Борщ Цитата(ViKo @ Dec 20 2013, 11:45) В конце... Dec 24 2013, 16:06  AHTOXA Цитата(Сергей Борщ @ Dec 24 2013, 22:06) ... Dec 24 2013, 18:52 ViKo Почитал здесь - http://www.keil.com/support/man/do... Dec 20 2013, 10:44 ViKo Запустил компиляцию с опцией --remarks.
Вижу:
enum... Dec 20 2013, 11:08 PheeL Цитата(ViKo @ Dec 20 2013, 15:08) enum за... Dec 20 2013, 11:14  ViKo Цитата(PheeL @ Dec 20 2013, 14:14) Каждый... Dec 20 2013, 11:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|