реклама на сайте
подробности

 
 
> Скопировать часть массива в переменную 64 бита
IgorAVR2
сообщение Apr 9 2018, 21:54
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Пытаюсь скопировать в переменную uint_64t восемь байт из массива с определённого его индекса. Конструкция такая:
((uint64_t*)&write_key)[0]=(((uint64_t*)(rx_buffer+5))[0]);

write_key - переменная 64 бита.
rx_buffer - байтовый массив.

В строчке пытаюсь копировать с 5 элемента и программа вылетает в Hard Fault.
Если копировать с 0 или 4 элемента то всё ок. Понимаю что что связанно с адресацией но что именно?
Микроконтронтроллер STM32f0, среда IAR. На PC эта же строчка с 5 индексом прокатывает.
Что делаю не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
IgorAVR2
сообщение Apr 10 2018, 14:02
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 29-05-08
Пользователь №: 37 901



Вычитал в в аналогичном топике, что оказывается STM32f4 об этом думать не нужно. Вот и у меня видимо до этого так раньше работало в других проектах.
https://electronix.ru/forum/lofiversion/ind...hp/t140216.html
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 10 2018, 14:15
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(IgorAVR2 @ Apr 10 2018, 17:02) *
Вычитал в в аналогичном топике, что оказывается STM32f4 об этом думать не нужно. Вот и у меня видимо до этого так раньше работало в других проектах.

Нет, не поэтому. Не нужно для операций LDR/STR - только они поддерживают невыровненный доступ на M3/M4. А если Вы пишете тип u64, то для работы с таким типом компилятор может применить LDRD/STRD, а эти команды не поддерживают невыровненный доступ даже в M4.
Хотя может какой-то конкретный, не очень оптимизирующий компилятор, вместо одной LDRD, может применить пару LDR, тогда прокатит.
Но чтобы не гадать, хорошим тоном является явное указание невыровненности переменной (__packed), тогда компилятор сам решит как нужно работать с данной переменной на данном ядре. И не будет сюрпризов при переносе кода на другое ядро.

PS: Да и учиться нужно не по "топикам" где могут нести какую угодно чушь, а по мануалам на ядро. Там всё разжёвано.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- IgorAVR2   Скопировать часть массива в переменную 64 бита   Apr 9 2018, 21:54
- - _pv   memcpy(&write_key, &rx_buffer[5], 8);   Apr 9 2018, 22:58
- - Jenya7   а так? Код*((uint64_t *)write_key...   Apr 10 2018, 04:59
|- - IgorAVR2   Цитата(Jenya7 @ Apr 10 2018, 07:59) а так...   Apr 10 2018, 09:57
|- - aaarrr   Цитата(IgorAVR2 @ Apr 10 2018, 12:57) Да,...   Apr 10 2018, 10:32
|- - jcxz   Цитата(Jenya7 @ Apr 10 2018, 07:59) а так...   Apr 10 2018, 11:00
|- - IgorAVR2   Цитата(jcxz @ Apr 10 2018, 14:00) Кодtype...   Apr 10 2018, 11:43
|- - jcxz   Цитата(IgorAVR2 @ Apr 10 2018, 14:43) так...   Apr 10 2018, 12:04
- - vadon   ЦитатаПонимаю что что связанно с адресацией но что...   Apr 10 2018, 05:07
- - Kabdim   А можно просто выровнять буфер если считываемые сл...   Apr 10 2018, 11:27
|- - jcxz   Цитата(Kabdim @ Apr 10 2018, 14:27) А мож...   Apr 10 2018, 11:34
- - Kabdim   Зря не верите, все современные компиляторы насколь...   Apr 10 2018, 11:44
- - IgorAVR2   Понял, спасибо!   Apr 10 2018, 12:52
- - IgorAVR2   Да, всё правильно в моём случае сейчас переменная ...   Apr 10 2018, 14:47


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 20:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016