Fórum témák
» Több friss téma |
Csináltam én is egy próbát stm32f401-el. Az ext interrupt forrásjelét a timer 1 PWM-el állítottam elő, összekötve a két lábat egymással. Saját interrupt handlerbe a következő kódot beletéve 6 órajelnyi ideig még a főprogram futott, ezután 33 órajelnyi időtartamra akasztotta meg a főprogram hurokban levő kimeneti láb billegtetését.
Ez a két sornyi program volt a főprogramhurokban (sokszor egymás után téve, hogy a hurok elejére visszaugrás ne akassza el):
Mivel most csak egy 24MHz mintavételezésű analizátor állt a rendelkezésemre, a CPU órajele 1MHz, a perifériák órajele 1, illetve 0.5 MHz-re lett beállítva (hogy meg tudjam mérni). A próbát a CubeIDE alatt csináltam, a fordítót sebesség optimalizációra állítottam be.
Ez nagyjabol megegyezik az altalam emlitett 3xx ns kiszolgalasi idonek, mivel nalam 80MHz volt az orajel. En is hasonlo modon mertem amugy
Ebben a pdf-ben a 47. oldalon elég jól le van írva, hogy mit csinál a proci megszakítás esetén. A proci mikrokódjában benne van PC, xPSR, R0-R3, R12, LR regiszterek verembe történő mentése és visszaállítása. Ez fix dolog, nem tudsz rajta változtatni. Ezért nem lehet megtalálni a kódban a regiszterek mentését és visszaállítását. 12 órajel a regiszterek mentése, majd 12 órajel a visszaállítása. Így nagyjából ki is jön az általam mért 33 órajelnyi végrehajtási idő.
Ezt a megszakitas kezeles kerdest vegul lezavartam brute force modszerrel
A tablazatban feltunt, hogy a 32H743, 450MHz-en (plus cache) 170ns alatt eleri a megszakitast. Ezen felbatorodva fogtam egy 32H503-at (ez volt elerheto gyorsan es ebbol van elfogadhato labszamu/meretu valtozat), ezzel 250MHz-en ~220ns alatt vagyok ugyanott, plusz ugye mivel tobb, mint haromszor magasabb az orajele, mint az eredeti 32L432-nek, igy meg marad 4-500 oraciklus ami rengeteg utasitasra eleg Ezen meg mindig lehetne faragni jocskan, mert ami a generalt kodban latszik: - HAL_GPIO_EXTI_IRQHandler - HAL_GPIO_EXTI_Rising_Callback - HAL_GPIO_EXTI_Falling_Callback - EXTI2_IRQHandler - EXTI3_IRQHandler Tobbek kozt ezeken megy vegig a megszakitas kezelese, attol fuggoen hanyadik megszakitasrol van szok, ez eleg sok utasitas (feltetel kezeles) is lehet. Egyelore jo ez ami van, teszi a dolgat. A RP2040 PIO-javal meg matekoltam kicsit, ugyes joszag, de sajnos csak 9 utasitast ismer (miert is ismerne tobbet, IO-ra van kihegyezve), az pedig nem eleg, mindekepp vissza kell adnom a fo mcu-nak a vezerles, az pedig ido, es ez mar nem a PIO-tol fugg... Azert gusztusos kis darab, kesobb meger egy kis discovery-t. A hozzászólás módosítva: Jún 13, 2024
A PIO-hoz:
Láttam több olyan megoldást, ahol régi rendszerekbe illesztették, például 6502 CPU-hoz. A PIO lekezeli az adott kontroll vonalat, így a 6502 látja, hogy az történik, aminek kell. Az általad fejlesztett cucc nem így csúszik ki az időzítésből. A CPU által már korábban összekészített adatot DMA-val kiküldi. Vagy fogadja, és DMA-val beírja a CPU által korábban lefoglalt helyre. Majd küld megszakításkérelmet a CPU-nak, aminek akkor lesz néhány 6502 órajelnyi ideje foglalkozni a feladattal, és sikerülni is fog neki befejezni, mert annyival gyorsabb. Érdemes nézegetni a kész projekteket. Például VGA kártya Aplle ][-be vagy DMA memóriabővítés Commodore 64-hez.
..de hat epp ezt oldattam meg a gyorsabb orajellel
Mar nem tudok elkesni, mert a megszakitas eleresi ido igy mar elegendoen kicsi, raadasul a megszakitas feldolgozasa kozben mar tobb mint haromszor annyi orajel all a rendelkezesemre. Megszakitas pedig mindenkepp kell, mert a PIO nem alkalmas a kapott adat feldolgozasara, az mcu viszont elviszi akar a megszakitas kezeloben is. Mint emlitettem kesobb meg fogom tanulmanyozni az RP2040 lehetosegeit, de ez most egy nagyon kicsi szelete az aktualis projectnek, nincs ra ido.
Szoval az egy nagyon szep pelda arra, amikor mar a problema megkozelitese is rossz
Ravakultam a megszakitas kiszolgalasanak a felgyorsitasara, pedig en magam is leirtam, hogy nincs foprogram, csak a megszakitas ketyeg, attol fugg mit csinal az mcu. Barmit is csinal be kell fejeznie a kovetkezo interrupt elott. Ebbol egyenes kovetkezik, hogy egyetlen lab figyeleset ebben az esetben sokkal celszerubb egy poll-ra bizni... Legrosszabb esetben negy (ot) oraciklus es maris billentem a kivant laba(ka)t, vagy csinalom amit kell.
Ezt mar egy lassabb proci is elviszi, bar most epp maradt a 32H503, de kiprobaltam levett orajellel is, csak hogy lassam a szkopon... Ettol meg az RP2040 es az o PIO-ja meg ugyes cucc, sok esetben jol fog jonni
Ez nagyon jól fog működni egészen addig, amíg kizárólag ennyi a teljes program feladata és nem esik be másik megszakítás. Ha viszont éppen beesik, akkor ki fogja várni amíg az befejeződik és csak azután fog reagálni a lábra adott impulzusra. El kell dönteni: lassabb de kiszámítható reakció idő, vagy legtöbb esetben gyors reakció idő, de ha éppen más megszakítás zajlik akkor meg lassú reakció idő. Esetleg magas prioritással meghagyhatod a jelváltozás megszakítást is (akkor az egyéb megszakítást is meg fogja szakítani), de akkor meg gondoskodnod kell az esetleges dupla reakció kivédéséről (ha ez problémát okoz).
Nincs olyan opcio, hogy ne fejezze be idoben. Lenyegeben egy kulso, ketfazisu orajelrol van szo, ami nem fer be ket impuzus koze az nincs
Nem egy feszitett tempo, ~500kHz az orajel, abbol a szinkronjel ugye pont a fele. Az orajel/szinkronjel detektalas/eloallitas kevesebb mint 10 orajel, nagyjabol 2x2uS a hasznos rendelkezesre allo ido, par, szekvencialisan vegrehajtott utasitasra. Mas megszakitas nincs, sot, most mar egyetlen megszakitas sincs. Tokeletesen mukodik, 'rengeteg' mcu ido maradt szabadon. Kis tulzassal akar egy atmega is elvinne 16MHz-en, ha nagyon kellene (mondjuk ott a 10 orajelnyi detektalas kicsit tobb idot emeszt fel, az mar talan kicsit tul szoros..). Majd kiprobalom mennyire tudok lemenni orajelben (most 250MHz-en megy), amig meg biztonsagosan mukodokepes marad. Vannak kesobbi terveim meg ezzel a kis kapcsolassal, de azt mar talan majd masik eszkozzel (pl RP2040, mint ahogy feljebb beszeltuk)
Jelen esetben a ket mag mar tenyleg agyuval verebre lenne.
Ez egy 50+ eves konstrukcio, egy i8008-al tart lepest az aramkor. Egesz pontosan az i8008 helyett dolgozik. Ha siman illeszteni kellene (kellett volna) akkor nem foglalkoztam volna idozitessel, arra ott a READY lab. |
Bejelentkezés
Hirdetés |