Готов получить в свой адрес гнилые помидоры. Всё оказалось просто. Даже не просто, а очень просто.
Начал убирать файлы. Разумеется, по списку сверху. Файлы на "A", потом на "B", "C" итд. К счастью, весь алфавит перепахивать не пришлось, проблема отыскалась на букве "D" - display.c. Правда, сам файл я не убирал, а в ресурсах просто убрал дефайн #define HAVE_A_DISPLAY. и пришлось убрать вызов функции Configure(), которая на дисплее поддерживает конфигурационную менюшку. Ну вот и два подозреваемых: вывод на дисплей и конфигуратор. Оба они мне не нравятся. Написаны давно, потом к ним было еще кой-что приписано. Примерно как построил маленький домик, потом к нему второй этаж, потом на втором этаже балкон. потом мезонин, а потом гараж и веранду с возможностью установки лифта. В общем, так и хочется стереть и написать по-новой и покрасивей.
Но оказалось что там проблем нет. а проблема оказалась в этом месте:
Код: Выделить всё
case sl_bt_evt_sm_passkey_display_id:
{
uint32_t passkey = evt->data.evt_sm_passkey_display.passkey;
UART0_OutString("Show passkey: ");
UART0_OutUDec(passkey);
UART0_OutString("\r\n");
}
break;
угу, только там было на самом деле так:
Код: Выделить всё
case sl_bt_evt_sm_passkey_display_id:
{
uint32_t passkey = evt->data.evt_sm_passkey_display.passkey;
#ifdef HAVE_A_DISPLAY
char clpbrd[7];
*int2str(passkey, clpbrd, 0) = '\0';
putstr(0, 0, "Passkey ", 1);
putstr(0, 8, "clpbrd", 1);
#endif
UART0_OutString("Show passkey: ");
UART0_OutUDec(passkey);
UART0_OutString("\r\n");
}
break;
Т.е. пинкод разом отображался на oled дисплее и выводился в терминал. Так как дисплей у меня еще не подключен, не видел что там отображается. И когда я этот фрагмент закомментировал - всё заработало. Значит одна из этих функций "течёт". Которая int2str или putstr. откомментировал первую - проблемы нет, откомментировал вторую - проблемы нет. откомментировал третью: putstr(0, 8, "clpbrd", 1); - есть отказ. Думаю надо бы пройтись отладчиком. Ставлю брекпоинт, запускаю, захожу в функцию... Йолки-Палки. Функция описана:
Код: Выделить всё
void putstr(int x, int y, char * string, unsigned int invert)
Предполагалось, что пин-код будет выводиться с 8 знака в строке (это координата икс), а я засунул эту восьмёрку в координату игрек, т.е. номер строки. А строк всего 8. Т.е. с этим параметром вылетел за пределы экранного буфера куда-то в чужую память. Ну да, надо бы сделать валидацию или маску для аргументов функции...
вот так всё просто оказалось, а искал две с лишним недели.