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

 
 
 
Reply to this topicStart new topic
> бага в компиляторе?, ICC7
mejia
сообщение Jun 17 2005, 10:20
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 12-06-05
Пользователь №: 5 952



Представим 2 функции

void putstringus(char *p,int len)
{
//13-8=5
int a,b;
int ipp;
a=len-8;
b=5;
for (ipp=0;ipp<b;ipp++)
{
putchar(p[ipp]);

}
}


и


void putstringus(char *p,int len)
{
//13-8=5
int a,b;
int ipp;
a=len-8;
b=5;
for (ipp=0;ipp<5;ipp++)
{
putchar(p[ipp]);

}
}



Как вы думаете какая из них будет работать а какая нет?

Скажете обе(различия в условии "for ipp<b в первой ipp<5 во второй")?




Ответ неверный smile.gif
вторая функция работает правильно smile.gif первая нет smile.gif smile3009.gif

я серьезно smile.gif

при работе первой возникает ошибка: [PC = $027B, Time = 34.18 ms, {UND}]: SREG bit 1 (Z) = X (undetermined)


при работе второй осуществляется вывод по компорту.....


на всякий случай выдам блок инициализации, хотя я считаю что это чистая математика, и регистры тут не причем но все же:



///////////////////////// INITIALISATION OF DEVICES ////////////////////////////
void port_init(void)
{
DDRB =0xFF; //init port B na vixod
PORTB = 0x00; //vkl all
PORTD = 0x7F; //port vkl
DDRD = 0x00; //vse na vxod
}

//call this routine to initialise all peripherals

void init_devices(void)
{
CLI();

port_init();
uart0_init();

SREG = 0xFF;
MCUCR = 0x00;
GIMSK = 0xF0; //obshii registr maski prerivanii
GIFR = 0xF0;
TIMSK = 0xFF; //0x00
TIFR=0xFF

SEI();

}

//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9600 (0,0%)
//
void uart0_init(void)
{
UCR = 0x00; //disable while setting baud rate

UBRR = 0x17; //set baud rate
// UBRR = 0x23; //set baud rate
UCR = 0x99; //enable //bit 7 -prerivanie po okonc. priema
//bit 4 -razr priema
//bit 3 -razr peredatchika
}

////////////////////////////////////////////////////////////////////////////////
Go to the top of the page
 
+Quote Post
vet
сообщение Jun 17 2005, 10:50
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Хотелось бы глянуть на соответствующий кусок итогового ассемблерного кода (это в файле с расширением .S) в обоих случаях.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Maxim
сообщение Jun 17 2005, 11:06
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 24-06-04
Пользователь №: 165



Чего заморачиваться? Надо писать проще. Я понял так, что надо вывести строку символов p длиной len.

Пишем:

Код
void putstringus(char *p,int len)
{
//13-8=5
   for (len -= 8; len; len--)
        putchar(*p++);
}

И небудет никаких багов.
Go to the top of the page
 
+Quote Post
mejia
сообщение Jun 17 2005, 11:37
Сообщение #4





Группа: Новичок
Сообщений: 12
Регистрация: 12-06-05
Пользователь №: 5 952



Цитата(Maxim @ Jun 17 2005, 14:06)
Чего заморачиваться? Надо писать проще. Я понял так, что надо вывести строку символов p длиной len.

Пишем:

Код
void putstringus(char *p,int len)
{
//13-8=5
   for (len -= 8; len; len--)
        putchar(*p++);
}

И небудет никаких багов.
*


зверь smile.gif как это читать ? smile.gif

почему -=8?

и зачем *p?

идея в том что приходит char *p и его длина len

нужно начиная от начала массива( с 0 элемента и доконца) побайтно(почарно) вывести на экран(в компорт)

длинна сообщения колеблится от 1 до х.з. байт







вот вроде кусок .s


; //////////////////////////////////////////////////////////////
; void main(void)
; {
.dbline 62
;
; init_devices();
rcall _init_devices
.dbline 63
; svetomusic_onstart_start();
rcall _svetomusic_onstart_start
L2:
.dbline 64
L3:
.dbline 64
rjmp L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e putstringus _putstringus fV
; b -> R22,R23
; a -> R22,R23
; ipp -> R22,R23
; len -> R22,R23
; p -> R20,R21
.even
_putstringus::
rcall push_gset2
mov R22,R18
mov R23,R19
mov R20,R16
mov R21,R17
.dbline -1
.dbline 73
; while(1);
;
;
; }
;
;
;
; // getting byte from COM PORT
; void putstringus(char *p,int len)
; {
.dbline 77
; //13-8=5
; int a,b;
; int ipp;
; a=len-8;
subi R22,8
sbci R23,0
.dbline 78
; b=5;
ldi R22,5
ldi R23,0
.dbline 79
; for (ipp=0;ipp<5;ipp++)
clr R22
L6:
.dbline 80
.dbline 81
mov R30,R22
mov R31,R23
add R30,R20
adc R31,R21
ldd R16,z+0
rcall _putchar
.dbline 83
L7:
.dbline 79
subi R22,255 ; offset = 1
sbci R23,255
.dbline 79
cpi R22,5
ldi R30,0
cpc R23,R30
brlt L6
.dbline -2
L5:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r b 22 I
.dbsym r a 22 I
.dbsym r ipp 22 I
.dbsym r len 22 I
.dbsym r p 20 pc
.dbend
.dbfunc e putstringuss _putstringuss fV
; a -> R20,R21
; b -> R20,R21
; ipp -> R22,R23
; len -> R20,R21
; p -> R10,R11
.even
_putstringuss::
rcall push_gset3
mov R20,R18
mov R21,R19
mov R10,R16
mov R11,R17
.dbline -1
.dbline 86
; {
; putchar(p[ipp]);
;
; }
; }
; void putstringuss(char *p,int len)
; {
.dbline 90
; //13-8=5
; int a,b;
; int ipp;
; a=len-8;
subi R20,8
sbci R21,0
.dbline 91
; b=5;
ldi R20,5
ldi R21,0
.dbline 92
; for (ipp=0;ipp<b;ipp++)
clr R22
clr R23
rjmp L14
L11:
.dbline 93
.dbline 94
mov R30,R22
mov R31,R23
add R30,R10
adc R31,R11
ldd R16,z+0
rcall _putchar
.dbline 96
L12:
.dbline 92
subi R22,255 ; offset = 1
sbci R23,255
L14:
.dbline 92
cp R22,R20
cpc R23,R21
brlt L11
.dbline -2
L10:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r a 20 I
.dbsym r b 20 I
.dbsym r ipp 22 I
.dbsym r len 20 I
.dbsym r p 10 pc
.dbend
.area vector(rom, abs)
.org 14
rjmp _get_result
.area text(rom, con, rel)
.dbfile C:\Programming\chip\nemesis.c
.dbfunc e get_result _get_result fV
; te -> R20
.even
_get_result::
rcall push_lset
rcall push_gset1
.dbline -1
.dbline 101
; {
; putchar(p[ipp]);
;
; }
; }
;
Go to the top of the page
 
+Quote Post
Maxim
сообщение Jun 17 2005, 12:32
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 24-06-04
Пользователь №: 165



Цитата(mejia @ Jun 17 2005, 14:37)
зверь smile.gif как это читать ? smile.gif

почему -=8?
*


// 13-8=5
это было в твоем примере

len -= 8 надо читать так: len = len-8;

Цитата(mejia @ Jun 17 2005, 14:37)
и зачем *p?

идея в том что приходит char *p и его длина len

длинна сообщения колеблится от 1 до х.з. байт

нужно начиная от начала массива( с 0 элемента и доконца) побайтно(почарно) вывести на экран(в компорт)
*


Я и написал, что ты берешь символ из указателя и отправляеш его putchar-ом куда надо.
Go to the top of the page
 
+Quote Post
Maxim
сообщение Jun 17 2005, 12:42
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 24-06-04
Пользователь №: 165



Цитата(mejia @ Jun 17 2005, 14:37)
длинна сообщения колеблится от 1 до х.з. байт
*


тогда функция будет еще проще:
Код
void putstringus(char *p,int len)
{
  while(len--)
       putchar(*p++);
}


И ЭТО ВСЕ!!! biggrin.gif
Go to the top of the page
 
+Quote Post
vet
сообщение Jun 17 2005, 12:49
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(mejia @ Jun 17 2005, 15:37)
вот вроде кусок .s
*

вроде ассемблерный код сгенерирован корректно;
возможно, есть ошибка в функции putchar, которая выражается в том, что портятся регистры r10,r11 или R20-R23.
Неплохо бы также проверить прерывания на предмет сохранения/восстановления регистров.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Maxim
сообщение Jun 17 2005, 13:05
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 24-06-04
Пользователь №: 165



Цитата(mejia @ Jun 17 2005, 14:37)
Код
    .dbfunc e putstringus _putstringus fV
;              b -> R22,R23
;              a -> R22,R23
;            ipp -> R22,R23
;            len -> R22,R23
;              p -> R20,R21

*


А в компилаторе и точно баг. Все переменные располагаются в одних и техже регистрах R22 и R23, кроме указателя p!
Go to the top of the page
 
+Quote Post
mejia
сообщение Jun 17 2005, 13:05
Сообщение #9





Группа: Новичок
Сообщений: 12
Регистрация: 12-06-05
Пользователь №: 5 952



в итоге не прокатывает, сойдемся на глючности putchara,
хотя для меня это и загадка когда по байтно посылать в путчар все работает, это не главное

главное что все что хотел сделать на микрочипе работает так что если у кого есть микросхемка AT90S2313 и порт B подключенный к 8 светодиодам то

www.ourarsenal.narod.ru/coding/nemesis.txt - C++
www.ourarsenal.narod.ru/coding/1.txt - HEX

надо будет потом его урезать а то аш 80% от device получилось, там емо можно вполне урезать до 50-60%
Go to the top of the page
 
+Quote Post
vet
сообщение Jun 17 2005, 13:24
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(Maxim @ Jun 17 2005, 17:05)
Цитата(mejia @ Jun 17 2005, 14:37)
Код
    .dbfunc e putstringus _putstringus fV
;              b -> R22,R23
;              a -> R22,R23
;            ipp -> R22,R23
;            len -> R22,R23
;              p -> R20,R21

*


А в компилаторе и точно баг. Все переменные располагаются в одних и техже регистрах R22 и R23, кроме указателя p!
*


А это не баг, переменные a,b,len компилятор выкинул за ненадобностью.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

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

 


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


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