|
|
  |
Ох уж эти ENUM |
|
|
|
Sep 10 2015, 14:24
|
Знающий
   
Группа: Свой
Сообщений: 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" или чего то подобное не могу найти в опциях. Как это правильно сделать?
|
|
|
|
|
Sep 10 2015, 15:46
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Sep 10 2015, 21:06
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(SSerge @ Sep 10 2015, 18:46)  Сейчас это называется сериализация/десериализация. знаем. гугель протобуф токак оне не поддерживает char за ответ спасибо, еще один вопрос где, в какой вкладке можно опцию компилятору задать --enum_is_int?
|
|
|
|
|
Sep 11 2015, 06:13
|
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 12 2015, 19:20
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(inventor @ Sep 10 2015, 19:24)  ищу опции у IAR "treat enum as int" или чего то подобное не могу найти в опциях. Ваша версия IAR так не умеет? enum A : short { };
|
|
|
|
|
Sep 12 2015, 21:03
|

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

|
Цитата(MrYuran @ Sep 11 2015, 10:01)  После серии граблей (размеры, выравнивание) для себя решил НИКОГДА не использовать структуры напрямую для приема-передачи. У меня мнение строго противоположное. Всё решаю при помощи атрибутов. На всех платформах, что я использовал, всегда предсказуемое и ожидаемое поведение.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Sep 13 2015, 07:17
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

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

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

|
QUOTE (demiurg_spb @ Sep 13 2015, 00:03)  У меня мнение строго противоположное. Всё решаю при помощи атрибутов. На всех платформах, что я использовал, всегда предсказуемое и ожидаемое поведение. Не все так благостно, ибо отличаются не только платформы, но и компиляторы, например в части битовых полей в структурах. Так-что готовым к неожиданностям надо быть. Но тем не меннее вариант пересылки пакованной структуры "страндартизованой" под формат самого слабого контроллера в системе (остальные пусть перелопачивают, если на совпадает), это тоже вариант.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|