Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Пн сен 27, 2021 12:16:21

Ну да, всё правильно. А как это противоречит тому, что я говорил? Я всего-лишь показал, что если компилятор сразу видит, что адрес невыровненный, то он компилирует побайтную запись. Но если как в случае с ТС, компилятор этого не знает, то генерируется оптимальный код, который падает при подаче в невыровненного указателя.

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

Пн сен 27, 2021 12:39:14

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 использовать, она должна везде и всегда нормально работать.

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

Пн сен 27, 2021 12:48:32

Т.е. - volatile в случае GCC никак не спасает от исключения невыровненного доступа. Не поможет оно.


В моём случае я использовал volatile только для подавления оптимизации, чтобы гарантированно сгенерировался код записи по адресу. Без него оптимизатор всё выкинет и будет пустая программа

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

Пн сен 27, 2021 12:51:52

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

P.S. А, глубокомысленно решать вопрос как "И рыбку съесть и на-й сесть" это тупик 8)
Последний раз редактировалось astrahard Пн сен 27, 2021 13:00:25, всего редактировалось 1 раз.

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

Пн сен 27, 2021 12:57:06

Еще ворнинг для таких случаев можно включить: -Wcast-align

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

Пн сен 27, 2021 13:06:58

jcxz писал(а):Достаточно ему написать корректный пример:
Код:
    extern volatile uint64_t aaa;
    volatile uint64_t *ptr = (uint64_t*)(&aaa+1);
    *ptr = 0x1234567887654321;

Как будут вполне ожидаемые LDRD/STRD.

Куда в этом корректном примере запишется последний байт?
"Корректный", это не о том как будет исполняться, а о том чтобы соответствовало вопросу в теме. В примере ArtDen компилятор видит, что целевой объект - байтовый массив. Возможно поэтому формирует такую портянку из STRB (используя эту инфу). В моём примере у компилятора такой инфы нет, для него цель - просто некая 64-битная переменная где-то, содержимого которой он не знает.

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

Пн сен 27, 2021 13:20:20

Куда в этом корректном примере запишется последний байт?

Последний байт запишется корректно, потому что адрес &aaa+1 выровненный, т.к. у aaa тип uint64_t ))

Добавлено after 7 minutes 45 seconds:
В примере ArtDen компилятор видит, что целевой объект - байтовый массив. Возможно поэтому формирует такую портянку из STRB (используя эту инфу)

Для компилятора важна лишь инфа, достоверно невыровнен ли адрес или это неизвестно. Не важно, что именно до этого содержалось по этому указателю. Вот пример с сырыми указателями: https://gcc.godbolt.org/z/hTeGcv73v
Последний раз редактировалось ArtDen Пн сен 27, 2021 13:21:45, всего редактировалось 1 раз.

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

Пн сен 27, 2021 13:20:32

Последний байт запишется корректно, потому что адрес &aaa+1 выровненный, т.к. у aaa тип uint64_t ))

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

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

Пн сен 27, 2021 13:23:33

Да вообще вопрос вроде как решённый, в том числе для ТС. Непонятно о чём тут спорить )

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

Пн сен 27, 2021 13:46:34

Последний байт запишется корректно, потому что адрес &aaa+1 выровненный, т.к. у aaa тип uint64_t ))

Да, конечно же там нужно: (u64 *)((char *)&aaa + 1). Ошибка.

Добавлено after 1 minute 49 seconds:
Да вообще вопрос вроде как решённый, в том числе для ТС.
Конечно. Пусть ставит IAR - там нет проблем. :)))
Ответить