|
Приведение типа указателя на элемент структуры |
|
|
|
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 не возмущался?
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Oct 17 2012, 13:10
|

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

|
Цитата(MrYuran @ Oct 17 2012, 15:54)  А неважно. Выровняет по границе машинного слова (16/32/64) - и все ваши RESERVED превратятся в дополнительные 16/32/64р "дыры" Не выравняет.  Потому что имеется следующий код. Код typedef struct { __I uint8_t RCR; //<! Revision Code Register, 0x00 __I uint8_t DBSR; //<! Dislpay Buffer Size Register, 0x01 __I uint8_t CRR; //<! Configuration Readback Register, 0x02 } ReadOnlyConf_t; //<! Read-Only Configuration Registers
typedef struct { __IO uint8_t MCCR; //<! Memory Clock Configuration Register, 0x04 __IO uint8_t PCCR; //<! Pixel Clock Configuration Register, 0x05 } ClockConf_t; //<! Clock Configuration Registers ...
#define DPYCTRL_BASE ((uint32_t)0x6C000000) //<! Dysplay base address #define S1DREGS_BASE DPYCTRL_BASE //<! S1D13706 registers base
#define READONLYCONF_BASE S1DREGS_BASE #define CLOCKCONF_BASE S1DREGS_BASE + 0x04 #define LOOKUPTABLE_BASE S1DREGS_BASE + 0x08 ... #define READONLYCONF ((ReadOnlyConf_t *) READONLYCONF_BASE) #define CLOCKCONF ((ClockConf_t *) CLOCKCONF_BASE) #define LOOKUPTABLE ((LookUpTable_t *) LOKUPTABLE_BASE) ... А дальше - обращения по указателям...
|
|
|
|
|
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, 16:21
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(_Артём_ @ Oct 17 2012, 18:44)  Интересно, а чем же пользоваться? Самому хидеры на процы делать? Я тут давеча психанул и наваял по означенному выше принципу. Ессно, только структуры, без всяких функций сомнительного сервиса. Но у проекта, который сейчас пилю, уже поезд ушел, тестинг откладывается. Странно, но LPC такой ненависти не вызывают. Очень странно...  Вообще, я там сильно повыделывался - дал битовым полям осмысленные имена... там по-хорошему надо двуязычие, тоже на основе union{}- с сохранением мнемоники и с сохранением смысла... этот момент разрулю - будет тыщи три строк. И вроде бы взять да и сделать базу в libreoffice base, чтоб генерило то,что надо... блин, лень забадала.
Сообщение отредактировал _Pasha - Oct 17 2012, 16:27
|
|
|
|
|
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, 17:47
|

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

|
Итак, добавляю  есть две области в ARM968E-S в первой висит 16-битный супресс USB, во второй - NOR Flash Читается/пишется в первую область только по/из фиксированным адресам Во вторую - и так, и с инкрементом оптимизация компилятора в Time и O3 Шины. 1-я с супрессом - 16бит, 2-я - 32 бит Что-то фигню наблюдаю Первая область объявлена как Код #define FX2_FIFO2 (*(volatile unsigned int *)(FX2_BASE_ADDR + (0x00UL<<2))) #define FX2_FIFO4 (*(volatile unsigned int *)(FX2_BASE_ADDR + (0x02UL<<2))) вторая - также через volatile, но в своем диапазоне Доступ к памяти осцилл показывает и, судя по тестам, точно как и надо А вот данные - не пойми чего Для пересылки и сокращения доступа к той и другой области памяти попробовал сделать union с тремя полями - U16, U16 и U32 Например, чтение из первой области - в две U16 подряд, потом из U32 - в другую область запись Шаманство  Не работает
|
|
|
|
|
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:33
|

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

|
Цитата(_Pasha @ Oct 17 2012, 21:22)  Не пойму, кто заремил BSRR, милое дело © Я же и закомментировал. Сам приписал, сам убрал. Когда возникла дилемма - или писать всегда по 32 бита, или писать, когда надо, по 16-битов. В-общем, надо было иметь и ту, и другую возможность. А union ... уже говорил ... А *(uint32_t *) &GPIOB.BSRRL - то шо надо!
|
|
|
|
|
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
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|