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

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


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

Группа: Свой
Сообщений: 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, как я не извращался sm.gif
Единственный вариант, который изменил размер, был вот такой:
Код
typedef struct
{
    unsigned char a __attribute__ ((aligned (8)));
    unsigned char b __attribute__ ((aligned (8)));
}str;

Но этот вариант не страшен, потому что явно указывать alignment там, где он не нужен, мы не будем.

Цитата(_Pasha @ Oct 18 2012, 13:44) *
Дык я это "не то не к тому" унаследовал, пытаясь сказать, что сабжевое приведение - лишняя суета и потенциальный источник проблем.

А, вон оно что! Теперь понялsm.gif


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


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(AHTOXA @ Oct 18 2012, 11:49) *
Нет, ничего из этого не увеличивает размер структуры.
А теперь попробуйте проверить на такой структуре:
Код
typedef struct
{
    unsigned char a;
    unsigned int  b;
    unsigned char c;
}str;
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 18 2012, 08:45
Сообщение #4


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

Группа: Свой
Сообщений: 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-ом)


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


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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 не помогут.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 18 2012, 16:20
Сообщение #6


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

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



Цитата(ReAl @ Oct 18 2012, 20:47) *
Там, я так понял, ещё битовые поля были в подструктурах ioregister_t.
Что-то могло и на этом набежать.

Наверное.
Ну а в результате, какой будет вывод? Можно безбоязненно пользоваться структурами от ST? Или ждать, когда _Pasha сделает базу данных? sm.gif


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


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

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



Цитата(AHTOXA @ Oct 18 2012, 19:20) *
Можно безбоязненно пользоваться структурами от ST?

Если программируем аппаратные средства микроконтроллеров STM32xxx, то используются не структуры, а указатели на типы структур, расположенные по фиксированным адресам.
Если просто пользуемся структурами, подобными предложенным ST, то не все ли равно, как упакованы данные? Куда записали, оттуда и прочитаем.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 19 2012, 04:59
Сообщение #8


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

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



Цитата(ViKo @ Oct 19 2012, 10:41) *
Если программируем аппаратные средства микроконтроллеров STM32xxx, то используются не структуры, а указатели на типы структур, расположенные по фиксированным адресам.

Какая нафиг разница? Если структура вдруг разъедется, то мы промахнёмся мимо нужного регистра и по указателюsm.gif


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


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

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



Цитата(AHTOXA @ Oct 19 2012, 07:59) *
Какая нафиг разница? Если структура вдруг разъедется, то мы промахнёмся мимо нужного регистра и по указателюsm.gif

Как же она разъедется, если указателю передан конкретный адрес! А дыры зарезервированы неиспользуемыми переменными.
P.S. Мы же ее (структуру) уже разъехали разъездили раскатали растянули.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 19 2012, 07:31
Сообщение #10


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

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



Цитата(ViKo @ Oct 19 2012, 11:49) *
Мы же ее (структуру) уже разъехали разъездили раскатали растянули.

Так вот я и выясняю, не может ли она после этого разъехаться ещё большеsm.gif
Представьте, что есть ключ компилятора, который каждый байт в структуре выравнивает на границу слова. С таким ключом всё наше растягивание пойдёт насмарку.


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


;
******

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



Цитата(AHTOXA @ Oct 19 2012, 10:31) *
Так вот я и выясняю, не может ли она после этого разъехаться ещё большеsm.gif
Представьте, что есть ключ компилятора, который каждый байт в структуре выравнивает на границу слова. С таким ключом всё наше растягивание пойдёт насмарку.

Самое простое - не морочить, а заложить где-то assert, только вот что лучше проверять: небось, sizeof какой-то тестовой структуры, не обязательно прям-таки осмысленной и привязанной к реальным портам, но с использованием всех индуистских _IO32 и прочая.
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   Цитата(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


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:48
Рейтинг@Mail.ru


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