Перейти к содержанию

    

Переменная по адресу не кратному 4 байт.

Всё тоже самое нарушено, но на А8 оно по идее работает?

Нет, я привожу 123 к типу void * - тут все корректно.

 

Падает в fault, что и требовалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С А8 может выйти гадание на кисиле, сложный чип, много деталей которые могут повлиять. В норме он разрешает невыравненный доступ и этим пользуется компилятор. Но так будет даже веселей, первое предположение: используете ММУ и у вас в районе нулевого адреса область памяти с нестандартными правами доступа?

Этот пример кстати с операционкой? Если да, то с какой?

 

У меня нет по рукой А8, проверьте вот такой вариант, пожалуйста:

unsigned int dst[4];
char src[16];
  
  int main(void)
  {
      memcpy(dst, (int*)(&src[1]), 8);
  }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Для выровненного источника код такой:

; generated by ARM C/C++ Compiler, 4.1 [Build 462]
; commandline armcc [--debug -c --asm -omain.o --cpu=Cortex-A8 --fpu=VFPv3 --diag_style=ide --depend_format=unix_escaped --no_depend_system_headers ..\main.c]
        ARM
        REQUIRE8
        PRESERVE8

        AREA ||.text||, CODE, READONLY, ALIGN=2

main PROC
        LDR      r0,|L1.24|
        ADD      r1,r0,#0x11
        LDM      r1,{r1,r2}
        STM      r0,{r1,r2}
        MOV      r0,#0
        BX       lr
        ENDP

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
И как падает или нет?

Ваш пример? Падает.

 

Извиняюсь за задержку, хотел все проверить. На Cortex-A8 невыровненный доступ возможен только

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получается вы без линукса А8 готовите? Довольно редкий кейс, компилятор (и я :rolleyes: ) естественно такого не ожидает. Вы как @мантех только регистры или что-то стороннее реалтаймовое используете?

Но и за компилятором есть грех - он предполагает, что невыровненный доступ разрешен, хотя это не обязательно так.

Выбор у него небогатый. Если не считать выравнивание и другие наиболее применимые найстройки нормой, то в других 99% случаев не получится сделать оптимизации. Именно поэтому все нестандартные вопросы с выравниванием и со всем остальными нюансами железа С/++ скинули на программиста. Хотя в 99% случаев об этом позволительно не думать. Но задача сериализации это тот самый 1%, в котором знать язык и железо нужно чуть лучше чем в среднем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Получается вы без линукса А8 готовите? Довольно редкий кейс, компилятор (и я :rolleyes: ) естественно такого не ожидает. Вы как @мантех только регистры или что-то стороннее реалтаймовое используете?

Нет, это просто пример. Готовлю под Linux, но драйверы и загрузчики ведь тоже приходится пилить.

 

Выбор у него небогатый. Если не считать выравнивание и другие наиболее применимые найстройки нормой, то в других 99% случаев не получится сделать оптимизации.

Беда в том, что это не отключается. А со стороны языка пример вполне корректный, тут надо именно приколы компилятора знать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы скорее странным назвал решение АРМ сделавшей невыравненное чтение/запись только при использовании MMU. Хотя и у них наверняка были свои резоны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я бы скорее странным назвал решение АРМ сделавшей невыравненное чтение/запись только при использовании MMU. Хотя и у них наверняка были свои резоны.

Это в любом случае решение ARM, т.к. компилятор тоже их.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Afaik там clang и если много приходится писать без MMU наверное имеет смысл сделать форк, в котором отключить это умолчание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Afaik там clang

Вы что-то путаете: armcc существовал задолго до clang'а и проприетарен до мозга костей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Они ж его вроде бросили, с 5 что ли версии, если мне изменяет память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут не скажу - это четвертый, а дальше я его судьбой не интересовался. Жаль, если бросили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Жаль, если бросили.

Вроде как полностью переключились на 6й

5й пока еще поддерживается, но не обновлялся практически год. Вангую, что скоро он перейдет в разряд т.н. "legacy" ...

 

Мне как однажды пришлось перейти с 5го на 6й, но освоил, привык к полноценному C++11 (в 5й версии он несколько порезанный), и потому обратно уже не хочется :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти