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

 
 
> STM32: HardFault
k000858
сообщение Mar 27 2014, 04:16
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Реализую 1-wire на UART+DMA, камень STM32F407
Делается все на фирменных ST библиотеках HAL (новые SPL)

После вызова функции HAL_UART_Receive_DMA(&UartHandle, (uint8_t *)ds18b20_buf_rx, sizeof(ds18b20_buf_rx)); попадаю в хардфаулт.
uint8_t ds18b20_buf_rx[8];

часть внутренностей функции:
Код
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  uint32_t *tmp;
  tmp = (uint32_t*)&pData;
}


Прерывание происходит на строчке tmp = (uint32_t*)&pData;

Как так?

точно такая же функция на отправку работает нормально...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Mar 27 2014, 08:17
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(k000858 @ Mar 27 2014, 05:16) *
Реализую 1-wire на UART+DMA, камень STM32F407
часть внутренностей функции:
Код
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  uint32_t *tmp;
  tmp = (uint32_t*)&pData;
}


Прерывание происходит на строчке tmp = (uint32_t*)&pData;

Как так?

Процессор не любит словные (32-битовые) обращения по невыровненному адресу.
Вообще, (uint32_t*)&pData - явно чушь. Либо должно быть (uint32_t*)&pData[0], либо (uint32_t*)pData. Без вариантов. И если вышеуказаный код в библиотеке стоит, значит в ней типичная индусская ошибка.

Сообщение отредактировал KnightIgor - Mar 27 2014, 08:34
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 27 2014, 11:03
Сообщение #3


Гуру
******

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



Цитата(KnightIgor @ Mar 27 2014, 10:17) *
Вообще, (uint32_t*)&pData - явно чушь.
Не видя остального кода функции этого нельзя утверждать со 100% уверенностью.


--------------------
На любой вопрос даю любой ответ
"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
KnightIgor
сообщение Mar 27 2014, 18:55
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Сергей Борщ @ Mar 27 2014, 12:03) *
Не видя остального кода функции этого нельзя утверждать со 100% уверенностью.

100% в инженерной практике не существуют. С 99.9% можно утверждать, что делать ссылку на указатель, переданый в качестве параметра - бессмысленно и вредно (Hardware Fault это доказывает): параметр pData содержит указатель на некий внешний буфер байтов. То есть, по соглашению о передаче параметров в ARM С, указатель содержится в регистре R1. Оператор пытается взять указатель на регистр R1, а это вам не MSC-51 архитектура, где все регистры есть одновременно и ячейки памяти.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 27 2014, 23:53
Сообщение #5


Гуру
******

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



Цитата(KnightIgor @ Mar 28 2014, 00:55) *
То есть, по соглашению о передаче параметров в ARM С, указатель содержится в регистре R1. Оператор пытается взять указатель на регистр R1, а это вам не MSC-51 архитектура, где все регистры есть одновременно и ячейки памяти.

Прежде чем писать, потрудились-бы хотя-бы в листинг заглянуть: при взятии адреса аргумента функции переданного в регистре, компилятор переместит его на стек (внутри функции).

Цитата(KnightIgor @ Mar 27 2014, 14:17) *
Процессор не любит словные (32-битовые) обращения по невыровненному адресу.

"Любит-нелюбит" - это к девушкам.
А вообще Cortex-M вполне нормально переваривает невыровненные доступы (в отличие от ARM7/9) (исключение - инструкции LDM, STM, LDRD, STRD, но вряд-ли компилятор их там нагенерил).
Опционально можно разрешить Usage Fault при невыровненном доступе. Это делается в регистре CCR Cortex-ядра. Но по дефолту это там запрещено.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- k000858   STM32: HardFault   Mar 27 2014, 04:16
- - Сергей Борщ   Сама по себе строчка некриминальна. Надо пройтись ...   Mar 27 2014, 04:55
- - ISK2010   Может вы хотели написать "tmp = (uint32_t*)pD...   Mar 27 2014, 05:01
- - k000858   это не я написал, это библиотека от ST сейчас убр...   Mar 27 2014, 05:38
|- - aaarrr   Цитата(KnightIgor @ Mar 27 2014, 22:55) 1...   Mar 27 2014, 19:19
- - k000858   Проблема решилась. пошагал отладчиком и все такое....   Mar 28 2014, 01:07
|- - Сергей Борщ   Цитата(k000858 @ Mar 28 2014, 03:07) Проб...   Mar 28 2014, 03:39
|- - k000858   Цитата(Сергей Борщ @ Mar 28 2014, 07:39) ...   Mar 28 2014, 04:00
|- - Сергей Борщ   Цитата(k000858 @ Mar 28 2014, 06:00) на с...   Mar 28 2014, 05:08
- - k000858   ну библы новые, может причешут! зато удалось р...   Mar 28 2014, 05:39
- - Golikov A.   ну не за пол дня, а за сутки все таки... тем более...   Mar 28 2014, 09:22
|- - jcxz   Цитата(Golikov A. @ Mar 28 2014, 15:22) л...   Mar 28 2014, 10:10
- - DASM   За это и можно ненавидеть язык С. В fault на ровно...   Mar 28 2014, 14:09
- - Genadi Zawidowski   HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)...   Mar 29 2014, 06:43
- - RusikOk   Цитата(k000858 @ Mar 27 2014, 07:16) Реал...   Sep 3 2016, 19:59
|- - k000858   Цитата(RusikOk @ Sep 3 2016, 22:59) как у...   Sep 7 2016, 12:17
|- - RusikOk   Цитата(k000858 @ Sep 7 2016, 15:17) да, в...   Sep 7 2016, 22:38
|- - k000858   Цитата(RusikOk @ Sep 8 2016, 01:38) подел...   Sep 8 2016, 07:28
|- - RusikOk   Цитата(k000858 @ Sep 8 2016, 10:28) поста...   Sep 10 2016, 09:01
|- - k000858   Цитата(RusikOk @ Sep 10 2016, 12:01) будж...   Sep 13 2016, 04:19
- - RusikOk   схема мне не нужна. главное что все построено на U...   Sep 13 2016, 05:20
|- - k000858   Цитата(RusikOk @ Sep 13 2016, 08:20) схем...   Sep 13 2016, 09:02
- - IgorC   проект на CubeMx? как делали изменение скорости по...   Feb 11 2017, 09:56
- - RusikOk   Цитата(IgorC @ Feb 11 2017, 12:56) но хот...   Feb 11 2017, 10:50


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

 


RSS Текстовая версия Сейчас: 13th August 2025 - 22:40
Рейтинг@Mail.ru


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