Перейти к содержанию
    

бага в компиляторе?

Представим 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 во второй")?

 

 

 

 

Ответ неверный :)

вторая функция работает правильно :) первая нет :) :smile3009:

 

я серьезно :)

 

при работе первой возникает ошибка: [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

}

 

////////////////////////////////////////////////////////////////////////////////

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Пишем:

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Пишем:

 

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

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

 

зверь :) как это читать ? :)

 

почему -=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]);

;

; }

; }

;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зверь :) как это читать ? :)

 

почему -=8?

 

// 13-8=5

это было в твоем примере

 

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

 

и зачем *p?

 

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

 

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

 

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

 

Я и написал, что ты берешь символ из указателя и отправляеш его putchar-ом куда надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

тогда функция будет еще проще:

void putstringus(char *p,int len)
{
  while(len--)
       putchar(*p++);
}

 

И ЭТО ВСЕ!!! :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

вроде ассемблерный код сгенерирован корректно;

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

Неплохо бы также проверить прерывания на предмет сохранения/восстановления регистров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    .dbfunc e putstringus _putstringus fV
;              b -> R22,R23
;              a -> R22,R23
;            ipp -> R22,R23
;            len -> R22,R23
;              p -> R20,R21

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в итоге не прокатывает, сойдемся на глючности putchara,

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

 

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

 

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

www.ourarsenal.narod.ru/coding/1.txt - HEX

 

надо будет потом его урезать а то аш 80% от device получилось, там емо можно вполне урезать до 50-60%

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    .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 компилятор выкинул за ненадобностью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...