реклама на сайте
подробности

 
 
> xc8 pic18f4525, странные глюки, Не могу разобраться, уже всю голову поломал
mich.bil
сообщение Jun 24 2014, 12:21
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 12-09-08
Из: Украина, Херсон
Пользователь №: 40 146



Всем привет, имею очень странные глюки с компилятором XC8 1.32, глюки повторяются в платном и не платном режиме.
Глюк - неправильная работа функции sprintf,

CODE
sprintf(text,"W %2dим %2d.%.2dл",counter,FORMAT_VOLUME_CL(counter_l));


при обработке формата %.2d, printf зависает, и забивает всю память пробелами.
раскопал dotprnt.c, ошибка происходит в куске

CODE
#ifdef WIDTH
if(width > c)
width -= c;
else
width = 0;
#endif


условие (width > c) периодически срабатывает не правильно, полез дизассемблер. Вот кусок сравнения sint8 и sint16:

width = 0x1F0 (16 знак бит)
с = 0x1F2 (8 бит знак)

CODE
!#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]. соответсвенно результат сравнения зависит не от операндов, а от предыдущего состояния памяти.
Помогите разобраться, очень похоже на глюк компилятора.

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th September 2025 - 10:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01798 секунд с 7
ELECTRONIX ©2004-2016