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

 
 
> Приведение типа указателя на элемент структуры
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
 
Start new topic
Ответов
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
_Pasha
сообщение Oct 17 2012, 15:18
Сообщение #6


;
******

Группа: Участник
Сообщений: 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;


Почему у них идеологически не так? Патамушо эти хедеры не для того, чтобы ими пользоваться! sm.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 17 2012, 17:31
Сообщение #7


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

Группа: Модераторы
Сообщений: 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 меня устраивают.
Главное, чтобы код не разбухал.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 17 2012, 18:22
Сообщение #8


;
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 17 2012, 18:35
Сообщение #9


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

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



Цитата(_Pasha @ Oct 18 2012, 00:22) *
Не пойму, кто заремил BSRR, милое дело ©

Дык, индусы, кто ж ещёsm.gif Причём битовые маски оставили как для 32-битного BSRR. (Это для F2xx.)
Я всё же такого не стерпел, и переписал это определение.
_Pasha, так в каком случае индуистский подход с ручными отступами в структурах может привести к неправильному результату? Или здесь речь чисто об эстетике? sm.gif


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


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(AHTOXA @ Oct 17 2012, 21:35) *
_Pasha, так в каком случае индуистский подход с ручными отступами в структурах может привести к неправильному результату? Или здесь речь чисто об эстетике? sm.gif

Вообще-то подозрения в выравнивании - не мои. Если MrYuran сталкивался, думаю, он поделится.
Хотя, странно -fpack-struct=8 должен бы, как представляется...
Я только выразил недоумение по поводу головоломок там, где их быть не должно, при передвижении на круглых колесах, тсз.sm.gif

Сообщение отредактировал _Pasha - Oct 17 2012, 18:52
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 18 2012, 05:12
Сообщение #11


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

Группа: Свой
Сообщений: 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 =)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 18 2012, 06:14
Сообщение #12


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

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



Цитата(MrYuran @ Oct 18 2012, 11:12) *
Это в корне меняет дело
...
Но суть то этого не меняется.

Жжоте biggrin.gif
Тем не менее. 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 - порядок.

Что надо сделать, чтобы "проредило"?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 18 2012, 06:25
Сообщение #13


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

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



Цитата(AHTOXA @ Oct 18 2012, 10:14) *
Что надо сделать, чтобы "проредило"?

Я не знаю, что надо сделать, но точно знаю теперь, чего не надо..
Не надо использовать такие структуры без принудительной упаковки, во избежание.
Мне совершенно было не смешно, когда port1.out.pin3 = 1 махал битами в регистре dir вместо out (а это ещё надо было найти)


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

Сообщений в этой теме
- ViKo   Приведение типа указателя на элемент структуры   Oct 17 2012, 10:51
- - AHTOXA   *(uint16_t*)&Dev.A = 0x55AA;   Oct 17 2012, 11:11
|- - _Артём_   Цитата(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


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

 


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


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