mich.bil 0 24 июня, 2014 Опубликовано 24 июня, 2014 · Жалоба Всем привет, имею очень странные глюки с компилятором XC8 1.32, глюки повторяются в платном и не платном режиме. Глюк - неправильная работа функции sprintf, sprintf(text,"W %2dим %2d.%.2dл",counter,FORMAT_VOLUME_CL(counter_l)); при обработке формата %.2d, printf зависает, и забивает всю память пробелами. раскопал dotprnt.c, ошибка происходит в куске #ifdef WIDTH if(width > c) width -= c; else width = 0; #endif условие (width > c) периодически срабатывает не правильно, полез дизассемблер. Вот кусок сравнения sint8 и sint16: width = 0x1F0 (16 знак бит) с = 0x1F2 (8 бит знак) !#ifdef WIDTH ! if(width > c) 00 0xA3C: MOVLW 0x80 // w=0x80 01 0xA3E: MOVLB 0x1 // bank = 1 02 0xA40: BTFSC 0xF2, 7, BANKED // если с < 0 03 0xA42: MOVLW 0x7F //w = 0x7f 04 0xA44: MOVWF 0xE7, BANKED /// *(0x1E7) = w запись временного значения 05 0xA46: MOVF 0xF0, W, BANKED // w = LOW(width) 06 0xA48: SUBWF 0xF2, W, BANKED // w = LOW(width) - c 07 0xA4A: MOVF 0xF1, W, BANKED // w = HIGH(width) 08 0xA4C: XORLW 0x80 // w = w ^ 0x80 09 0xA4E: MOVLB 0x0 // bank = 0 10 0xA50: SUBWFB 0xE7, W, BANKED // w = w - *(0x0E7) 11 0xA52: BC 0xA64 // переход если Сarry ! width -= c; Проблема с кодом, в том что промежуточная переменная пишется в банк 1 [строка 4], а читается из уже из банка 0 [строка 10]. соответсвенно результат сравнения зависит не от операндов, а от предыдущего состояния памяти. Помогите разобраться, очень похоже на глюк компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mich.bil 0 25 июня, 2014 Опубликовано 25 июня, 2014 · Жалоба Похоже на глюк компилера, у других людей похожие проблемы : microchip forums Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться