zHz00 Untitled

понедельник, 20 марта 2017
23:59 Вавилонская башня
Микроконтроллер выдает HardFault (аппаратная ошибка). После какой конкретно строчки программы он туда вываливается по техническим причинам выследить невозможно.

Смотрю -- происходит это по адресу 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]);

@темы: Программирование, Борьба с техникой

URL
------------------ /userdir/0/0/6/5/0065/60495.jpg
---------------- /userdir/0/0/6/5/0065/60496.jpg
Я, наверное, схожу на эту постановку... http://bulvar.2...
А я и не знал... Оказывается есть люди, которых в жизн...
все добрые дела безнаказанными не остаются. решил дома ...
Я - создатель края. Не веришь? Нет, я не просто создатель...
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail