[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