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

 
 
> бага в компиляторе?, 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
 
Start new topic
Ответов
Maxim
сообщение Jun 17 2005, 11:06
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 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
Сообщение #3





Группа: Новичок
Сообщений: 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



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

 


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


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