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

 
 
 
Reply to this topicStart new topic
> Ох уж эти ENUM
inventor
сообщение Sep 10 2015, 14:24
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Опять засада, правда почти разобрался

вобщем делаю в IAR определения для АЦП-ешки

CODE

typedef struct {
ADS131_ModeEn mode; /* режим работы */
ADS131_FreqEn sps; /* частота АЦП */
ADS131_PgaEn pga; /* PGA */
ADS131_MuxEn mux; /* Мультиплексор на входе */
ADS131_TestEn test_sign; /* Тестовый сигнал */
ADS131_TestFreqEn test_freq; /* Частота тестового сигнала */
u8 bitmap; /* Включенные каналы: 1 канал включен, 0 - выключен */
u8 file_len; /* Длина файла записи в часах */
} ADS131_Params;

//ADS131_XXX - определены как enum


Для того чтобы посмотреть, что там у меня получается -сделал прогу в С++ Builder
чтобы можно было настройки АЦП передавать своей DSP плате по посл. порту.
посмотрел в билдере sizeof(ADS131_Params)
опа - 28 байт
думаю, ну ладно, у меня объем буфера приема большой - не страшно
На приемной стороне нули, вместо адекватных значений.
Квырялся полдня - потом все же посмотрел, что IAR трактует енумы как байты
поэтому значения попадают на поле с нулем.
Надо исправить, но не знаю как как!
не хочу менять на u8 - так как названия ADS131_XXX более понятны
ищу опции у IAR "treat enum as int" или чего то подобное
не могу найти в опциях.
Как это правильно сделать?
Go to the top of the page
 
+Quote Post
megajohn
сообщение Sep 10 2015, 15:07
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



в IAR enum: на cortex/arm четыре байт, avr - один байт, и инт там 2 байта. У вас какая архитектура ?
увеличить можно через union


p.s. гляньте свой предыдущий топик


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Valentine Logino...
сообщение Sep 10 2015, 15:13
Сообщение #3


Частый гость
**

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



enum == int, а вот разрядность int зависит от архитектуры микроконтроллера.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 10 2015, 15:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (inventor @ Sep 10 2015, 17:24) *
Опять засада, правда почти разобрался

Каим местом вообще enum к тому что Вы хотите родить???


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SSerge
сообщение Sep 10 2015, 15:46
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Граждане, храните деньги читайте доки, особенно EWARM_DevelopmentGuide:
Цитата
The enum type
The compiler will use the smallest type required to hold enum constants, preferring
signed rather than unsigned.
When IAR Systems language extensions are enabled, and in C++, the enum constants
and types can also be of the type long, unsigned long, long long, or unsigned
long long.
To make the compiler use a larger type than it would automatically use, define an enum
constant with a large enough value. For example:
/* Disables usage of the char type for enum */
enum Cards{Spade1, Spade2,
DontUseChar=257};
For related information, see --enum_is_int, page 237.

А последняя строка - как раз об опции в командной строке делать все emum не меньше чем int.

ЗЫ. А также поддержу предыдущего оратора в том, что все эти ухищрения с размерами перечислений вряд ли помогут ввиду другой "особенности" языка. Дело в том, что представление структур в памяти (layout) тоже Implementation-defined, т.е. разные компиляторы могут по-разному разложить структуру в памяти.
Единственный надёжный способ общаться с внешним по отношению к программе миром - преобразование из внутреннего представления в четко определённый формат для передачи и обратное преобразование на приёме.
Сейчас это называется сериализация/десериализация.

PPS. Посмотрел что Ваши предыдущие темы были про техасские DSP, у них с пречислениями может быть иначе, в любом случае это должно быть описано в документации на компилятор. И засада со структурами тоже никуда не денется.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
inventor
сообщение Sep 10 2015, 21:06
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(SSerge @ Sep 10 2015, 18:46) *
Сейчас это называется сериализация/десериализация.

знаем. гугель протобуф
токак оне не поддерживает char

за ответ спасибо, еще один вопрос
где, в какой вкладке можно опцию компилятору задать --enum_is_int?
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 11 2015, 05:19
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(inventor @ Sep 11 2015, 00:06) *
знаем. гугель протобуф
токак оне не поддерживает char


протобуф - это достаточно навороченное решение. Есть и значительно более простые. Проблема в том, что раскладка структур может отличаться в широких пределах - тут и размер enum, и размер int и выравнивание и т.п. Так что рекомендую таки озаботиться сразу не только enum. Если и закладываться на раскладку структуры, то как минимум использовать типы с фиксированным размером (вроде int32_t), добавить директивы упаковки. Enum возможно имеет смысл убрать, заменив на uint8_t. Или обновить компилятор - в с++11 есть class enum, которому можно задать тип хранения.
Go to the top of the page
 
+Quote Post
alexp74
сообщение Sep 11 2015, 06:13
Сообщение #8





Группа: Участник
Сообщений: 11
Регистрация: 20-05-15
Пользователь №: 86 787



Цитата(inventor @ Sep 11 2015, 00:06) *
знаем. гугель протобуф
токак оне не поддерживает char

за ответ спасибо, еще один вопрос
где, в какой вкладке можно опцию компилятору задать --enum_is_int?

если в IAR - то C/C++ Compiler -> Extra Options
поставить галку Use...
и добавить --enum_is_int
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 11 2015, 06:59
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (inventor @ Sep 10 2015, 17:24) *
//ADS131_XXX - определены как enum

Зачем вообще это ТАК сделано? В чем смысл наворачивания через enum типов, вместо описания нормальной структуры?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 11 2015, 07:01
Сообщение #10


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

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



После серии граблей (размеры, выравнивание) для себя решил НИКОГДА не использовать структуры напрямую для приема-передачи.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Sep 11 2015, 07:07
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(zltigo @ Sep 11 2015, 09:59) *
Зачем вообще это ТАК сделано? В чем смысл наворачивания через enum типов, вместо описания нормальной структуры?


смысл в том, что если мы в ХХХmode попытаемся засунуть константу ХХХfreq, то получим по рукам от компилятора (по крайней мере в плюсах, насчет голого си - не уверен)

Правда enum до с++11 проблематично использовать там, где нужен фиксированный размер. Но это уже другой вопрос sm.gif
Go to the top of the page
 
+Quote Post
den_po
сообщение Sep 12 2015, 19:20
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(inventor @ Sep 10 2015, 19:24) *
ищу опции у IAR "treat enum as int" или чего то подобное
не могу найти в опциях.

Ваша версия IAR так не умеет?

enum A : short
{
};
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 12 2015, 21:03
Сообщение #13


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(MrYuran @ Sep 11 2015, 10:01) *
После серии граблей (размеры, выравнивание) для себя решил НИКОГДА не использовать структуры напрямую для приема-передачи.
У меня мнение строго противоположное.
Всё решаю при помощи атрибутов.
На всех платформах, что я использовал, всегда предсказуемое и ожидаемое поведение.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
den_po
сообщение Sep 13 2015, 07:17
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(demiurg_spb @ Sep 13 2015, 02:03) *
У меня мнение строго противоположное.
Всё решаю при помощи атрибутов.
На всех платформах, что я использовал, всегда предсказуемое и ожидаемое поведение.

Да, если не забыть защититься от возможных ошибок, связанных с порядком байтов.

Сообщение отредактировал den_po - Sep 13 2015, 07:18
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 13 2015, 07:38
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (demiurg_spb @ Sep 13 2015, 00:03) *
У меня мнение строго противоположное.
Всё решаю при помощи атрибутов.
На всех платформах, что я использовал, всегда предсказуемое и ожидаемое поведение.

Не все так благостно, ибо отличаются не только платформы, но и компиляторы, например в части битовых полей в структурах.
Так-что готовым к неожиданностям надо быть. Но тем не меннее вариант пересылки пакованной структуры "страндартизованой" под формат самого слабого контроллера в системе (остальные пусть перелопачивают, если на совпадает), это тоже вариант.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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