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

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

|
Цитата(_Pasha @ Oct 18 2012, 00:50)  Вообще-то подозрения в выравнивании - не мои. Если MrYuran сталкивался, думаю, он поделится. А в чём тогда "правильность" кода с union-ами? Цитата(_Pasha @ Oct 18 2012, 00:50)  Хотя, странно -fpack-struct=8 должен бы, как представляется... Как я понял, -fpack-struct[=x] может только сильнее упаковать структуру. Проредить её может __attribute__ ((aligned (x))). Но его нужно явно указывать для члена структуры, случайно так не сделать.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 17 2012, 19:17
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(AHTOXA @ Oct 17 2012, 21:59)  А в чём тогда "правильность" кода с union-ами? В данном случае - чисто йуридически Цитата warning: #1441-D: nonstandard cast on lvalue Где оно выползет боком - фантазии не хватает представить. Для АРМов сумасшедшие компиляторы а-ля CodeVision для АВРок - существуют? Если бы были - там бы и повылезло.
Сообщение отредактировал _Pasha - Oct 17 2012, 19:20
|
|
|
|
|
Oct 17 2012, 20:22
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 22-04-10
Пользователь №: 56 826

|
Цитата(_Pasha @ Oct 17 2012, 20:21)  Я тут давеча психанул и наваял по означенному выше принципу. Ессно, только структуры, без всяких функций сомнительного сервиса. Но у проекта, который сейчас пилю, уже поезд ушел, тестинг откладывается. Простите а вот под какой контроллер вы так сделали?
|
|
|
|
|
Oct 17 2012, 20:53
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 22-04-10
Пользователь №: 56 826

|
Цитата(_Pasha @ Oct 18 2012, 00:39)  STM32f100 Но, сделал - и пожалел. Надо сразу базу данных заводить и оттуда генерить. Писанина - плохой стиль. А разве производитель CMSIS ные либы со структурами не создаёт для регистров данного контроллера или у Вас свои какие-то структуры?
|
|
|
|
|
Oct 18 2012, 03:39
|

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

|
Цитата(_Pasha @ Oct 18 2012, 01:17)  В данном случае - чисто йуридически Да нет же, я не об этом!  Там ViKo просто не то не к тому привёл. Я вот о чём. Чем ваш вариант Код typedef struct { __IO uint32_t DR; union { __IO uint8_t reg8bit; uint32_t IDR_space; } IDR; __IO uint32_t CR; } CRC_TypeDef; лучше индуистского варианта Код typedef struct { __IO uint32_t DR; __IO uint8_t reg8bit; __IO uint8_t spacer; __IO uint16_t spacer2; __IO uint32_t CR; } CRC_TypeDef; ?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
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 =)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|