2015-09-02 15 views
0

Я пытаюсь сделать модуль BLE121LR с внешним MCU (EFM32). Как я понимаю, этот фрагмент кода объявляет преобразование структуры в двоичные данные, верно? Может кто-нибудь объяснить мне, как добавить поддержку ARM (EFM32)? Спасибо большое!Условно используя упакованную структуру с armcc (PACKSTRUCT в BGLib)

Код:

/* Compability */ 
#ifndef PACKSTRUCT 
    #ifdef PACKED 
     #define PACKSTRUCT(a) a PACKED 
    #else 
/*Default packed configuration*/ 
     #ifdef __GNUC__ 
      #ifdef _WIN32 
       #define PACKSTRUCT(decl) decl __attribute__((__packed__,gcc_struct)) 
      #else 
       #define PACKSTRUCT(decl) decl __attribute__((__packed__)) 
      #endif 
      #define ALIGNED __attribute__((aligned(0x4))) 
     #else //msvc 
      #define PACKSTRUCT(decl) __pragma(pack(push, 1)) decl __pragma(pack(pop)) 
      #define ALIGNED 
     #endif 
    #endif 
#endif 
+0

Что компилятор вы получаете, когда вы пытаетесь скомпилировать код, используя PACKSTRUCT макрос? Какой компилятор вы используете? – Pinetwig

+0

Мой IDE является uKeil 5. Некоторые ошибки: .. \ bglib \ cmd_def.h (846): ошибка: # 20: идентификатор "пакет" не определен PACKSTRUCT (структура ble_msg_system_reset_cmd_t .. \ bglib \ cmd_def.h (846): ошибка: # 18: ожидается a ")" PACKSTRUCT (struct ble_msg_system_reset_cmd_t .. \ bglib \ cmd_def.h (846): ошибка: # 79: ожидается спецификатор типа –

+0

IDE - это не то же самое, что и компилятор. В моем ответе я предположил, что вы используете armc Keil. Это правильно? – Pinetwig

ответ

0

Да, упакованные влияют Структуры, как структура сохраняется в памяти, которая часто используется в качестве быстрого и грязный способ преобразования в двоичных структур данных.

Макрос PACKSTRUCT не написан для компилятора keil armcc. Чтобы исправить это, мы должны сначала найти, как мы можем идентифицировать, когда используется armcc. На странице this page мы видим, что armcc предоставляет определение __ARMCC_VERSION, которое мы можем использовать.

Теперь, как мы объявляем упакованную структуру с помощью armcc? Here, мы видим, что мы должны использовать __packed спецификатор:

ошибки
/* Compability */ 
#ifndef PACKSTRUCT 
    #ifdef PACKED 
     #define PACKSTRUCT(a) a PACKED 
    #else 
/*Default packed configuration*/ 
     #ifdef __GNUC__ 
      #ifdef _WIN32 
       #define PACKSTRUCT(decl) decl __attribute__((__packed__,gcc_struct)) 
      #else 
       #define PACKSTRUCT(decl) decl __attribute__((__packed__)) 
      #endif 
      #define ALIGNED __attribute__((aligned(0x4))) 
     #else // not __GNUC__ 
      #ifdef __ARMCC_VERSION 
       #define PACKSTRUCT(decl) __packed decl 
       #define ALIGNED 
      #else // Assume msvc 
       #define PACKSTRUCT(decl) __pragma(pack(push, 1)) decl __pragma(pack(pop)) 
       #define ALIGNED 
      #endif 
     #endif 
    #endif 
#endif 
+0

Wow !!! Спасибо большое! –

+0

После прочтения ссылок что вы предоставили, я вижу, что armcc поддерживает упаковку gnucc тоже ... После добавления плеча PACKSTRUC T, я получаю много других ошибок: *** 1) .. \ bglib \ cmd_def.h (862): ошибка: # 20: идентификатор «pack» не определен *** *** 2) .. \ bglib \ cmd_def.h (862): ошибка: # 247: функция «__pragma» уже определена *** *** 3) .. \ bglib \ cmd_def.h (862): ошибка: # 141-D: unnamed прототипированные параметры не допускаются при наличии тела *** Что я делаю неправильно? Спасибо! –

+0

Хммм, пакет и __pragma - это символы, используемые в макросе MSVC. Похоже, что эти макросы также определены в apitypes.h, который включен перед определением в cmd_def.h (это плохая форма - Do not Repeat Yourself). Попробуйте также изменить определение там! – Pinetwig

 Смежные вопросы

  • Нет связанных вопросов^_^