|
Приведение типа указателя на элемент структуры |
|
|
|
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 18 2012, 07:49
|

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

|
Цитата(MrYuran @ Oct 18 2012, 12:25)  Я не знаю, что надо сделать, но точно знаю теперь, чего не надо.. Не надо использовать такие структуры без принудительной упаковки, во избежание. Мне совершенно было не смешно, когда port1.out.pin3 = 1 махал битами в регистре dir вместо out (а это ещё надо было найти) Скорее всего был локальный глюк какой-то конкретной версии mspgcc. Хотя принудительная упаковка - дело несложное, можно и её добавить, для пущей уверенности. Цитата(Палыч @ Oct 18 2012, 12:55)  Вставить #pragma pack(n) или указать транслятору -fpack-struct=n cо значением n отличным от 1. К сожалению, в документации на gcc нигде нет упоминания: какое значение n (величина выравнивания) принято "по-умолчанию"... Нет, ничего из этого не увеличивает размер структуры. Проверил и с #pragma pack(x), и с -fpack-struct=x (x={4,8,16,32}), и с ними обоими одновременно. До кучи проверил __attribute__ ((packed)) и __attribute__ ((aligned (x))) для типа. Размер структуры равен 2, как я не извращался  Единственный вариант, который изменил размер, был вот такой: Код typedef struct { unsigned char a __attribute__ ((aligned (8))); unsigned char b __attribute__ ((aligned (8))); }str; Но этот вариант не страшен, потому что явно указывать alignment там, где он не нужен, мы не будем. Цитата(_Pasha @ Oct 18 2012, 13:44)  Дык я это "не то не к тому" унаследовал, пытаясь сказать, что сабжевое приведение - лишняя суета и потенциальный источник проблем. А, вон оно что! Теперь понял
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 18 2012, 08:45
|

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

|
Цитата(Палыч @ Oct 18 2012, 14:16)  А теперь попробуйте проверить на такой структуре: Да, но речь шла о структурах, уже имеющих вручную сформированные отступы, типа такой: Код typedef struct { uint8_t a; uint8_t padder1; // - отступ uint16_t b; uint16_t padder2; // - отступ uint32_t c; }str; Такие структуры используются, в частности, в заголовочных файлах от ST для описания периферии процессоров STM32. И меня интересует вопрос, могут ли такие структуры при каких-либо условиях перестать соответствовать описываемой ими периферии. Пока получается, что всё нормально, соответствуют при любых ключах компиляции. (Ну, кроме непонятного случая, описанного MrYuran-ом)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 18 2012, 14:47
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(AHTOXA @ Oct 18 2012, 11:45)  Пока получается, что всё нормально, соответствуют при любых ключах компиляции. (Ну, кроме непонятного случая, описанного MrYuran-ом) Там, я так понял, ещё битовые поля были в подструктурах ioregister_t. Что-то могло и на этом набежать. Скажем, Код typedef { unsigned f : 1; } flag_t;
typedef { flag_t a; flag_t b; } flags2_t; структура flags2_t займёт 2*sizeof(unsigned), а не один байт. Причём никакие pack не помогут.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 19 2012, 04:41
|

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

|
Цитата(AHTOXA @ Oct 18 2012, 19:20)  Можно безбоязненно пользоваться структурами от ST? Если программируем аппаратные средства микроконтроллеров STM32xxx, то используются не структуры, а указатели на типы структур, расположенные по фиксированным адресам. Если просто пользуемся структурами, подобными предложенным ST, то не все ли равно, как упакованы данные? Куда записали, оттуда и прочитаем.
|
|
|
|
|
Oct 19 2012, 09:27
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(AHTOXA @ Oct 19 2012, 10:31)  Так вот я и выясняю, не может ли она после этого разъехаться ещё больше  Представьте, что есть ключ компилятора, который каждый байт в структуре выравнивает на границу слова. С таким ключом всё наше растягивание пойдёт насмарку. Самое простое - не морочить, а заложить где-то assert, только вот что лучше проверять: небось, sizeof какой-то тестовой структуры, не обязательно прям-таки осмысленной и привязанной к реальным портам, но с использованием всех индуистских _IO32 и прочая.
|
|
|
|
Сообщений в этой теме
ViKo Приведение типа указателя на элемент структуры Oct 17 2012, 10:51 AHTOXA *(uint16_t*)&Dev.A = 0x55AA; Oct 17 2012, 11:11 ViKo Цитата(AHTOXA @ Oct 17 2012, 14:11) *(uin... Oct 17 2012, 11:20  AHTOXA Но это хак, работоспособность которого зависит от ... Oct 17 2012, 11:27   ViKo Цитата(AHTOXA @ Oct 17 2012, 14:27) Но эт... Oct 17 2012, 11:36    _Артём_ Цитата(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 Цитата(ViKo @ Oct 17 2012, 14:36) Для тог... Oct 17 2012, 15:18     _Артём_ Цитата(_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, 18:18) Не на... Oct 17 2012, 17:31      _Pasha Цитата(ViKo @ Oct 17 2012, 20:31) Я тоже ... Oct 17 2012, 18:22       ViKo Цитата(_Pasha @ Oct 17 2012, 21:22) Не по... Oct 17 2012, 18:33       AHTOXA Цитата(_Pasha @ Oct 18 2012, 00:22) Не по... Oct 17 2012, 18:35        _Pasha Цитата(AHTOXA @ Oct 17 2012, 21:35) _Pash... Oct 17 2012, 18:50         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         MrYuran Цитата(_Pasha @ Oct 17 2012, 22:50) Вообщ... Oct 18 2012, 05:12          AHTOXA Цитата(MrYuran @ Oct 18 2012, 11:12) Это ... Oct 18 2012, 06:14           MrYuran Цитата(AHTOXA @ Oct 18 2012, 10:14) Что н... Oct 18 2012, 06:25           Палыч Цитата(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 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
|
|
|