Официальный форум СВД Встраиваемые Системы
19 Апрель, 2024, 19:19:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Упаковка структур  (Прочитано 3574 раз)
andriusKa
Пользователь

Сообщений: 13


« : 29 Январь, 2013, 11:28:11 »

Возникает проблема с упакованными структурами.

Использую QNX® Momentics IDE for BlackBerry® Native SDK for Tablet OS
Version: 2.1.0 со штатным gnu компилятором.

Исполнение программы провожу на PlayBook.

Пример простейшей программы:


struct _MESSAGE
{

   unsigned char a;
   unsigned char b;
   double c;
} __attribute__((packed));


int
main(int argc, char **argv)
{
   double * ptr;
   struct _MESSAGE mes;
   ptr= &mes.c;
   *ptr=0;   //< SIGBUS:bus error

    return 0;
}

Можно ли решить проблему без "значительного" изменения в исходном тексте
(ключи компиляции, прагмы, ...)?

Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #1 : 30 Январь, 2013, 15:32:34 »

Такое поведение вызвано особенностями архитектуры процессора. Многие процессорные архитектуры (в отличие от x86) требуют выравнивания данных.

Небольшое расследование показало, что SIGBUS возникает только в случае сборки конфигурации Device-Debug. В этой конфигурации используется опция gcc -O0 (отключение оптимизации). Проблему можно решить, если собирать приложение в конфигурации Device-Release или заменить ключ -O0 на -O2 или -O1. По всей видимости, при оптимизации компилятор выравнивает поля структуры.
Записан
andriusKa
Пользователь

Сообщений: 13


« Ответ #2 : 30 Январь, 2013, 17:38:05 »

Спасибо за совет.
В таком случае, этот вопрос надо задавать в форумы gcc.
Не думаю, что отказ от возможности проводить откладку, обрадует разработчиков  Sad
Мне кажешься, что это явный баг и где-то в документации по портированию для playbook на эту особенность компилятора надо обратить внимание.

Записан
lgb
Интересующийся

Сообщений: 1


« Ответ #3 : 01 Февраль, 2013, 15:56:00 »

А что, если явно попросить компилятор выравнивать всегда?

Цитировать
http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html

-munaligned-access
-mno-unaligned-access
Enables (or disables) reading and writing of 16- and 32- bit values from addresses that are not 16- or 32- bit aligned. By default unaligned access is disabled for all pre-ARMv6 and all ARMv6-M architectures, and enabled for all other architectures. If unaligned access is not enabled then words in packed data structures will be accessed a byte at a time.

The ARM attribute Tag_CPU_unaligned_access will be set in the generated object file to either true or false, depending upon the setting of this option. If unaligned access is enabled then the preprocessor symbol __ARM_FEATURE_UNALIGNED will also be defined.
Записан
andriusKa
Пользователь

Сообщений: 13


« Ответ #4 : 01 Февраль, 2013, 17:56:54 »

У меня при добавлении этого ключа ругается компилятор:

qcc -o src\main.o ..\src\main.c -V4.4.2,gcc_ntoarmv7le -w1 -IC:/bbndk-2.1.0/target/qnx6/usr/include/freetype2 -IC:/bbndk-2.1.0/target/qnx6/../target-override/usr/include -D_FORTIFY_SOURCE=2 -c -O0 -g -fstack-protector-all -mno-unaligned-access
cc1: error: unrecognized command line option "-mno-unaligned-access"
cc: C:/bbndk-2.1.0/host/win32/x86/usr/lib/gcc/arm-unknown-nto-qnx6.5.0eabi/4.4.2/cc1 caught signal 1
Build error occurred, build is stopped
Time consumed: 132  ms. 

Возможно, эта опция не поддерживается...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2024 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 17 Сентябрь, 2021, 07:46:54