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

 
 
 
Reply to this topicStart new topic
> О переносимости кода, AVR => ARM
ivainc1789
сообщение Mar 8 2012, 17:54
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



При портировании кода программы на STM32 возникла трудность. На такой строке
Код
*(struct SensStruct*)(TxBuf + 5) = Sensor;

ловлю устойчивый HardFault и не понимаю, почему? Переменная Sensor типа структуры SensStruct копируется в буфер TxBuf начиная с TxBuf[5] для передачи через USART.

В AVR компилировалось без проблем, что в принципе понятно - там нет исключений... Как правильно оформить под ARM и в чем причина?
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Mar 8 2012, 18:29
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Стесняюсь спросить, а память под Sensor в TxBuf+5 выделена?


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
psL
сообщение Mar 8 2012, 18:48
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



может это проблемы с выравниванием? Попробуйте так:
Код
memcpy(&TxBuf[5], (char*)&Sensor, sizeof(struct SensStruct));
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Mar 8 2012, 18:54
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата(Cosmojam @ Mar 8 2012, 22:29) *
Стесняюсь спросить, а память под Sensor в TxBuf+5 выделена?

TxBuf определен как unsigned char TxBuf[64]. Размер всех элементов структуры много меньше 64 байт даже с учетом расположения с адреса TxBuf+5.
Go to the top of the page
 
+Quote Post
zöner
сообщение Mar 8 2012, 19:54
Сообщение #5


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

Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299



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

Сообщение отредактировал zöner - Mar 8 2012, 19:55
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 8 2012, 20:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Да все он так считает. А вот кастить под структуру адрес с неизвестным выравниванием - не есть гуд. Что и наблюдаем.
Go to the top of the page
 
+Quote Post
zöner
сообщение Mar 8 2012, 21:29
Сообщение #7


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

Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299



Цитата
А вот кастить под структуру адрес с неизвестным выравниванием - не есть гуд
для Cortex какая разница ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 8 2012, 21:43
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zöner @ Mar 9 2012, 01:29) *
для Cortex какая разница ?

А что Cortex?
Цитата
Unaligned support is only available for load/store singles (LDR, STR).

А структурку-то умный компилятор наверняка пытается перегнать через LDM/STM, на которые эта магия не распространяется.
Go to the top of the page
 
+Quote Post
zöner
сообщение Mar 9 2012, 06:32
Сообщение #9


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

Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299



посмотрел - для присваивания структур вызывается memcpy, с выравниванием не должно быть проблем

Сообщение отредактировал zöner - Mar 9 2012, 07:48
Go to the top of the page
 
+Quote Post
psL
сообщение Mar 9 2012, 08:23
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



топикстартер молчит про свой компилятор
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 9 2012, 10:16
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (zöner @ Mar 9 2012, 08:32) *
посмотрел - для присваивания структур вызывается memcpy, с выравниванием не должно быть проблем
Структуры и компиляторы бывают разные. Для 4-8-12-16-байтовой структуры один вызов memcpy съест памяти и тактов столько же, сколько LDM/STM.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Mar 10 2012, 07:18
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата(psL @ Mar 9 2012, 12:23) *
топикстартер молчит про свой компилятор

IAR EWARM v6.30.6.
После замены на memcpy все работает нормально. Я так понял других вариантов нет?
Признаюсь, что все эти проблемы с выравниванием до конца не понимаю, где еще могут вылезти неявные грабли, с этим связанные? Что почитать? Вроде бы у компилятора есть вся необходимая информация, чтобы за этим следить самостоятельно или хотя бы предупреждать пользователя через warning: ...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 10 2012, 10:18
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ivainc1789 @ Mar 10 2012, 11:18) *
После замены на memcpy все работает нормально. Я так понял других вариантов нет?

Есть. Пакуйте структуры, которые используются подобным образом (в IAR это #pragma pack(1), если не путаю).

Цитата(ivainc1789 @ Mar 10 2012, 11:18) *
Вроде бы у компилятора есть вся необходимая информация, чтобы за этим следить самостоятельно или хотя бы предупреждать пользователя через warning: ...

Нет, тут уж следить - дело программиста. Если уж вы используете явные преобразования типа, то должны контролировать возможные грабли.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:59
Рейтинг@Mail.ru


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