Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   176 / 176
(#) vargham válasza sdrlab hozzászólására (») Ápr 9, 2024 /
 
A volatile annyit mond a compilernek, hogy a változó tartalma megváltozhat két elérés között akkor is, ha az adott kódban nem változtat rajta semmi. Ezért mindig az adott címen éri el.
Tipikus esete ennek, amikor valami megszakíthatja a kód futását, például interrupt handler vagy OS esetén másik task. Ahogy fentebb írtam a cache egy transzparens hardver, az ellen nem véd.
Harvard architektúra esetén ez annyival bonyolódik, hogy a programkód és az adatok külön memóriában (buszon) vannak és ha van cache, az sem közös. Mikrokontrollerek esetén a konstans adatok is a programkóddal együtt a flashben tárolódnak, hogy ne vesszenek el. Ezért ott bevett dolog, hogy bekapcsoláskor ezeket a konstansokat beolvassa a RAM-ba, ahol a többi adat is van, és soha többé nem nézi meg őket a flashban. Általában speciális flash elérési utasításokkal lehet rávenni a CPU-t, hogy ott keresse midnen egyes alkalommal az adatot. A volatile ebben sem segít.
(#) sdrlab válasza vargham hozzászólására (») Ápr 9, 2024 /
 
Idézet:
„Általában speciális flash elérési utasításokkal lehet rávenni a CPU-t, hogy ott keresse midnen egyes alkalommal az adatot. A volatile ebben sem segí”

Akkor ezt beszéld meg a fordítókkal is, hogy eszerint működjenek, mert amikkel nekem dolgom volt, azok konzekvensen úgy működtek, ahogy már leírtam!!
Amúgy örülök, hogy begugliztad magadnak a leírásokat, és azokat adod itt elő egy az egyben, ezt más is meg tudja tenni! Ami már nehezebb, az a gyakorlati tényekkel szembemenni...
Egyébként, az még lehetséges, hogy optimalizációs beállítás kérdése is ennek a működése..., nálam általában szinte mindig méretre van maximálisan optimalizálva a kód, néha egyes modulok sebességre, de olyan szinte sohasincs, hogy optimalizálás/debug nélküli verzió fut...
(#) toto hozzászólása Ápr 13, 2024 /
 
Sziasztok!
Embitzben programozok STM32F103-at:
lassú külső portok figyelése, vezérlése, grafikus LCD-ra való rajzolás.A portok között van, amit sima pollinggal, van, amit megszakítással figyelek. Használok Timereket, de az adott rész működésébe nem szólnak bele.
A gondom a következő: egy hibát keresve debugolom, de gyakran más eredmények születnek a continuous és a next step debug allkalmazásakor. Figyelem a portokat külön is, és azt kizárnám, hogy a menet közbeni portok változása, vagy zajossága okozza a gondomat.
Nincs watchdog, a Timerek itt nem játszanak, -O0 optimalizációval fordítom.
Kódot nem mellékelek, mert elég nagy a forrás. Nem kódvadászatra, inkább tanácsra lenne szükségem, hogy mire kellene még figyelnem?
(A debugolást még az is nehezítette, hogy ST-link V3-at használtam, de azzal gyakran megszakad a kapcsolat. Lehet, az USB kábel vacakol a nagyobb sebesség miatt. ST-link V2-vel úgy tűnik, hogy stabil az EBlink.)
Egyenként léptetve a program jól működik, de folyamatos módban, live variable-t figyelve már gyakran hibázik. Debug nélkül simán futtatva is hibázik.
GPIO-IDR regisztereket figyelve mintha régi állapotot olvasna időnként. Nem használok API-kat, simán a regisztert olvasom: if((GPIOA->IDR) & GPIO_IDR_IDR11) counter++;
(#) toto válasza toto hozzászólására (») Ápr 13, 2024 /
 
Lehet, hogy hülyeséget csináltam. Tegnap órákat vacakoltam ezzel, most meg beugrott - miután leírtam a kérdésem -, hogy az egyik bemeneten egy viszonylag nagy időállandójú integrátort tettem, és lehet, hogy a bemenet változása után nem várok elég időt a lekérdezéssel.
Sajnos, csak hétfőn tudom ezt ellenőrizni.
A hozzászólás módosítva: Ápr 13, 2024
(#) Tambi hozzászólása Ápr 15, 2024 /
 
Kedves Fórumtársak!

Valaki megmérte, de legalábbis feltöltötte valahova az ATMEGA328p ADC valódi karakterisztikáját; honnan indul, milyen görbe mentén, meddig mér valójában... stb..

Ha valakinek megvan legyen szíves feltölteni.

Köszönöm szépen!

Derűs napot; Tambi
(#) Thomas10100 hozzászólása Ápr 28, 2024 /
 
Sziasztok!

Frekvenciát szeretnék mérni STM32H753 mikrovezérlővel input capture dma segítségével. 0-4000Hz között, kb. TIM2 és TIM5 CH1 bemeneteket kiválasztottam, DMA-t beállítottam hozzá.

Amit találtam projektet, hibát ad kettő sorra. Viszont ez F373 mikrovezérlőre van:
  1. #define LENGTH_ARRAY 100
  2. static uint8_t data_index_for_tim2_channel_1 = 0;
  3. static uint8_t data_index_for_tim5_channel_1 = 0;
  4. static uint16_t input_capture0[LENGTH_ARRAY] = {0};
  5. static uint16_t input_capture1[LENGTH_ARRAY] = {0};
  6. static TIM_HandleTypeDef* handler_tim2;
  7. static TIM_HandleTypeDef* handler_tim5;
  8.  
  9. void Init_Input_Capture(TIM_HandleTypeDef* htim2, TIM_HandleTypeDef* htim5) {
  10.         /*
  11.          * Input capture for measuring frequency
  12.          * For TIM17 and TIM16
  13.          * Timer clock: 48 Mhz
  14.          * Prescaler: 4799
  15.          * Counter: 65535 (0xffff)
  16.          * Update frequency: 0.1526 Hz (1/0.1526 = 6.5535 seconds)
  17.          */
  18.         if(HAL_TIM_IC_Start_DMA(htim2, TIM_CHANNEL_1, (uint32_t*)input_capture0, LENGTH_ARRAY) != HAL_OK)
  19.                 Error_Handler();
  20.         if(HAL_TIM_IC_Start_DMA(htim5, TIM_CHANNEL_1, (uint32_t*)input_capture1, LENGTH_ARRAY) != HAL_OK)
  21.                 Error_Handler();
  22.  
  23.         /* Save */
  24.         handler_tim2 = htim2;
  25.         handler_tim5 = htim5;
  26. }
  27.  
  28. static uint16_t compute_period(uint16_t input_capture[], uint8_t left) {
  29.         /* Find the index - i0 and i1 can never be larger than LENGTH_ARRAY and lower than 0 */
  30.         uint8_t a = 2*LENGTH_ARRAY - left;
  31.         uint8_t i0 = (a - 2) % LENGTH_ARRAY;
  32.         uint8_t i1 = (a - 1) % LENGTH_ARRAY;
  33.  
  34.         /* Check absolute value */
  35.         if(input_capture[i1] > input_capture[i0])
  36.                 return input_capture[i1] - input_capture[i0];
  37.         else if(input_capture[i1] < input_capture[i0])
  38.                 return input_capture[i1] + 0xFFFF - input_capture[i0];
  39.         else
  40.                 return 1;
  41. }
  42.  
  43. uint16_t STM32_PLC_Input_Capture_Get_Raw(uint8_t i){
  44.         switch(i){
  45.         case 0:
  46.                 return compute_period(input_capture0, handler_tim2->hdma[TIM_DMA_ID_CC1]->Instance->CNDTR);
  47.         case 1:
  48.                 return compute_period(input_capture1, handler_tim5->hdma[TIM_DMA_ID_CC1]->Instance->CNDTR);
  49.         default:
  50.                 return 0;
  51.         }
  52. }
  53.  
  54. float STM32_PLC_Input_Capture_Get_Calibrated(uint8_t i){
  55.         return 1.0f/((float)STM32_PLC_Input_Capture_Get_Raw(i)*0.0001f); /* Converting to Hz */
  56. }
  57.  
  58. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
  59.         if(htim->Instance == TIM2){
  60.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){
  61.                         if(data_index_for_tim2_channel_1 >= LENGTH_ARRAY)
  62.                                 data_index_for_tim2_channel_1 = 0;
  63.                         input_capture0[data_index_for_tim2_channel_1++] = htim->Instance->CNT;
  64.                 }
  65.         }
  66.         if(htim->Instance == TIM5){
  67.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){
  68.                         if(data_index_for_tim5_channel_1 >= LENGTH_ARRAY)
  69.                                 data_index_for_tim5_channel_1 = 0;
  70.                         input_capture1[data_index_for_tim5_channel_1++] = htim->Instance->CNT;
  71.                 }
  72.         }
  73. }


A hiba a képen, mert nem engedte betenni.

Bármilyen segítséget szívesen fogadok!
Köszönöm
A hozzászólás módosítva: Ápr 28, 2024

hiba.jpg
    
(#) vargham válasza Thomas10100 hozzászólására (») Ápr 29, 2024 /
 
Miért nem a H753-hoz való input capture példából indulsz ki?
(#) Thomas10100 válasza vargham hozzászólására (») Ápr 29, 2024 /
 
Nem találom a dma példát, csak simát láttam.
(#) vargham válasza Thomas10100 hozzászólására (») Ápr 29, 2024 /
 
A NUCLEO-H743ZI példái között nézted?
Van TIM_InputCapture és van TIM_DMA is. Szerintem ezekből könnyebb összehozni, mint egy másik MCU családból áthozni.
(#) Thomas10100 válasza vargham hozzászólására (») Ápr 29, 2024 /
 
Igen, az input capture az IT. Dma-t nem néztem.

Megnézem majd. Komplett példából jobban ment volna
(#) sdrlab válasza Thomas10100 hozzászólására (») Ápr 29, 2024 /
 
Sima frekvencia méréshez mi szükség DMA-ra?
(#) Thomas10100 válasza sdrlab hozzászólására (») Ápr 29, 2024 /
 
Nem sima frekvenciamérés. Ezen kívül elég sok dolog van a projektben. Komplett touchgfx. 7csatorna adc dmaval(ez működik). Can busz kezelés.
(#) sdrlab válasza Thomas10100 hozzászólására (») Ápr 29, 2024 /
 
Nem kétlem, hogy más dolga is van a procinak..., csak akkor sem értem, hogy egy hardveres számláláshoz mi szükség DMA-ra?!
(#) vargham válasza sdrlab hozzászólására (») Ápr 29, 2024 /
 
Az a tippem, hogy CPU idő nélkül szeretne hosszabb időn keresztül, rendszeresen frekvenciát mérni, és az eredményeket eltenni a RAM-ba.
(#) Thomas10100 válasza sdrlab hozzászólására (») Ápr 29, 2024 /
 
Cpu idő nélkül szeretném számolni.
Fordulatszám mérés és sebesség
(#) sdrlab válasza vargham hozzászólására (») Ápr 29, 2024 /
 
Alacsony frekvenciát csak reciprok méréssel érdemes mérni! Ilyen magas órajel esetén viszont még 1 sec alatt is bődületes felbontás jön ki! 32 bites hardveres számláló pedig nem fog túlcsordulni nagyon hosszú idő alatt csak. Nem hinném, hogy az kevés lenne a feladathoz...
(#) sdrlab válasza Thomas10100 hozzászólására (») Ápr 29, 2024 /
 
A méréshez nem is kell CPU erőforrás, csak hardveres számláló! A számoláshoz pedig mindenképpen kell a végén...
(#) Thomas10100 válasza sdrlab hozzászólására (») Ápr 29, 2024 /
 
Tehát aztmondod a példák közötti input capture is jó nekem?
(#) sdrlab válasza Thomas10100 hozzászólására (») Ápr 29, 2024 /
 
Bármelyik számláló jó, amelyiknek az engedélyezése külső lábhoz rendelhető...
(#) sszasza hozzászólása Jún 4, 2024 /
 
Sziasztok! Keilben dolgozom. Van egy normál program rész, és van egy szoftver update rész. Utóbbi 0x7000 felett, section _at-ekkel fix cimen.
Csakhogy, a fordito minduntalan a normál programrészből is rak fel valamit, a update rész UTÁNra. Úgy bukott le hogy olvasható dolgot, const char* stringet is feltett, de általában kódot rak.
Hogy lehet a normál programrésznek megmondani hogy 7000 fölé soha semmit?
(#) sszasza válasza sszasza hozzászólására (») Jún 4, 2024 /
 
Nocsak, még csak nem is "igazi" kódot rak oda , hanem a ram inicializálás értékeit. Például
char SRV[8] = "PMIN189"; -ből a PMIN189 -et, meg még pár időzítés jellegzetes kezdőértékét felismertem. Vagyis nem általam írott függvény/kód , hanem rendszer init függvény, ill annak adatmezeje lehet. Na ez különösen ne kerüljön oda
(#) jefflynn válasza sszasza hozzászólására (») Jún 4, 2024 /
 
Szerintem a scatter fájlban kell megadni a sectionokat, és ott meg tudod adni hogy mit hova tegyen. Sorry, pontosabban nem tudom elmondani, mert évekkel ezelőtt írkáltam ilyeneket.
(#) vargham válasza jefflynn hozzászólására (») Jún 5, 2024 /
 
GCC-ben pedig a linker scriptben. De a Keil cseppet más.
(#) sszasza válasza vargham hozzászólására (») Jún 5, 2024 /
 
Az most már biztos, hogy a reset_handlert rakja fel oda, kisakkoztam (lehet h mást is de azt biztosan) Namost a Keilben a reset_handler nem létezik szöveges formában, egyből az .o-ba kerül. Hogyan tudom mégis máshova tenni? (Szegény chatgpt-t már teljesen lefárasztottam, már csak önmagát tudja ismételni, nem bírja megugorni h nincs hozzáférhető reset_handler.)
(#) sszasza válasza sszasza hozzászólására (») Jún 5, 2024 /
 
Ezt a linkert biztos hogy kutyák ivadékainak ivadékai írták, egymásnak (nagyon finom voltam). Nehogy már véletlenül egymás után folyamatosan tenné a területeket , 0tól felfelé.... Mindig kell legyen nagy üres terület, és mindig valami UTÁN kell tenni a valamit!
Ez csak jó bonyolult scatter file-lal oldható meg, amit folyamatosan piszkálok ahogy a program nő. (ide jönne egy szaftos káromkodás)
(#) Jonni válasza sszasza hozzászólására (») Jún 5, 2024 /
 
Idézet:
„(ide jönne egy szaftos káromkodás)”


Fütyüld ki!!!
(#) jefflynn válasza sszasza hozzászólására (») Jún 5, 2024 /
 
Nem tudom melyik fordítót használod (nem írtad) de próbáld ki a másikat, hátha az logikusabban működik. Valami olyan is rémlik, hogy a 6-os kompatibilis a GCC linker szintakszissal, de ebben nem vagyok biztos.

keil.png
    
(#) sszasza válasza jefflynn hozzászólására (») Jún 5, 2024 /
 
5-ösöm valamiért nincs csak 6. A c90/c99-et próbáltam, mert valaki javasolta, lényegi különbség nincs. Nem a fordító hülye itt, hanem a linker.
(#) sszasza válasza vargham hozzászólására (») Jún 7, 2024 /
 
Abban segítsetek légyszi, hogy tegyük fel hogy van linker script( keilben scatter file), 3 szekcióval (start, normál, szoftver update), akkor hogyan lehet több (sok) függvényt egyszerre egy adott szekcióba tenni. Én nem találtam rá megoldást. Nem szeretném egyesével mind az egymillió függvényhez odabiggyeszteni hogy ki melyik szekció tagja. Nem életszerű.
Következő: »»   176 / 176
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem