Цитата(Сергей Борщ @ 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 не возникает. Может, я как-то неправильно пытаюсь возвратить из функции динамически созданный внутри функции массив структур?