[elektro] AVR IRQ -> ARM
hg12345
hg12345 at freemail.hu
Mon Feb 29 10:12:26 CET 2016
Sokkal egyszerűbb a vizsgálat, ha a belső SYSTICK-et használod mérésre, az mindig csak számol és számol.
Ezen kívül még van még egy kevésbé ismert/használt számláló M3/M4 magok mellett, ez a debugger számlálója, ez emlékeim szerint 64 bites, és mindig működik, amikor a debugger is, sebessége meg a uC sebességű.
itt megtalálod:
typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x00 DWT Control Register */
__IO uint32_t CYCCNT; /*!< Offset: 0x04 DWT Current PC Sampler Cycle Count */
__IO uint32_t CPICNT; /*!< Offset: 0x08 DWT CPI Count Register */
__IO uint32_t EXCCNT; /*!< Offset: 0x0C DWT Exception Overhead Count Register */
__IO uint32_t SLEEPCNT; /*!< Offset: 0x10 DWT Sleep Count Register */
__IO uint32_t LSUCNT; /*!< Offset: 0x14 DWT LSU Count Register */
__IO uint32_t FOLDCNT; /*!< Offset: 0x18 DWT Fold Count Register */
__I uint32_t PCSR; /*!< Offset: 0x1C DWT Program Counter Sample Register */
__IO uint32_t COMP0; /*!< Offset: 0x20 DWT Comparator Registers */
__IO uint32_t MASK0; /*!< Offset: 0x24 DWT Mask Registers */
__IO uint32_t FUNCTION0; /*!< Offset: 0x28 DWT Function Registers */
uint32_t RESERVED0;
__IO uint32_t COMP1; /*!< Offset: 0x20 DWT Comparator Registers */
__IO uint32_t MASK1; /*!< Offset: 0x24 DWT Mask Registers */
__IO uint32_t FUNCTION1; /*!< Offset: 0x28 DWT Function Registers */
uint32_t RESERVED1;
__IO uint32_t COMP2; /*!< Offset: 0x30 DWT Comparator Registers */
__IO uint32_t MASK2; /*!< Offset: 0x34 DWT Mask Registers */
__IO uint32_t FUNCTION2; /*!< Offset: 0x38 DWT Function Registers */
uint32_t RESERVED2;
__IO uint32_t COMP3; /*!< Offset: 0x30 DWT Comparator Registers */
__IO uint32_t MASK3; /*!< Offset: 0x34 DWT Mask Registers */
__IO uint32_t FUNCTION3; /*!< Offset: 0x38 DWT Function Registers */
} SystemDebugDWT_Type;
#define DWT_BASE (ITM_BASE + 0x1000) /*!< Data Watch and Trace base address */
#define DWT ((SystemDebugDWT_Type *) DWT_BASE) /*!< Data Watch and Trace configuration struct */
és így használhatod:
extern unsigned int CYCLECOUNT;
#ifdef DEBUG
#define MSR_START_CYCLECOUNT() CYCLECOUNT=DWT->CYCCNT;
#define MSR_STOP_CYCLECOUNT() CYCLECOUNT=DWT->CYCCNT-CYCLECOUNT;
#define MSR_STOP_ANY_CYCLECOUNT(x) x=DWT->CYCCNT-CYCLECOUNT; \
MSR_START_CYCLECOUNT();
#else
#define MSR_START_CYCLECOUNT()
#define MSR_STOP_CYCLECOUNT()
#define MSR_STOP_ANY_CYCLECOUNT(x)
#endif
//--------------------------------------------------------------------------------------------------------------------------------------------------
Ha elfogadsz egy jó tanácsot, itt érdemes elfelejteni az ASM kódolást.
Ugyan nem lehetetlen kézben tartani base-relativ(index), stack-relativ(index) és pc-relativ(index) címzéseket, de ezt a C nagyon jól kézben tartja.
Amit a legtöbb C fordító macro készletében nem implementálták, egy utasításon belüli automatikus index kezelés incrementáls és decrementálás, a másik ilyen ami gyakran kézzel jobban sikerülhet, a utasítás végrehajtás esetén a status frissítés vagy ennek kihagyása. Azért itt se annyira rossz a helyzet, mert az utasítás végrehajtás a fentiek esetén amúgy is hosszabb lenne és emellett ezek mindig 32 bites utasítások, ezért maximum egy FETCH-t utasítással lesz hosszabb a végrehajtási idő, hiszen ezek a kiegészítések minden belső regiszterekre vonatkoznak. Ha két 16 bites utasítással pótolható, akkor a buffer kezelés miatt még elképzelhető, hogy a valós végrehajtási idő azonosra adódik.
Pont azt az előnyt fogod elveszíteni ennél a típusú felépítésnél amit a C kompatibilitás miatt építettek bele.
Kis programokhoz 32K-ig ingyenes a KEIL, tanuláshoz teljesen jó. Ha kis fogyasztású eszközre fejlesztesz, akkor SMT ... M0 esetén nagyobb mérethez ingyenes :
http://www2.keil.com/stmicroelectronics-stm32/mdk.
Áttérés esetén M0 eszközök szinte minden esetben lényegesen nagyobb teljesítményt és kapacitást adnak mint a 8/16 bites eszközök.
Üdv
VFX <info at vfx.hu> írta:
>Hali!
>
>
>
>2016.02.29. 8:42 keltezéssel, VFX írta:
>> Hali!
>>
>>
>> Flash WS
>>
>> ldr R4,=FLASH_R_BASE
>> mov R5,#FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_0
>> str R5,[R4, #FLASH_ACR_OFFSET]
>>
>
>Csak hogy tisztázzam magamnak a kérdést. A fenti beállításokkal megy a
>proci 64MHz-en 0 flash WS-sel.
>De akkor a leírásban ez vajon hogy értendő ( STM32F334-ről van szó):
>
>Bits 2:0 LATENCY[2:0]: Latency
>These bits represent the ratio of the SYSCLK (system clock) period to
>the Flash
>access time.
>000: Zero wait state, if 0 < SYSCLK≤ 24 MHz
>001: One wait state, if 24 MHz < SYSCLK ≤ 48 MHz
>010: Two wait sates, if 48 < SYSCLK ≤ 72 MHz
>
>ÜDV. VFX.
>
>-----------------------------------------
> elektro[-flame|-etc]
More information about the Elektro
mailing list