Do piszących w RIDE-51

Witam Mój post jest jakby kontyunuacją mojego poprzedniego postu . Problem w tym że jeżeli w programie użyję funkcji reszta z dzielenia ( % ), lub samego dzielenia to program się nie wykonuje . Na symulatorze programowym wszystko jest dobrze . Czy należy dodać jakąś bibliotekę (#include xxx ?? ) matematyczną ( liczby rozmiaru int ) , czy może gdzieś coś ustawia w preferencji projektu ? Proszę o pomoc bo brak mi już sił .

Z góry dziękuje

Reply to
kaldachar
Loading thread data ...

Mon, 20 Feb 2006 18:35:08 +0100 jednostka biologiczna o nazwie kaldachar <kaldachar(kaldachar)\"@interia.pl> wyslala do portu 119 jednego z serwerow news nastepujace dane:

Nie używam RIDE51, ale gdyby brakowało #include <xxxx> to program by się nie skompilował.

Reply to
BLE_Maciek

Tak też przypuszczam , ale może ktoś używa i wie w czym problem . Mnie już ręce opadają ( i nie tylko ;-) ).

Reply to
kaldachar

kaldachar przemówił ludzkim głosem:

Szkoda, że nie podałeś na jakich liczbach próbujesz to dzielenie modulo wykonać (8, 16, 32-bitowe; ze znakiem, czy bez) - wtedy by było wiadomo, czy program odwołuje się do biblioteki, czy wykorzystuje tylko sprzętowy rozkaz dzielenia. Najlepiej by było gdybyś poszukał w asemblerowych listingach miejsca, w którym znajduje się twoje dzielenie i wkleił fragment na grupę. Sprawdź też, czy nie próbujesz załadować programu większego niż pamięć w procesorze.

Reply to
Zbych

Proszę oto ten słynny listing :-)

; SOURCE LINE # 114

0002 75F00A MOV B,#00AH 0005 EF MOV A,R7 0006 84 DIV AB 0007 EE MOV A,R6 0008 2400 R ADD A,#hex_bcd 000A F8 MOV R0,A 000B A6F0 MOV @R0,B ; SOURCE LINE # 115 000D 75F00A MOV B,#00AH 0010 EF MOV A,R7 0011 84 DIV AB 0012 FF MOV R7,A

void Hex_bcd_16(unsigned int liczba) { char i ; for(i=0;i<=2;i++) { hex_bcd[i]=liczba%10 ; // linia 114 liczba=liczba/10 ; // linia 115 } }

----------------------------------------------------------------------- ; SOURCE LINE # 114

0006 AE00 R MOV R6,liczba 0008 AF00 R MOV R7,liczba+01H 000A E4 CLR A 000B FC MOV R4,A 000C 7D0A MOV R5,#00AH 000E 120000 R LCALL ?C_UIDIV 0011 EA MOV A,R2 0012 2400 R ADD A,#hex_bcd 0014 F8 MOV R0,A 0015 A605 MOV @R0,AR5 ; SOURCE LINE # 115 0017 AE00 R MOV R6,liczba 0019 AF00 R MOV R7,liczba+01H 001B E4 CLR A 001C FC MOV R4,A 001D 7D0A MOV R5,#00AH 001F 120000 R LCALL ?C_UIDIV 0022 8E00 R MOV liczba,R6

void Hex_bcd_16(unsigned int liczba) { char i ; for(i=0;i<=2;i++) { hex_bcd[i]=liczba%10 ; //linia 114 liczba=liczba/10 ; //linia 115 } }

--------------------------------------------------------------------

Reply to
kaldachar

kaldachar napisał(a):

To jest poprawny zapis . Przepraszam

Reply to
kaldachar

kaldachar przemówił ludzkim głosem:

Jak byś jeszcze odnalazł fizyczny adres procedury C_UIDIV i podał procesor, do którego to potem ładujesz, to można by jakieś wnioski wyciągnąć.

Reply to
Zbych

Zbych napisał(a):

Adres fizyczny to 00x2B a procesor to AT89c51

Reply to
kaldachar

kaldachar przemówił ludzkim głosem:

Powiem szczerze, że wszystko wygląda ok. Jedyne co mi jeszcze przychodzi do głowy co mogłoby rozłożyć program, to próba wywoływanie tych funkcji z obsługi przerwania (może funkcje biblioteczne nie są reentrant?), albo zbyt mało miejsca na stos.

Reply to
Zbych

Nie jestem zbyt biegły w środowisku RIDE-51 . W jaki sposób można zwiększyć rozmiar stosu ?

Reply to
kaldachar

Witam

Stos ma wymiar od najwyższego używanego adresu komórki pamięci RAM do końca tej pamięci. Przeanalizuj sobie początek programu *.HEX. Znajdziesz prawie na początku instrukcję MOV SP,#xx. Jest to początek stosu generowany przez kompilator, a wszystko to zawarte jest w startup.a51. Poczytaj Helpa.

Reply to
Zbych

Dziękuje poszukam :-)

Reply to
kaldachar

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.