Покажу на псевдокоде.
Код
int main(void)
{
func1(); // эта функция выполняется
func2(); // при выполнении вот этой отладчик отваливается
}
func1()
{
struct s;
s.a = 0;
s.b = 10;
s.c = 42;
s.d = 50;
init_struct(&struct); // ну, просто настраиваем регистры периферии микроконтроллера этой структурой
}
func2()
{
// запись и чтение внешней памяти
}
Вот так - отладчик отваливается при попытке выполнения функции func2.
Стоит закомментировать в func1 строку s.c = 42 или присвоить не 42 а 128 - отладчик не отваливается, функция выполняется. Пробовали 42, 128 и несколько других чисел - с некоторыми отваливается, с некоторыми - нет.
Менял размер стека и кучи (ну, в отчаянии), не помогает.
Само отваливание происходит при попытке записи во внешнюю память (при выполнении строчки что-то типа *(base_addr + addr) = data). Думаю, это не важно, ведь по сути абсурдно, что, изменив лишь инициализатор переменной, совсем не имеющей отношение к этой операции, результат будет разный - STLink отваливается, или нет.
Кроме всего прочего. Если оставить так, что отладчик отваливается, и просто поменять порядок вызова функций (сначала func2, а потом func1) - отладчик не отваливается, память доступна и все счастливы =)
Повторюсь. Это на уровне оптимизации Level 0.
P.S. Отваливание отладчика еще и сопровождается "ввисанием" программы. Т.е. фактически я мониторю каждую выполненную функцию и после нее зажигаю светодиод. Так вот, если отладчик отваливается - не зажигается и светодиод. Когда я не под отладчиком, а просто прошил микроконтроллер и запустил на выполнение, все то же самое - светодиоды молчат. И где контроллер завис - не ясно.
http://www.keil.com/forum/20367/Ссылка по теме. Правда у них ULINK.
Сообщение отредактировал Arlleex - Jul 21 2015, 19:45