 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
LEDuser Član


Pridružen-a: Pon 31 Mar 2008 12:06 Prispevkov: 1104 Aktiv.: 5.27 Kraj: Ljubljana
|
Objavljeno: Pon Dec 17, 2012 4:10 pm Naslov sporočila: Stack overflow? |
|
|
Prišel sem že na rob z živci in sprašujem, če ima kdo idejo kaj bi bil lahko problem oz. kakšna bi lahko bila rešitev.
V Bascom AVR pišem program za GPRS/SMS komunikacijo z main boardom na katerem je atmega2560 in SIM548C. Program je postal že kar obsežen in se mi pregled nad njim že malo zmanjšuje, zato bom težje razložil moj problem.
Moj problem se začne, ko vključim GSM modem in pošljem ukaze za inicializacijo (AT, AT+IPR, AT+CMGF=1, ...). Ko dobim odgovor "Call Ready" pregledam za vrednost signala z (AT+CSQ). Za debug uporabljam prvi HW UART na katerega pošljem vrednost signala. Tukaj pa se zadeva zelo zmeša. Na HW UART na katerega pošljem samo "RSSI: " in vrednost signala vmes pa se mi pomeša še "CME ERROR: 10", ki pa je v kodi vpisan samo v sprejemni rutini in to v IF stavku.
Še bolj čudno je ker uporabljam buffer UART za sprejem, za oddajo pa brez buffra. Res, da imam uporabljene vse HW UARTe, a to ne bi smelo povzročati težav.
Sumim, da je moj problem v stack overflow-u ne vem pa kako bi to rešil. igral sem se z različnimi vrednostmi nastavitev stack-a ampak je vedno enako. Uporabljam:
$hwstack = 128
$swstack = 96
$framesize = 64
Ali mogoče kdo ve kako bi na hitro preveril, ali je res problem v stacku ali naj vzrok iščem drugje.
Koda za izpis v main (DO-LOOP):
Koda: |
If Signal <> 0 Then
Print "RSSI: " ; Signal
Signal = 0
End If
|
Koda za sprejem:
Koda: |
'********** GSM UART ISR **********
'-------------------------------------------------------------------------------
Serial1charmatch:
If _rs232inbuf1(_rs_bufcountr1 -1) = 13 And _rs_bufcountr1 > 2 Then
Input #2 , Gsm , Noecho
Gsm_len = Len(gsm)
If Gsm = "Call Ready" Or Gsm = "+CPIN: READY" Then
Gsm_ready = 1
Set Gsm_check_signal
Elseif Left(gsm , 6) = "+CSQ: " Then
B_gsm_temp = Charpos(gsm , ",")
If B_gsm_temp < Gsm_len Then
Str_temp = Mid(gsm , 7 , B_gsm_temp)
Signal = Val(str_temp)
If Signal > 0 And Signal <= 32 Then
Signal = Signal * 2
Signal = Signal - 113
End If
End If
Elseif Gsm = "+CME ERROR: 10" Then
Gsm_off = 1
End If
Gsm = ""
End If
Clear Serialin1
Return
|
Odgovor na prvem HW UART-u:
Koda: |
GSM vklopljen
RSSI: CME ERROR: 1099
RSSI: CME ERROR: 10-75
|
Pritisk na tipko pošlje na GSM modem "AT+CPIN?" (spodaj celoten pogovor, 2x pritisnjena tipka na koncu):
Koda: |
AT
AT
AT+IPR=0
AT+CMGF=1
AT+CLIP=1
AT+CIPSPRT=1
AT+CPIN?
AT+CSQ
AT+CSQ
AT+CPIN?
AT+CSQCME ERROR: 10
AT+CPIN?
AT+CSQCME ERROR: 10
|
[/code] _________________ Razsvetljujemo od leta 1920! |
|
Nazaj na vrh |
|
 |
LEDuser Član


Pridružen-a: Pon 31 Mar 2008 12:06 Prispevkov: 1104 Aktiv.: 5.27 Kraj: Ljubljana
|
Objavljeno: Pon Dec 17, 2012 4:17 pm Naslov sporočila: |
|
|
Naj pokažem še init UART-ov:
Koda: |
Config Com1 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com3 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com4 = 4800 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 20 , Bytematch = 10
Config Serialin1 = Buffered , Size = 150 , Bytematch = 10
Config Serialin3 = Buffered , Size = 100 , Bytematch = 10
Open "COM2:" For Binary As #2
Open "COM3:" For Binary As #3
Open "COM4:" For Binary As #4
|
_________________ Razsvetljujemo od leta 1920! |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.71 Kraj: Kranj - struževo
|
Objavljeno: Pon Dec 17, 2012 7:36 pm Naslov sporočila: |
|
|
Kaj se zgodi, če program povsem oklestiš oziroma začneš ven brisat najbolj nepotrebne dele kode in nato še najbolj nepotrebne globalne spremenljivke.
Imaš kakšne interrupte? Obstaja možnost, da se ti interrupt rutine gnezdijo ena v drugo, ko prejšnja še ni zaključena? _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5529 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Pon Dec 17, 2012 8:19 pm Naslov sporočila: |
|
|
Se dogaja nakljucno ali vedno?
Ce prvo, prihaja do tega prej, ce zmanjsas stack?
Ce drugo, se zgodi kaj drugace, ce spremenis dolzino stringov oz. dolzino bufferja za uart?
Lp, g _________________ ...lahko pa se tudi motim ... |
|
Nazaj na vrh |
|
 |
Tomazp Član


Pridružen-a: Sob 02 Feb 2008 13:24 Prispevkov: 559 Aktiv.: 2.64 Kraj: Ljubljana
|
Objavljeno: Tor Dec 18, 2012 8:45 pm Naslov sporočila: |
|
|
Sam sem v Cju imel težavo, da so prej delujoče rutine prenehale delovati oz. so delale samo nekatere. Posumil sem na stack. Pa sem našel, da AVR GCC sam upravlja s stackom in da daje vedno maksimalno vrednost stecka. Nato pogledam količino zasedenega pomnilnika. Bila je cca. 98%, kar pomeni da sem bil praktično skoraj brez stacka. Po čiščenju programa je bilo vse bp. Morda je tudi v bascomu kaj podobnega. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|