[elektro] STM32f4 interrupt : volatile tombok
Pal Lukacs
ekegep at yahoo.com
Wed Dec 11 17:02:40 CET 2013
Sziasztok !
Ujra kerdes :)
Azt hiszem a konstrukciot korabban felvazoltam,.. Ha nem ujra roviden:
ADC IT, DAC IT, adat be, adat kivitel
ADC IT adc pufferek allapotait is allitgatja, meg a main-nek a szures flageket (hogy melyi puffert szurje)
DAC IT a sajat puffereit kezeli (ezeknek allapotait)
A rendszer mukodesehez feltetel, hogy a szures legyen kesz az egyik pufferen, amig a masik megtelik.
A ket IT nehany us tavolsagra fut be egymastol.
Egy ilyen konstrukcioba hogyha DMA-t hasznalnek adatbehozashoz, kiirashoz, mennyit nyernek vele?
Az emlitett flagaket valahol allitgatnom kellene igy is, gondolom szinten IT lenne (DMA IT) ? Mekkora csomag behozasa/kiirasa utan tudok IT-t generalni DMA-val ?
On , Pal Lukacs <ekegep at yahoo.com> wrote:
Sziasztok !
Problema megoldodott.
Egy elem a beirasnal, egy elem a kiolvasasnel kiesett a rossz elgondolas miatt.
Tokeletesen atviszi mindket csatorna a jelet a szuressel egyutt.
Koszi mindenkinek.
Udv.
Szabi
On Wednesday, December 11, 2013 4:24 PM, hg12345 <hg12345 at freemail.hu> wrote:
Hi,
Nem akarok
kötözködni, de mi a feltételezés, hogy 11(12) általánosan használható regisztere van, vagy hogy egy méretes tömb nem fér bele. :-()))
Már elnézést, de honnan gondolod, hogy egy méretes tömb minden elemét 11(12) regiszterben képes tárolni.
Persze ha ez egy semafor tömb, akkor és csak egy elemét használod akkor már más a felállás, de ez azért benne van az erediti mondatba :-)
Ha igazad lenne és a fordító nem változó alapon dolgozna fordítási egységenként, hanem memória alapon, ami eléggé lehetetlen, mert ezt a linker csinálja, akkor nem kéne a volatile-vel foglalkozni, mert látná hogy ennek máshol is értéket adnak.
Gondolom láttál már asm listát ARM esetén és szintén megnézted az ARM "risc" utasítás készletét.
Ha igen akkor jól látható, hogy egy -O0 tömb
címzés esetén nagyon nagy százalékban ill. majdnem mindig végig csinálja a teljes eljárás, BASE + index*(sizeof()) ez azért barátok között is több elemi utasítás.
De ha kihasználja az ARM index + offset & displacment utasítását egy lépésben sajnos ez se jelenti azt hogy egy utasítás egy óra ciklus, hanem inkább 6 belső óra ciklus. Az ARM utasítás készlet egy utasítás egy óraciklus csak a belső regiszter regiszter műveletekre vonatkozik, és még az se igaz hogy mindig ugyanannyi órajel alatt végzi el a műveletet. (Nagyon befolyásolja busz mátrix foglaltsága, és a CORTEX, megvalósításoknál a belső buffer töltöttsége..., arról nem is beszélve hogy az egyes összetett elemi utasításokba még az IT is beférkőzik) Persze erre már utaltam is, hogy az CORTEX magokon az ATOMIC utasítások nem megvalósíthatók, kivéve BITBANDIG megvalósítást mert
ezt belső 3 lépésből álló utasítás LOAD,XOR,STORE nem tudja megszakítani az IT, de ha tényleg akarod használni akkor a buffert a következő lépésben ürítésre kell kényszeríteni.
Az STM32F2 és F4 sorozatokban csak a uC kapcsolt ram olvasható 0.ws ez egy 64K terület ami kikerüli a buszmátrixot, és ha innen fut a program akkor 5-8% teljesítmény többletet lehet kihozni belőle a nem közvetlen kapcsolt ram a buszmátrix sebessége és a ram sebessége miatt lassabban olvasható.
Egyébként ha mindent volatile-nek definiálnak abból se lesz baj, kicsit nagyobb és egy kicsit lassabb lesz a program de üzembiztosan fog futni. Az optimalizáslással buffer, tömb kezelés esetén azért 50% nagyobb teljesítmény javulás nehezen érhető el. HW <-> memória között sokkal célszerűbb a DMA gyorsabb, tisztább, érthetőbb.
"Móczik Gábor" <pm_levlista at progzmaster.hu> írta:
>2013.12.11. 9:39 keltezéssel, hg12345 írta:
>> Egy nagyméretű tömb esetén, ha nem csak egy elemét használod akkor ezt alapból nem tudja megcsinálni a forditó, nincs annyi regisztere :-)
>
>Ez azonban feltételezés.
>
>Ugyanis a fordítónak a tömb is csak egy ugyanolyan memóriaterület mint a
>mondjuk a BSS szegmens, és egyszerre nem az egész tömbbel végzel
>műveleteket, hanem egy elemmel. Ha olvasod és ugyanazzal a változóval
>több műveletet végzel, valószínű hogy
kiolvassa egy regiszterbe, és
>onnan használja.
>
>Ennek van is értelme akkor, ha a RAM lassabb mint a CPU, vagy több
>(nagyobb opcode) utasítás kell a címzéséhez. Ez mondjuk komolyabb
>hardveren és/vagy CISC utasításkészletek esetén így is van, de az
>STM32-ben egy ciklus alatt olvasható a RAM, ugyanolyan mintha
>regiszterből olvasnád, semmi lassulást nem fog okozni ha volatile-ként
>deklarálod.
>
>-----------------------------------------
> elektro[-flame|-etc]
>
-----------------------------------------
elektro[-flame|-etc]
More information about the Elektro
mailing list