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

 
 
> Hard Fault при выполнении malloc, но если выполняю пошагово - все ок
kt368
сообщение Dec 16 2013, 21:34
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Здравствуйте!
Есть функция, которой передаётся указатель на указатель на структуру (**pIndZwithZ). В самой функции указателю на структуру присваивается выделяемое malloc'ом пространство для некоторого количества таких структур. В итоге мне нужно чтоб функция с помощью указателя возвращала массив структур, их количество рассчитывается в самой функции. Так вот, в функции есть код:
Код
*pIndZwithZ = malloc(CalData_str.nZ * (sizeof(float) + sizeof(uint8_t)));
Если я ставлю breackpoint на следующую за ним строку, то при её выполнении происходит Hard Fault, причиной которого, как я понял, является "data bus error". Это видно из того, что SCB.CFSR становится равным 0x400. А если я точку останова ставлю на этом злополучной malloc'е, и далее выполняю пошагово, то никаких проблем не возникает. Heap'a точно хватает, пробовал увеличить - не помогло.
Посоветуйте, как можно пытаться бороться с проблемой?

P.S. LPC1758, Keil.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kt368
сообщение Dec 17 2013, 18:45
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Цитата(Сергей Борщ @ Dec 17 2013, 12:31) *
Раскручивайте содержимое стека, находите вызвавшую исключение команду, анализируйте содержимое задействованных в ней регистров.
Исключение, если я правильно пользуюсь инструментарием Keil'a, вызывает команда
Код
STR r0, [r5, #0x00]
Эта команда должна сохранять значение регистра r0 по адресу, указанному в регистре r5. Значение r0=0x100001D0, r5=0x0. Т.е. в память начиная с адреса 0x0 должно записаться значение 0x100001D0. Правильно я мыслю? А этого не происходит, смотрю на эту память через вкладку Memory Kil'a. Значения в указанном сегменте памяти не меняются.
И как обычно, при выполнении этой и последующих команд пошагово, всё ОК. А при установке breackpoint'а на следующей за этой команде - в регистре CFSR появляется число 0x400, что свидетельствует о "Imprecise data bus error". Об этом в "Application Note 209: Using Cortex-M3 and Cortex-M4 Fault Exceptions" пишут, что:

"
a data bus error has occurred, but the return address in the stack frame is not related to the instruction
that caused the error. When the processor sets this bit it does not write a fault address to SCB->BFAR.
This is an asynchronous fault. Therefore, if it is detected when the priority of the current process is
higher than the Bus Fault priority, the Bus Fault becomes pending and becomes active only when the
processor returns from all higher priority processes. If a precise fault occurs before the processor enters
the handler for the imprecise Bus Fault, the handler detects both IMPRECISERR set to 1 and one of the
precise fault status bits set to 1.
"
Т.е. произошла ошибка шины данных. Как узнать почему она произошла....

Цитата(A. Fig Lee @ Dec 17 2013, 14:37) *
Прерывания используете? Хэндлеры все на месте? В прерываниях порядок?
Попробуйте запретить прерывание на время malloc();
Запретил, не помогает.
Цитата(A. Fig Lee @ Dec 17 2013, 14:37) *
Первые 32 бита программы это значение указателя на стэк, вот и смотрите, достаточен ли он.
Подскажите, чо вы имеете в виду. Первые 32 бита вот: 0x02000004. Как зная это можно узнать размер стека?
Цитата(A. Fig Lee @ Dec 17 2013, 14:37) *
Еще я бы вызвал malloc(16); чисто для верности.
Но если в самом начале, подозрение на то, что стэк не инициализирован.
Гляньте линкер скрипт.
malloc(16) вызывал, все так же.
Линкер скрипт руками не создавал, он создался автоматически, я в ГУИ KEIL выставил требуемые настройки.
Самое интересное, что проблема только с эти malloc'ом, в программе есть несколько других динамических выделений памяти, с ними всё ОК.
Функция, внутри которой этот malloc принимает указатель на указатель на структуру:
Код
void SortZIndOnCurF (struct IndZwithZ_str ** pIndZwithZ, uint16_t freq);
Внутри этой функции я пытаюсь выделить память и сохранить указатель на неё следующим образом:
Код
*pIndZwithZ = malloc(16);
Так вот, тут и происходит ошибка.
НО если я внутри этой функции создаю указатель на структуру
Код
struct IndZwithZ_str * tt;
И указатель на динамически выделенную память присваиваю этой переменной (tt):
Код
tt = malloc(16);
То проблем с HardFault не возникает. Может, я как-то неправильно пытаюсь возвратить из функции динамически созданный внутри функции массив структур?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- kt368   Hard Fault при выполнении malloc   Dec 16 2013, 21:34
- - A. Fig Lee   Цитата(kt368 @ Dec 16 2013, 16:34) Здравс...   Dec 16 2013, 23:57
- - andrewlekar   Возможно дело в невыровненном доступе к памяти. По...   Dec 17 2013, 04:49
- - kt368   А как проверить хватает ли стека? Вот, что вижу в ...   Dec 17 2013, 06:03
|- - Сергей Борщ   Цитата(kt368 @ Dec 17 2013, 08:03) Как уз...   Dec 17 2013, 06:42
- - kt368   Я считал что аппаратный стек - это способность мик...   Dec 17 2013, 08:36
|- - Сергей Борщ   Цитата(kt368 @ Dec 17 2013, 10:36) Наприм...   Dec 17 2013, 10:31
|- - A. Fig Lee   Цитата(kt368 @ Dec 17 2013, 03:36) Я счит...   Dec 17 2013, 12:37
|- - A. Fig Lee   Цитата(kt368 @ Dec 17 2013, 13:45) Подска...   Dec 17 2013, 19:30
|- - Сергей Борщ   Цитата(kt368 @ Dec 17 2013, 20:45) Эта ко...   Dec 17 2013, 21:58
- - kt368   Цитата(A. Fig Lee @ Dec 17 2013, 21:30) А...   Dec 17 2013, 21:22
|- - A. Fig Lee   Цитата(kt368 @ Dec 17 2013, 16:22) Да вро...   Dec 17 2013, 21:52
- - kt368   Да, это были hex файлы. Для создания bin воспользо...   Dec 18 2013, 11:03
- - A. Fig Lee   Странное, непонятное мне распределение IRAM на кар...   Dec 18 2013, 13:54
- - kt368   Почему ж странное, вот скрин юзер мануала, у меня ...   Dec 18 2013, 14:07
- - toweroff   По-любому в 0 записывать нельзя, если не было рема...   Dec 18 2013, 14:24
- - kt368   Цитата(toweroff @ Dec 18 2013, 16:24) По-...   Dec 18 2013, 14:25
|- - A. Fig Lee   Цитата(kt368 @ Dec 18 2013, 09:25) Это по...   Dec 18 2013, 15:06
|- - toweroff   Цитата(kt368 @ Dec 18 2013, 18:25) Это по...   Dec 18 2013, 15:08
- - kt368   Я уже немного переделал СИ-шные файлы, и глюки пер...   Dec 18 2013, 19:24
|- - toweroff   Цитата(kt368 @ Dec 18 2013, 23:24) Я уже ...   Dec 18 2013, 20:37
|- - Сергей Борщ   Цитата(kt368 @ Dec 18 2013, 21:24) Подска...   Dec 19 2013, 08:41
- - kt368   С размещением в памяти уже вроде-бы разобрался (ис...   Dec 19 2013, 11:11


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

 


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


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