Смотрю -- происходит это по адресу 0x1800 0000. Там как раз заканчивается настоящая оперативная память и начинает пустое адресное пространство. Ставлю точку останова по адресу 0x17FF FFFA -- недалеко от конца. Но она не срабатывает. Вывод -- в этот адрес упирается не программа, а данные.
Нахожу в коде следующий текст:
char out_buf[200];
char temp_buf[20];
int x;
int a,b,r[10];
// ---
//sprintf(out_buf,"%d\n",a);
sprintf(temp_buf,"%d\n",b);
strcat(out_buf,temp_buf);
for(x=0;x<10;x++)
{
sprintf(temp_buf,"%d\n",r[x]);//напечатать очередной кусок текста в строку
strcat(out_buf,temp_buf);//добавить к основной результирующей строке
}
//...
Вопрос о том, зачем нужны sprintf в прошивке, где в текстовых данных нет особой необходимости, оставляю за кадром. Так надо.
sprintf печатает в строку, strcat сшивает (конкатенирует) две строки.
Данный кусок выполняется в основном бесконечном цикле прошивки.
Первый вызов sprintf закомментирован. Он попал под раздачу, т.к. отвечал за одну из функций прошивки, которая была больше не нужна. Вместо её удаления, я её закомментировал. И правильно сделал. Благодаря этому я легко смог опознать, в чём же было дело.
Эта закомментированная строка писала в выходной буфер с его начала. А остальные операторы дописывали к его концу. Когда же я строку закомментировал, при каждой следующей итерации новые данные дописывались в конец строки. Которая всё удлинялась и удлинялась. Пока не упёрлась в конец памяти!
Решением в данном случае было дописать после закомментированной строки:
out_buf[0]='\0';
Тогда заполнение стало происходить с нуля каждый раз.
P.S. Только что подумал, что можно оптимизировать, сделав:
sprintf(out_buf+strlen(out_buf),"%d\n",r[x]);