Alloca() funktio PPC:llä

Saku-foorumi » Uusi sukupolvi: Muut » Viestit 2007 » Alloca() funktio PPC:llä « Edellinen Seuraava »

Kirjoittaja Viesti
 

allu
Torstaina, 31. toukokuuta, 2007 - klo 15.12:   
Törmäsin töissä kiperään pulmaan liittyen alloca() funktion käyttöön PPC:llä. Josko täällä joku tietäisi asiasta jotain.

Alustana Virtex4(???) ja powerpc-eabi-gcc:n joku versio. Lisäksi mukana pyörii ainakin joitakin xilkernelin osia.

Alloca() funktiota ei löydy mistään kirjastosta vaan gcc hanskaa sen ns. builtin funktiona. Ongelma ei kuitenkaan ole tässä.

Ongelma on että ensimmäisen alloca() kutsun jälkeen ohjelma jumahtaa siten ettei edes väylällä tapahdu mitään. Itse alloca():sta "palataan" normaalisti. Seuraavaksi tulostetaan tekstiä käyttäen uart:ia ja ainoastaan ensimmäinen merkki tulee pihalle.

En edes tiedä onko vika loppujen lopuksi alloca():n käytössä vaan sohlottaako esim. keskeytykset jotain.

Mutta haluan tietää jos joku olisi kokenut samankaltaisia ongelmia. Vai liittyykö ongelma pino-osoittimen käyttöön? PPC:ssähän ei ole hw-pinoa vaan r1:stä käytetään sw-pino osoittimena.

Vinkkejä?

 

Piru
Torstaina, 31. toukokuuta, 2007 - klo 15.16:   
alloca toimii kyllä, eli ongelma lienee muualla.

 

Joanna
Torstaina, 31. toukokuuta, 2007 - klo 15.21:   
Jos Uart tulostus alkaa mutta jumittuu kesken kannattaa varmistaa miten tuo Uartti toimii.. Siis pitääkö jokaisen merkin jälkeen pollata bufferin vapautumista jostain staturrekisteristä vai tuleeko interrupti. EN tiedä 100 varmaksi, mutta ainakin ymmärtäisin että tuo Uart jota käyttää on FPGA koodilla toteutettu, eli kannattaa varmistaa että sen IRQ on johdotettu kiinni PPC-coreen.

 

allu
Perjantaina, 1. kesäkuuta, 2007 - klo 10.30:   
alloca:n toimivuuteen uskon kyllä itsekin. Sillä ei montaa sivuvaikutusta ole mutta jokin aiheuttaa ongelmia.

Uart todellakin on FPGA:lla tehty. Tulostuksessa käytän xilkernelin omaa xil_printf() funtiota joka käyttää käsittääkseni loppupelissä putch() funktiota. putch() funktiota tutkiessani siellä ei tehdä muuta kuin lyödään merkki uart:in lähetysfifoon ja odotetaan että merkki on pihalla. Eli ei keskeytyksiä. Mikä on ihan hyväkin jossain debuggaustapauksissa.

Toisaalta, omat lopulliset uart-ajurit käyttävät keskeytyksiä ja niiden tuki onkin otettu käyttöön käännettäessä FPGA koodia. Vois ehkä johtua tästä... Harmittavasti matalan tason keskeytyskäsittely ei ole omaa tekoa, joten en vielä tiedä mitä siellä tapahtuu.

Joka tapauksessa, nyt menen laittamaan debuggerin tulille josko sillä sais selkoa asiaan. Jos debuggerin saa toimiin....

Kiitos vinkeistä.

 

Joanna
Perjantaina, 1. kesäkuuta, 2007 - klo 14.17:   
Tuli mieleen että onko tuossa Uartissa varmasti riittävän iso Fifo (tai yleensä Fifo aktiivisena) koska jos sinne tungetaan enemmän merkkejä kuin mahtuu niin sen toiminta luultavasti sekoaa jollain tuollaisella tavalla.

Yleensä Uarteissa (en tunne Xilinxin coreja) on joku rekisteri josta näkee mahtuuko niihin lisää merkkejä, sen lukeminen välillä voisi auttaa?

 

allu
Lauantaina, 2. kesäkuuta, 2007 - klo 15.16:   
Jee, ongelma on ratkennut. En edes kehtaa kertoa mikä oli vialla :D. Mutta sanotaan niin että olis (jälleen) pitänyt tarkistaa ihan perusasiat uudestaan. Mutkun on kiire ja blaa blaa...

Uartin fifo ei ole kuin 16 sanaa. Putch() tutkii ensin ettei fifo ole täynnä ja odottelee jos on.

 

JPQ
Lauantaina, 2. kesäkuuta, 2007 - klo 16.57:   
allu: pitäs kertoa kyllä että muut osaa varoa.

 

allu
Sunnuntaina, 3. kesäkuuta, 2007 - klo 12.56:   
nooh, nyt sille osaa jo nauraa :)... Pinoa ei oltu määritelty kuin 1024 tavua ja se oli sijoitettu heti vektorialueen jälkeen. Sinänsä hyvä paikka koska pinon loppuminen aiheuttaa takuuvarmasti välittömästi ongelmia.

Mutta puoltoista päivää siihen meni että jaksoi tarkistaa linkkeriskriptin uudelleen. Sattuuhan sitä.

 

JPQ
Sunnuntaina, 3. kesäkuuta, 2007 - klo 21.07:   
allu: kyllä toi muakin vähän naurattaa vaikka minäkin olen möhliny.

 

Joanna
Maanantaina, 4. kesäkuuta, 2007 - klo 0.28:   
allu: se on joskus systeemikutsujen kanssa sellaista että missään ei sanota paljonko ne oikeasti vie stackkia niin joutuu arvailemaan.

 

allu
Maanantaina, 4. kesäkuuta, 2007 - klo 14.13:   
Joanna: Tässä tapauksessa kyse ei ollut edes mistään tuntemattomasta funktiosta vaan oman schedulerin taskien pinon varauksesta. Luonnollisesti tiesin tarkkaan paljonko pinoa varataan per taski.

Mutta on ihan totta mitä sanoit. Esimerkiksi jos pyöritän scheduleria Windows:in alla, niin printf:n käyttö jossain taskissa pompsauttaa pinotarpeen heti 20K ylöspäin. Normaalisti se ei haittaa Windows:in dynaamisesti kasvavan pinon takia mutta ongelmia syntyy kun olen jakanut pinon keinotekoisesti omille taskeille.

 

itix
Lauantaina, 9. kesäkuuta, 2007 - klo 14.42:   
Usein onkin hyvä tarkkailla vapaan pinon määrää, näin varsinkin laiteläheisessä ohjelmoinnissa...

Lisää viestisi tähän
Viestisi:
Käyttäjätunnus: Postitus informaatiota:
Tämä on yksityinen keskustelupalsta. Vain rekisteröidyt käyttäjät ja moderaattorit voivat postittaa tänne.
Salasana:
valinnat: Aktivoi URL:t automaattisesti tässä viestissä
Toimenpide: