=====================================================================
                         ARM-Mץå¸
                                  Last Modified:2015 Nov 23 09:31:43
=====================================================================


(1) бƤ륿åȥƥμࡦ

ARM-M¸ϡARMvx-Mƥ򥿡åȤȤƤ롥ARMvx-Mϡ
ARMȤϰۤʤꡤARM̿¹ԤǤʤᡤARM¸ʬƤ롥
ݡȤƤ륳ϼ̤Ǥ롥

Cortex-M0
Cortex-M0+
Cortex-M3
Cortex-M4

(2) Ѥ볫ȯĶưڤʥС󡤥ץ

ͥGCCѤƥѥ뤹롥ưǧСϳƥ
åȰ¸ΥɥȤ˵ܤ롥


(3) åε

(3-1) ǡ˴ؤ뵬

ǡ arch/gcc/tool_stddef.h ƤƤǡfloat
doubleϡ줾IEEE754ñưư
Ǥ롥

(3-2) ߽˴ؤ뵬

ߥϥɥֹȳֹγơξԤб

ߥϥɥֹȳֹϡ㳰ȯIPSR˥åȤ㳰
Ѥ롥SYSTICK15֤ǡߤ16ֹ֤椬դ
Ƥ롥

ͥ٤ʳTMIN_INTPRI

ͥ٤ʳϡSoC˥ϡɥŪ˥ݡȤͥ
٥ӥåۤʤΤǡåȰ¸˰ۤʤ롥åȰ¸
ϡͥ٤ΥӥåTBITW_IPRIˤȤγͥΥͥ
٤ΥӥåTBITW_SUBPRIˤ롥

ƥӥåͤCFG_INTǻѲǽʳͥ٤ϰϤϼ̤Ǥ롥

   -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI)  -1

㤨ͥ٤Υӥå(TBITW_IPRI)8bitͥ٤Υӥå
(TBITW_SUBIPRI) 1bitξϡ-254  -1 ϰϤǤ롥

ͥ٤Υӥå(TBITW_IPRI)3bitͥ٤Υӥå(TBITW_SUBIPRI) 
0bitξϡ-8  -1 ϰϤǤ롥

ͥ(3bitǤ-8)ϡͥ٤ȤƤ"0x00"Ȥʤ롥ͥ
٤CPUåѤBASEPRI쥸ǤϥޥǤʤᡤͥ
γߤκǹͥ١TMIN_INTPRIˤϡͤ1ͥ٤㤤
ʲͤꤹ롥

ϰϤǡͥγߤκǹͥ١TMIN_INTPRIˤ򥿡
åȰ¸ꤹ롥

dis_intena_intΥݡȤ̵ͭ»

dis_intena_int򥵥ݡȤ롥»äˤʤ

CFG_INT»ȳĥʥåǻѤǤ°

CFG_INT»ϤʤåǻѲǽʳ°äˤ


ͥγ

ARMv7-MǤϡͥγߤ򥵥ݡȤ롥ˡϡ
ͥ٤ʳǻꤷݡȤͥ٤κǹ͡ʺǾ͡ˤ
ꡤTMIN_INTPRIͤ礭ͥ٤㤯ꤹȡTMIN_INTPRI
ͤʹͥ١ˤʳͥ٤ꤷߤͥ٤Ȥ


ͥγߤOS¹ػߤˤʤ뤳ȤϤʤʸ̩ˤϳ
νиǤûֶػߤˡȯϡͥΥɤ
ͳ˸ƤӽФ롥

ͥγߤФ롤DEF_INH,CFG_INTϥݡȤ롥

(3-3) CPU㳰˴ؤ뵬

CPU㳰ϥɥֹ

CPU㳰ϥɥֹȤƤϡ㳰ȯIPSR˥åȤ롤㳰ֹ
Ѥ롥㳰㳰ֹϰʲ̤Ǥ롥

        㳰              㳰ֹ
  Reset                      1
  Non-makable Interrupt      2
  Hard Fault                 3
  Memory Management          4
  Bus Fault                  5
  Usage Fault                6
  SVCall                    11
  Debug Monitor             12
  PendSV                    14

ʤResetȡSVCall(ARMv7-M)PendSV(ARMv6-M)ˤĤƤϡͥ뤬
Ѥ뤿ᡤ桼ϻѤ뤳ȤǤʤ

ARM-MƥǤCPU㳰ͥ٤ꤹ뤳ȤǽǤ롥
ARM-M¸ǤϡƤCPU㳰ͥ٤CPUåǤϥޥǤʤ
ʤͥ͡0ˤ˽Ƥ롥

(3-4) CPUåߥå

ARMv7-MǤϡCPUåϡbasepriTMIN_INTPRIͥ٤γߤػߤ
ͤꤹ롥ߥåϡFAULTMASK'1'ꤹ뤳ȤǼ¸Ƥ
롥

ARMv6-MǤϡCPUå/ߥåPRIMASKˤ¸Ƥ롥

(3-5) ǽɾѥƥλȤ˴ؤ뵬

get_utm򥵥ݡȤ롥٤˴ؤƤϡå˰ۤʤ롥

(3-6) ȥåץ롼Ǥν

ȥåץ롼ϡThread⡼ɤǸƤӽФ뤳ȤȤƤ
롥¹Ը塤ߥå֤Ȥ롥ߥå֤ϡͥν
λ˵Ĥ롥ȥåץ롼ǡMSP򥢥ƥ֤ʥ
ȤMSPƤ뤿ˤϡINIT_MSP򥿡åȰ¸
롥

(3-7) ٥ơ֥륪եåȤν

ץå¸νǡVector Table Offset Register 򥿡
Ȱ¸ν롼ꤹ롥ʤ٥ơ֥ϡ.vector
Υ°ղäƤ뤿ᡤ󥫥ץȤǤΥ
ꤷ֤롥


(4) ޥɥ饤дϢξ

ͥΥƥåȤơSYSTICѤϡcore_config.c 
򥳥ѥоݤȤե졼ե core_config.cfg 
ꤹ뤳ȡ

δܤ1msecȤ롥CALIBRATION쥸Ƥ򸵤˷׻
ϡSYSTIC_USE_CALIBRATION 롥CALIBRATION쥸
ʤϡ1msecʬΥͤ TIMER_CLOCK ꤹ롥
ȤơåѤϡSYSTIC_USE_STCLK Ѥ롥


(5) åȰ¸Ǥ

åȰ¸ǤϰʲΥޥɬפ롥

   TMAX_INTNO     : ֹκ(̾γֹ + 15)
   TBITW_IPRI     : ͥ٤Υӥå
   TBITW_SUBIPRI  : ͥ٤ΥӥåΥͥ٤Υӥå
   TMIN_INTPRI    : ͥ٤κǾ͡ʺǹ͡
   TIC_NUME       : ƥåμʬ
   TIC_DENO       : ƥåμʬ
   TIMER_CLOCK    : ͤɽȥߥñ̤ȤѴ
   INTPRI_TIMER   : ޳߳ͥ
   INTATR_TIMER   : ޳ߤγ°
   INIT_MSP       : ȥåץ롼MSP
   DEFAULT_ISTKSZ : å8byteñ̤ǻ
   SIL_DLY_TIM1   : ԤΤ
   SIL_DLY_TIM2   : ԤΤ

åȰ¸MakefileǤϰʲɬפ롥

   CORE_TYPE     : μ
                     CORTEX_M4/CORTEX_M3/CORTEX_M0/CORTEX_M0PLUS/
   FPU_USAGE     : FPUѤˤ줫
                     FPU_NO_PRESERV      : ƥ¸ʤ
                     FPU_NO_LAZYSTACKING : ƥ¸
                     FPU_LAZYSTACKING    : ƥ¸(Lazy stacking)                  
   FPU_ABI       : FPUѻABI줫
                     softfp : float/dobuleΰμϤ˰̥쥸
                     hard   : float/dobuleΰμϤFPU쥸
                     
(6) ¾

(6-1) Configureation and Control Register(CCR)STKALIGN

ƥ൯ưΤˤOSνλˤCCRSTKALIGNϡ
ʤȡ


(7) ǥ쥯ȥ깽ե빽
  ./arch/arm_m_gcc/common
    ./Makefile.core
    ./arm_m.h
    ./makeoffset.c
    ./core.tf
    ./core_cfg1_out.h
    ./core_check.tf
    ./core_config.c
    ./core_config.h
    ./core_def.csv
    ./core_insn.h
    ./core_kernel.h
    ./core_rename.def
    ./core_rename.h
    ./core_sil.h
    ./core_stddef.h
    ./core_support.S
    ./core_test.h
    ./core_timer.c
    ./core_timer.cfg
    ./core_timer.h
    ./core_unrename.h
    ./core_user.txt
    ./start.S

(8)ARMCCͭɤεˡ

ARMCCȶͭ륳ɤϡΥ롼˽äƥɤ򵭽Ҥɬפ롥

1.Хꥢ̿(Asm("":::"memory"))Υޥ

åȰ¸ ݡƥ󥰥ɤ(1-6-2)(c)ˤϡΤ褦˵Ҥ
Ƥ롥

-----
(c) ƥ륻νܼŪʬޥ䥤饤
	ؿƽФǼ¸Ƥˤϡƥ륻
	κǸȽФƬˡAsm("":::"memory")ȤҤ롥
-----

Хꥢ̿(Asm("":::"memory"))ϡARMCCȸߴʤᡤ
Ҥ򤹤սϡΥޥǵҤȡѥŬڤʥ
ꥢ֤̿롥

  ARM_MEMORY_CHANGED

2.󥯥롼ˡ

åȰ¸ ݡƥ󥰥ɤ1.5ˤϡΤ褦˵ҤƤ롥

-----
¾Υإåեϡ#include "..."פˤꥤ󥯥롼ɤ롥إ
ե뤬ȥǥ쥯ȥ䥤󥯥롼ɤեƱǥ
쥯ȥʳΥǥ쥯ȥ֤ƤˤϡΤ褦˥ѥ
Ԥ
-----

GCC¸ARMCC¸ǥإåեͭǤʤˤϡ줾
Ʊ̾Υեġơѥ륪ץǥ󥯥롼
٤ե˻ꤷƤ롥ΤᡤARMCCȶͭե
Υե򥤥󥯥롼ɤˤϡ#include "..."פǤϤʤ
#include <...>פǵҤХѥǤϤʤե̾Τߤ򵭺ܤ뤳
ȡ

3.֥ǥ쥯ƥ

GCCARMCCΥ֥ǥ쥯ƥ֤ϸߴʤΤᡤARMCC
ͭեϼ˼ޥǥ쥯ƥ֤ǵҤ뤳ȡ

ޥǥ쥯ƥ     GCCǥ쥯ƥ
 ASECTION(name)          .section name,"a"
 ATEXT                   .text
 AGLOBAL(name)           .global name
 AALIGN(x)               .align x
 ALONG                   .long
 ALABEL(label)           label:
 AOR                       |
 ATHUMB(name)            __athumb name


(9)ɥ

¹Ԥ٤ʤϡǥѥå㡼ǳߤĤơ
ߤԤġdispatcher_2ˡARM-M¸ΥɤǤϡΤ褦ˤʤä
롥

    PRIMASK 򥻥å
    ߵ
    wfi
    PRIMASK 򥯥ꥢʳߤդ
    CPUå֤

åȰ¸ǡ嵭νˡϥ⡼˰ܹԤ
ҤˤϡåȰ¸ǡTOPPERS_CUSTOM_IDLE
˼¹Ԥ toppers_asm_custom_idle Ȥ֥ޥ
ȤƵҤ롥

ʤtoppers_asm_custom_idle εҤˤäƤϡΥ쥸
oppers_asm_custom_idleǻѤ뤿ᡤoppers_asm_custom_idle 
ǻѤϡ¸뤳ȡΥ쥸 Calee 
saved 쥸Ǥ뤿ᡤ oppers_asm_custom_idle ȤƴؿƤӽФ
ϡƤӽФؿǼưŪ¸뤿ᡤ֥
Ǥ¸ɬפʤ

쥸 : 
r4      : '0'
r5      : 'IIPM_LOCK'
r6      : reqflgΥɥ쥹
r7      : lock_flgΥɥ쥹
sp      : 󥿥ƥѤΥåƬɥ쥹(msp)

֥ޥC쵭Ÿȥ顼Ȥʤ롥core_support.S 
ϡTOPPERS_ASM_MACRO ȤޥƤ뤿ᡤåȰ¸
 toppers_asm_custom_idle ֥ޥݤˤϡ
TOPPERS_ASM_MACRO 拾ѥξȤѤ뤳ȡ

(10)FPU
Cortex-M4FFPU򥵥ݡȤƤ롥FPUλˡϼ3फ
ǽǤ롥줾MakefileFPU_USAGEޥƻꤹ롥
ʤFPU̵Ȥ롥

FPU_NO_PRESERV       
ǥѥåǤFPUƥȤ¸Ԥʤ
FPUѲǽʥ1Ĥ⤷ϡƥκǹͥ٤ISRǻ
Ѳǽ

FPU_NO_LAZYSTACKING 
ǥѥåǤFPUƥȤ¸ԤLazy stacking 
ѤʤƤΥ/ISRFPUѲǽ

FPU_LAZYSTACKING
ǥѥåǤFPUƥȤ¸ԤLazy stacking 
Ѥ롥ƤΥ/ISRFPUѲǽ

(11)¾

1. ٥ơ֥Υ

core.tf ǰʲ _kernel_vector_table ѿκݤˡ
GEN_VECTOR_TABLE_VARNAME ȤؿƤСcore.tf Ǥ
ϹԤ鷺GEN_VECTOR_TABLE_VARNAME ƤӽФ

const FP _kernel_vector_table[] = 

GEN_VECTOR_TABLE_VARNAME ƤǤ⡤Τϡ
core.tfǹԤ

2. ARMv6-MǤγߥå(SIL_LOC_INT())

CPUåߥåPRIMASKѤƤ뤿ᡤCPUå
åHardwareFaultʳ㳰ȯƼդʤʤȤ
󤬤롥

(12) С
2015/11/22
Cortex-M4FFPUΥݡȤɲá

2015/11/14
ARMv7-M
  core_sil.h
    ߥå(SIL_LOC_INT())BASEPRIѤ褦ѹ
    FAULTMASKFAULTMASK򥻥åȤ֤㳰ȯ㳰
      ȯʤᡥ

2015/11/04
ARMv6-Mб˴ؤѹ
 ARMv7-M˱ƶڤܤѹ
  㳰ե졼ΥեޥåȤѹ(basepriEXC_RETURNνѹ)
  ȥݥ(_start)͡оݤѹ
    C饤֥_start̾ʣ뤿ᡥ
  Makefile.core -nostdlib դʤ褦ѹ
    åȰ¸ǻꤹ
  
2014/12/01
core_support.S
  2013/08/20 νPSPؤγͥ٥ޥ(r2)EXC_RETURN(lr)
  ¸stfmdǹԤˤåؤѤlr,r2ȤʤäƤ뤿
  ߡ㳰иΥɤȤȤƤʤär2,lr¸
  褦lrr0˰öԡr0(lr),r2stmfd˻ꤹ褦ѹ
    
2014/07/23
target_timer_probe_int()ˤơSYSTIC_CONTROL_STATUS ɤ߹
  ȥꥢ뤿ᡤʣɤ߹ȤˤŬʤ
  ΤᡤNVICΥڥǥ󥰥쥸ɤ߹褦ѹ

2012/10/17
1.8.0бΤᡤchar_t βս¾ηѹ

2013/08/20
core_support.S
 㳰/㳰ȯPSPؤγͥ٥ޥ(r2)EXC_RETURN(lr)
 ¸stmfd1̿Ǽ»ܤ褦ѹ

2013/03/10
core_support.S
  sub/addϥ֥ˤ32bit̿sub.w/add.wѴ롥16bit̿
  subs/addsǤʤᡤѹ

2012/06/18
xxx_stddef.h ХѥǤϤʤե̾Τߤǻꤹ褦ѹ
  ɤΥեѤ뤫¾ΥեƱͤ˥ѥؤΥ󥯥롼
  ɻνȤ롥
core.tf  _kernel_vector_table ѿʬݤˡ
  GEN_VECTOR_TABLE_VARNAME ȤؿƤСƤӽФ褦
  ѹ
  ˡѥ˰ۤʤ뤿Ѱա
    
2012/02/29
Makefile.core
  CDEFSTOPPERS_LABEL_ASMꤷƤARMѤgccǤϥ֥
    Υܥ_դʤ
  
2012/02/02
core_config.h
  x_set_ipm()ǡiipm'0'(IIPM_ENAALL)λ
core_support.S
  toppers_asm_custom_idleǻѤ쥸ѹѹ
    ꡤtoppers_asm_custom_idle ǴؿƤӽФ򤹤ϡ
    ٥ǤΥ쥸¸ɬפʤʤä
    
2012/02/23
core_support.S
  core_exc_entrybasepriɤ߹ȡߥå֤Υ
    å˾񤭤Ƥ
  call_texrtncall_texrtnθƤӽФb̿ǵҤȡ16bit̿
    Ʋ᤹륳ѥ餬뤿ᡤ֤ˤäƤϥ󥸤­
    ʤʤ롥bx̿ѹ뤳Ȥ

2012/01/31
core_timer.c
 ޳ߥϥɥˤơprobe_int ΤᡤCOUNTFLAG򥯥ꥢ뤿
   ɤ߹Ǥ쥸äƤ
 
2011/12/03
core_test.h ¿ť󥯥롼ɻߥޥ̾ν
 CHIP  CORE ˽

ARMCCбȼѹ
  core_asm.inc(ɲ)
    GCCΥ֥Υǥ쥯ƥ֤򵭽Ҥեɲá
  core_config.h(ѹ)
    core_insn.h Υ󥯥롼ˡ""<>ѹơѥ
      ǻꤵ줿ǥ󥯥롼ɥե򥵡褦ѹ
   Хꥢ̿(Asm("":::"memory"))ޥcore_insn.h 
     Ѥ褦ѹ     
  core_insn.h(ѹ)
   Хꥢ̿(Asm("":::"memory"))Υޥɲ
  core_support.S(ѹ)
   ARMCCȥեͭ뤿ᡤǥ쥯ƥ֤ޥ˽񤭴      
  start.S(ѹ)
   ARMCCȥեͭ뤿ᡤǥ쥯ƥ֤ޥ˽񤭴  
   
2011/07/26
CCRSTKALIGN'1'ξؤб
  ߡ㳰νǤϡåϾ8byteȤʤ褦
  
  
2011/07/25
CPU㳰ͥ٤ν
  CPUåǥޥǤʤͥ١ͥ0ˤ˽ɲá
  
CFG_INTǻѤǤͥ٤κͤν(core.tf)
  ͤ1礭ͤȤʤäƤ
  
ͥγߤΰѹ
  Ǥΰѹȼѹ
  
޳ߥϥɥǤCOUNTFLAGΥꥢν
  SYSTIC_CONTROL_STATUS쥸COUNTFLAG򥯥ꥢˤϡ
  SYSTIC_CURRENT_VALUE쥸ɤ߹ɬפ뤬ä
  SYSTIC_CONTROL_STATUS쥸ɤ߹Ǥ

core_int_entryˤbasepri
  NVICͥ٥ޥưŪꤵ뤿ͥ٥ޥǤɬפ
  x_get_ipm()basepri򻲾Ȥ뤿ᡤbasepri⹹褦ѹ

2011/07/24
_ret_int_2/svc_handler ѹ
  ͥ٥ޥ֤Ǥ㳰ƤӽФʤ褦
  ͤѹ줿ᡤ_ret_int_2Ǥϡͥ٥ޥ
  ֡TIPM_ENAALLˤꤹ褦ѹ
  svc_handlerϥ˥꥿󤹤basepriIIPM_ENAALLˤ褦
  ѹ
  
x_config_int()/set_exc_int_priority()ν  
  x_config_int()顤set_exc_int_priority()ФƳͥ٤
  ƸƤӽФᡤͥ٤ǸƤӽФ褦
  set_exc_int_priority()äͥ٤Ȥͥ٤
  褦˽

2011/07/23
1.4.0update.

arm¸Ʊͤ˥åװ¸֤褦˥ǥ쥯ȥ깽¤ѹ

arm¸Ʊͤ˥ե̾Υץեåcoreѹ

call_atexitκ
  software_term_hook θƤӽФϡcore_terminate()˰ư
  
1.7.0update.  

ƥȥ֥åη̾ѹ
  CTXBTSKCTXB̾ѹ

åȰ¸ǥݡȤ뵡ǽ򼨤ޥѹ
  TOPPERS_SUPPORT_DIS_INTTOPPERS_TARGET_SUPPORT_DIS_INTˡ
  TOPPERS_SUPPORT_ENA_INTTOPPERS_TARGET_SUPPORT_ENA_INTˡ
  ѹ
  
exc_sense_unlock  
  
եåȥե򥳥ե졼ˡؤб

CHECK_FUNC_ALIGNCHECK_FUNC_NONNULLCHECK_STACK_ALIGN
  CHECK_STACK_NONNULLCHECK_MPF_ALIGNCHECK_MPF_NONNULL򡤥
  åȰ¸Υƥץ졼ȥեʥѥ3ˤإåե˰
  ư

ߤ㳰̾ѹ
  int_entrycore_int_entryexc_entrycore_exc_entryѹ
  եåȤμˡѹȤʤäᡤ̾Τޤޤcfg1_out.c
  ѥ륨顼Ȥʤ뤿ѹ
  
åȰ¸̾ΤΥ͡ɲ

call_texrtnƤӽФˡipmflgtrueפɲ
 
ͥCPU㳰ΰѹ

2011/07/22
x_disable_int() : prc_config.h ν   
 ߶ػߥ쥸Υɥ쥹ݤˡ١ͤuint32_t
 ݥ󥿤˥㥹ȤƤʤäᡤɥ쥹ǤƤ
 ä
 
󥿥ƥѤΥåνͥޥ(TOPPERS_ISTKPT)ν 
  : prc_config.h
 Хñ̤Ǽ褦ˡ(char_t *) ˥㥹ȤƷǺܤ褦˽
 
  
LOG_INH_ENTRYLOG_INH_LEAVEθ : prc_support.S
  LOG_INH_ENTRYLOG_INH_LEAVEǤ٤ս꤬ LOG_EXC_ENTRY
  LOG_EXC_ENTRYˤʤäƤ

TOPPERS_CUSTOM_IDLE typoν : prc_support.S

svn_hanlderν :  prc_support.S
  ΧEXC_FRAME_SIZEʬΥåΤƤƤConfigureation and 
  Control Register(CCR)STKALIGN'1'ξ  ϡ8byte˥饤
  뤿ᡤΤƤ륵ۤʤ롥饤󤵤줿ϡxPSR9ӥ
  Ȥå뤳ȤˤȽꤹ롥
  
prc.tfν
  boostΥСˤäѤưۼ
  http://www.toppers.jp/TOPPERS-USERS/201004/msg00034.html
  
_kernel_istkpt κ : prc_cfg1_out.h
  _kernel_istkpt ɬפʤåȤ¸ߤ뤿ᡤɬפʤ顤
  åȰ¸褦ѹ

2008/08/22
prc_user.txt/prc_design.txt
  2008/8/21εѸƤǤε̤ȿǡ
  
prc_support.S/prc_config.c/prc_config.h/arm_m.h
  ƥȽexc_ncnt饢ƥ֤ʥåѹ
  
prc_config.c
  set_exc_int_priority() ǥݡȲǽIRQξ¤239˳ĥ
  
start.S 
  ưThread⡼ɤȤƤ뤳Ȥ
  ֡ȥ鵯ưꤷMSPͭˤ褦
    ѹ
    
prc_timer.c
  Ȥ
  ǥХåѥɤ

2008/07/11
ǽΥ꡼
