Jump to content

    

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

; 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

Share this post


Link to post
Share on other sites
И как падает или нет?

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


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

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

 

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

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Afaik там clang

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Жаль, если бросили.

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

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

 

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

Share this post


Link to post
Share on other sites
В 14.09.2018 в 16:59, aaarrr сказал:

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

А для невыровненного случая будет дополнительная инструкция в dasm? Я правильно понимаю, что ничего даром не даётся?)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now