Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
A processzornak mindegy hogy (A - RAM B - FLASH csak példaként) 0xA000... vagy 0xB000... ről olvas, cím-cím.
Ezt értem, de a korábbi PIC-ekben ezt ha jól tudom, nem lehetett megtenni (már csak a program és a RAM memória eltérő szélessége miatt sem, és egyébként se).
A hozzászólás módosítva: Ápr 13, 2018
Az mx valami 20 mhz-es órajelen tudta várakozás nélkül olvasni a flash-t, afölött várakozási ciklusokat iktatott be. De az csak akkor van, ha a chace ki van kapcsolva, mert egyébként van egy normális predict, és cache line-okat olvas előre. Ha sorfolytonos az utasítás végrehajtás, és nincsen szanaszét ugrándozás, akkor gyakorlatilag várakozási idő nélküli a sorfolytonos utasítás végrehajtás még 80 mhz-en is, nem kell extrában cache-elni semmit. Mindaz az mx. Az mz-vel én még mindig nem kötöttem szorosabb barátságot, nem ismerem a sebesség paramétereit, de az a gyanúm, hogy valamennyire ott is átgondolták a cache line-okat. De persze attól még pocsékolhatod a jobb sorsra érdemes - örökké kevés - ram-ot is, ha éppen ahhoz van kedved
![]()
Sziasztok!
Elkezdtem a Harmony-t használni és ezen belül a az USART driver-t Queue-vel egy Nextion-os kijelzőhöz. (most nem lényeg hogy a Harmony ilyen vagy olyan...) PIC32MZ(1024EFF100)-ra íródik a kód és a lábszám + C++ miatt volt lényeges az MCU nem a sebesség miatt, tehát az optimalizálás nem feltétlen lényeges elem. Úgy akarom/akartam megírni a Nextion-al való UART-os kommunikációt hogyha írok/olvasok UART-ról egyik esetben se blokkolja a CPU-t. Vegyünk példa képpen egy gombot. Van egy SetText és egy GetText függvény a SetText egyenlővé teszi a string-et az új szöveggel és billent egy flag-et a GetText meg csak return-öl ezzel a string-el. Amikor a kód a flag vizsgálatához ér és látja hogy a szöveg megváltozott akkor elküldi a Nextion-nak. Na eddig tök jó csak a default értéke a szövegnek nincs meg. Ezt úgy oldottam meg hogy mikor létre jön egy objektum billent egy Init flaget ami elkezdi lekérni a kijelzőtől adott objektum paramétereit. Szóval "becache"-elem az adatokat. És a kérdés erre vonatkozik, hogy ez mennyire használt/használható út, hogy induláskor egy tárolóba be pakolgatom (jelen esetben) egy Nextion kijelző objektumainak az adatait, hogy a procinak mikor kell neki ne kelljen rá várnia? Vagy erre jobb megoldás egy GetTextAsync függvény ami akkor tér vissza true-val ha beállítódott a megfelelő értékre a szöveg és ennek kezelését a fő szálra bízom?
Teljesen jó a cache, csak igény szerint arra figyelj majd, hogy ha több adatod is van, amik logikailag összetartoznak, akkor azokat ne túl nagy időkülönbséggel gyorsítótárazd be, mert azzal gyártasz egy alkalmazás szintű hibát.
Igen nekem is valami ilyenből indult a kérdés. Elindul az elején és én mondjuk beolvasás közben ráírok a szövegre akkor az komoly probléma, de ezt azért engedtem el, mert az alkalmazásnak induláskor sok alacsonyabb szintű perifériával kell kommunikálnia és nem lényeg, hogy a kijelző menjen.
És mivel szét van szedve minden taskokra, miközben az alacsonyabb rendű perifériára (pl hőmérő, hogy megfelelő e a hőmérséklet) "várok" addig szépen megy a cache-elés. De most ~13ms egy gomb. ezzel most próbálok játszani, hogy párhuzamosítom az inicializálást, és amíg van szabad R/W Queue addig kérem le az adatokat egyszerre több objektumról is aztán amikor elfogy "várok". Egyenlőre még nem megy, runtime exception kapok ![]() Egyébként egy EERAM-nál is ezt csináltam, mivel nem kell sok adatot tárolni csak külső tároló legyen, 256Byte-ot beolvasok így az mindig azonnal visszakapom, ha meg írom itt is billentek egy flag-et.
Érdekes!
A Harmony-ban 10 mélységű Queue volt beállítva átírtam 64-re megszűnt a hiba és így írtam a kódot megszűnt vissza írtam 10 és nem jött vissza a hiba, úgyhogy nem tudom mi volt a probléma de megoldódott.
Sziasztok,
PIC32-t programozok, van egy tömböm: uint8_t number[12]; A tartalma pl +36012345678, nincs lezáró karakter, mert nem kell beilleszteni az AT parancsomba. Ezt egy függvénynek adom át, mint paraméter:
A probléma, hogy időnként a tömb tele lesz kérdőjelekkel, az összes karakter kérdőjelre cserélődik le. Van hogy az első, van hogy csak a 100-adik függvény meghívásakor. Van ötletetek?
Hol van deklarálva a tömb? Arra gondolok, hogy esetleg nem jó helyen (egy függvényen belül) és ezért a területet másra is használja a fordító. Valamint használd a volatile beállítást is a deklarálásnál.
Köszi a tippet!
Jó helyen van elméletileg deklarálva, az egyik .c fájl legelején, tehát globális változó. A volatile nem csak akkor kell ha megszakításban hekkelek? Illetve pontosabban ha írom a változót? Mert ezt a változót amikor előjött a hiba nem módosította semmi és senki, egyszercsak megkukult. A telefonszámot LCD kijelzőn gombokkal lehet módosítani. Az sem gond hogy nincs lezáró karakter? Mert ahogy az AT parancsba beillesztem oda nem kell, ezért a menübe sem raktam. Mindenesetre a volatile-ot kipróbálom!
Az még nem globális változó így, csak modul szintű legfeljebb!
Na de mit csinál a függvény ezzel a tömbbel ? Hiába írsz ide le prezentáció gyanánt egy üres függvényt, abból nem fog kiderülni, hol a hiba!
Miért kellene a volatile-t használnia???
Idézet: Miért ne lenne globális? Ha nem irta elé szándékosan, hogy static, akkor az bizony globális.„Az még nem globális változó így, csak modul szintű legfeljebb!” Aban 100%-ig egyetértek veled, hogy a kód ismerete nélkül sok okosat nem lehet mondani a problémára. A hozzászólás módosítva: Máj 9, 2018
A kód ismerete nélkül csak találgatni lehet.
Próbáld megtalálni azt a pontot amikor módosul a memória tartalma. Okozhatja egy hibásan megírt rutin is, ami túlír pl. egy tömböt.
Én szeretem, ha nem regiszter másolatból olvassa ki a program az értéket, hanem a memóriából közvetlenül, még ha ez lassabb is.
Lehetséges a túlírás is valóban. Elég alattomos hiba, nehéz megtalálni...
Akkor lenne globális, ha tudnál rá hivatkozni más modulban! De csak akkor tudod ezt megtenni, ha elérhetővé teszed más modulok számára is a változót(...extern...)
Kissé elmentünk szőrszálhasogatás irányba
![]() A deklaráció módja nem zárja ki a globális használatot. Azt az egy bizonyos extern ... sort elhelyezheted több helyen is. De nem ettől módosul vagy marad változatlan a változó tartalma.
Ez nem szőrszálhasogatás!
Nem attól globális egy változó, hogy mikor és hogyan módosul a tartalma, hanem hogy bárhonnan elérheted! A statikusnak deklarált változók is végig élnek, holott akár csak egy függvényen belül értelmezett mindössze.
Hali!
Az első kérdés: uint8-ba hogy teszel bele ekkora számot? Vagy karakterenként gondoltad a tömb elemeibe egyenként? de akkor miért így írtad? Ha karakterenként, akkor binárisan, vagy ascii-ban van? Nem valai ilyesmit nézel be?
Sziasztok!
Való igaz, így majd beszédesebb lesz a dolog. Bemásolom a majdnem az összes idevágó kódrészletet. A lényeg, hogy ez egy GSM-es eszköz, a menüjében beállíthatóak a 12 karakteres ASCII számok, a tömb 1-1- eleme egy egy szám a telefonszámból. FRAM-ban vannak tárolva az adatok. Tartozik minden telefonszámhoz egy változó ahol megadjuk, hogy engedélyezve van-e a szám vagy sem. Megy az eszköz szépen, küldözgeti az SMS-eket és egyszercsak gondol egyet, jön a GSM hiba, amikor hallom a hibáról a hangjelzést akkor már csak azt látom, hogy mindig csak az engedélyezett telefonszámnál a szám így néz ki: +????????????, ezért is kapok GSM hibát, mert a modul erre a számra nem tud küldeni. Kb. két hónapja van ez a hibám, a szívás azért van, mert van hogy két hétig elő sem jön! Jöjjön a kód: Változók deklarálása:
Ez mindig indulás után fut le, betölti az adatokat az FRAM-ból:
A csoportos SMS küldő függvényem:
Az egy telefonszámra SMS-t küldő függvényem:
A soros portra sztring kiküldő függvényem:
Plusz egy részlet a menüből, ahol egy telefonszámot be lehet állítani és engedélyezni lehet:
Előre is köszönöm szépen a segítő szándékot! Nem gondoltam, hogy ennyien lesztek! ![]() Szerk.: Van még egy szekció, ahol azonosítom, hogy mely számról érkezett SMS, mert az eszközt lehet SMS-el vezérelni és ha megfelelő számról érkezett az SMS, a menüben engedélyezve is van, akkor végrehajtja a parancsot és küld visszaigazolást. De ez sem adhat értéket:
A hozzászólás módosítva: Máj 9, 2018
Hali!
Szerintem valahol túlcsordulsz, és felülírod a stringed... A számokban a ? az valóban asci ? vagy "valami" ami így jelenik meg, meg kellene nézni pontosan, lehet informatív... Esetleg kavard meg a változók sorrendjét, változik-e a hiba hogy mást ír szét. A tápod rendben van? A gsm-ek szeretik megrángatni a tápot, ha ettől a pic ram felejt... Brownout van? Gsm modul adáskor nem szórja meg keményen az egész procis rendszert? árnyékolás?
Szia!
Pickit3-al debuggoltam, a proci pic32mz2048efh100. Debuggoláskor is kérdőjeleket írt a változó értékére, úgyhogy valószínűsíten ascii, illetve kiírni is ascii-ben írom. Keresgélek még errefelé is. A táp bombabiztos, külön a pic-nek és a gsm-nek szintillesztve, nem szórhatja meg a pic-et, illetve egyszer már stabilan ment, egy sw upgrade-kor került bele, de nem emlékszem mit és mikor változtattam pontosan. Kb 10cm-re van a gsm modul a procitól. Külön step-down-ról megy, ripple filter-el és a gsm táp 3A-es, a pic 1 vagy 2A-es. Ha esetleg még van tipp akkor szívesen fogadom és utánanézek.
A TxB hol van és milyen módon deklarálva ?
Szintén globális változó, uint8_t TxB[255].
Közben megnéztem, tényleg ASCII kérdőjel van a változóban, decimálisan 63 decimálisan.
Tehát a modulból bármi hozzáférhet...
Erre mi szükség van ? strcpy(TxB, buffer); Illetve az adatok már a buffer tömbben rosszak, vagy a TxB-ben rosszak csak ?
Már a Tx-ben rosszak. Az strcpy szerintem még anno maradt benne amikor azt a részt teszteltem és ellenőriztem mi folyik ott.
Azért rossz már a buffer tömbben, mert a gsm_phone_X_nr változóban is rosszak már.
Elsőre én nem látok semmi rendkívülit a kódokban.
Viszont, mivel mindenhová címeket adsz át, így lényegében az összes függvényt meg kellene vizsgálni, ahová átadod a tömböt, mert valahol felülíródik! Az is könnyen lehet, egyszerű logikai hiba csak...egy rosszkor történő értékadás következményeként...
Igen, én is ezt látom, hogy mindent egyesével át kell nézni, csak ugye az a baj, hogy van amikor pl 50 sms elküldése után jelentkezik a hiba.
Én arra gondolok, hogy a gsm_send_sms-ben vagy annál mélyebben száll el, mert ez csak az engedélyezett telefonszámoknál hívódik meg és mindig csak az engedélyezett telefonszámhoz tartozó változó értéke hülyül be. De ott akárhogy is nézem egy értékadás sincs! Mindenesetre az első mondatodat jó olvasni ![]() Szerk.: Most jobban megnéztem, az strcpy(TxB, buffer);-re azért van szükség, mert a buffer (jelen esetben telefonszámot tartalmaz) átmásolja a TxB-be és onnantól megszakításból megy a sorosport kiküldés a háttérben. Beállít egy flag-et is, ami jelzi, hogy most elfoglalt a soros port mert még adatot küld. A hozzászólás módosítva: Máj 9, 2018
|
Bejelentkezés
Hirdetés |