hard fault на stm32f103rb при работе с указателями на uint64

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
ArtDen
Мучитель микросхем
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34
Контактная информация:

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение ArtDen »

Ну да, всё правильно. А как это противоречит тому, что я говорил? Я всего-лишь показал, что если компилятор сразу видит, что адрес невыровненный, то он компилирует побайтную запись. Но если как в случае с ТС, компилятор этого не знает, то генерируется оптимальный код, который падает при подаче в невыровненного указателя.
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение Reflector »

jcxz писал(а):Достаточно ему написать корректный пример:

Код: Выделить всё

    extern volatile uint64_t aaa;
    volatile uint64_t *ptr = (uint64_t*)(&aaa+1);
    *ptr = 0x1234567887654321;
Как будут вполне ожидаемые LDRD/STRD.
Куда в этом корректном примере запишется последний байт?
jcxz писал(а):Т.е. - volatile в случае GCC никак не спасает от исключения невыровненного доступа. Не поможет оно.
Оно помогает для uint32_t*. Когда их несколько подряд, то без volatile может сгенериться STRD, но это чисто практическое наблюдение...
Вообще в случае невыровненного доступа рекомендуют memcpy использовать, она должна везде и всегда нормально работать.
Реклама
Аватара пользователя
ArtDen
Мучитель микросхем
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34
Контактная информация:

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение ArtDen »

[uquote="jcxz",url="/forum/viewtopic.php?p=4097480#p4097480"]Т.е. - volatile в случае GCC никак не спасает от исключения невыровненного доступа. Не поможет оно.[/uquote]

В моём случае я использовал volatile только для подавления оптимизации, чтобы гарантированно сгенерировался код записи по адресу. Без него оптимизатор всё выкинет и будет пустая программа
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Аватара пользователя
astrahard
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Чт фев 19, 2015 12:41:04

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение astrahard »

Афигеть Вам нужно пересесть на Arduino там этот вопрос элегантно решили. Суть решения проста как я и говорил "если нельзя, но очень хочется то можно" :)) ...

P.S. А, глубокомысленно решать вопрос как "И рыбку съесть и на-й сесть" это тупик 8)
Последний раз редактировалось astrahard Пн сен 27, 2021 13:00:25, всего редактировалось 1 раз.
"Every profession is a conspiracy against the uninitiated" (B. Shaw)
"A textbook can be defined as a book unsuitable for reading" (B. Shaw)
Tautology is humor in "this" place (Vigo Carpathian)
Реклама
Эиком - электронные компоненты и радиодетали
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение Reflector »

Еще ворнинг для таких случаев можно включить: -Wcast-align
Реклама
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=4097508#p4097508"]
jcxz писал(а):Достаточно ему написать корректный пример:

Код: Выделить всё

    extern volatile uint64_t aaa;
    volatile uint64_t *ptr = (uint64_t*)(&aaa+1);
    *ptr = 0x1234567887654321;
Как будут вполне ожидаемые LDRD/STRD.
Куда в этом корректном примере запишется последний байт?[/uquote]"Корректный", это не о том как будет исполняться, а о том чтобы соответствовало вопросу в теме. В примере ArtDen компилятор видит, что целевой объект - байтовый массив. Возможно поэтому формирует такую портянку из STRB (используя эту инфу). В моём примере у компилятора такой инфы нет, для него цель - просто некая 64-битная переменная где-то, содержимого которой он не знает.
Реклама
Аватара пользователя
ArtDen
Мучитель микросхем
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34
Контактная информация:

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение ArtDen »

[uquote="Reflector",url="/forum/viewtopic.php?p=4097508#p4097508"]Куда в этом корректном примере запишется последний байт?[/uquote]
Последний байт запишется корректно, потому что адрес &aaa+1 выровненный, т.к. у aaa тип uint64_t ))

Добавлено after 7 minutes 45 seconds:
[uquote="jcxz",url="/forum/viewtopic.php?p=4097537#p4097537"]В примере ArtDen компилятор видит, что целевой объект - байтовый массив. Возможно поэтому формирует такую портянку из STRB (используя эту инфу)[/uquote]
Для компилятора важна лишь инфа, достоверно невыровнен ли адрес или это неизвестно. Не важно, что именно до этого содержалось по этому указателю. Вот пример с сырыми указателями: https://gcc.godbolt.org/z/hTeGcv73v
Последний раз редактировалось ArtDen Пн сен 27, 2021 13:21:45, всего редактировалось 1 раз.
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение Reflector »

[uquote="ArtDen",url="/forum/viewtopic.php?p=4097542#p4097542"]Последний байт запишется корректно, потому что адрес &aaa+1 выровненный, т.к. у aaa тип uint64_t ))[/uquote]
Ну да, это я протупил, там же приведения нет, потому все байты запишутся непонятно куда :) Но изначально видимо протупил jcxz, потому что скорее всего хотел увеличить адрес именно на байт :)
Аватара пользователя
ArtDen
Мучитель микросхем
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34
Контактная информация:

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение ArtDen »

Да вообще вопрос вроде как решённый, в том числе для ТС. Непонятно о чём тут спорить )
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: hard fault на stm32f103rb при работе с указателями на ui

Сообщение jcxz »

[uquote="ArtDen",url="/forum/viewtopic.php?p=4097542#p4097542"]Последний байт запишется корректно, потому что адрес &aaa+1 выровненный, т.к. у aaa тип uint64_t ))[/uquote]
Да, конечно же там нужно: (u64 *)((char *)&aaa + 1). Ошибка.

Добавлено after 1 minute 49 seconds:
[uquote="ArtDen",url="/forum/viewtopic.php?p=4097549#p4097549"]Да вообще вопрос вроде как решённый, в том числе для ТС.[/uquote]Конечно. Пусть ставит IAR - там нет проблем. :)))
Ответить

Вернуться в «ARM»