搜索
bottom↓
回复: 99

【网友经验分享】飞思卡尔Cortex M0+系列 Keil MDK启动文件详解

  [复制链接]

出0入0汤圆

发表于 2014-8-25 16:07:59 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZJJ 于 2014-9-11 14:56 编辑

入手飞思卡尔,从启动文件学起吧,这是查阅官方帮助文档整理的版本,是已知目前最详细的启动文件介绍,结合了MAP文件和SCT文件
如有错误还请指正
在其他平台,启动文件功能基本一致,这里是我整理的MDK下的版本,修正了网上其它版本的一些错误,描述更详细
启动文件
  1. ;/*****************************************************************************
  2. ; * @file:    startup_MKL02Z4.s
  3. ; * @purpose: CMSIS Cortex-M0plus Core Device Startup File for the
  4. ; *           MKL02Z4
  5. ; * @version: 1.0
  6. ; * @date:    2012-10-4
  7. ; *
  8. ; * Copyright: 1997 - 2013 Freescale Semiconductor, Inc. All Rights Reserved.
  9. ;*
  10. ; *------- <<< Use Configuration Wizard in Context Menu >>> ------------------
  11. ; *
  12. ; *****************************************************************************/


  13. ; <h> Stack Configuration
  14. ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
  15. ; </h>

  16. Stack_Size      EQU     0x00000100
  17.                 ;EQU定义符号指示Stack大小
  18.    
  19.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3   
  20.                 ;AREA 通知汇编器汇编一段新的代码或数据节(section)
  21.                 ;STACK 为AREA所定义的新的节的节名称(sectionname)
  22.                 ;NOINIT 指示这段数据节不初始化或初始化为0,以SPACE等指示的空间初始化为0,但不能初始化为其它
  23.                 ;       备注:即这段不能指定初始化值,如果不加NOINIT的话,MAP文件SPACE的数据类型为Data,为RW Data
  24.                 ;             如果加NOINIT的话,MAP文件SPACE的数据类型为Zero,为ZI Data
  25.                 ;READWRITE 指示该节类型为RW
  26.                 ;ALIGN=3 指示该节对齐到8字节boundary,即为双字地址
  27.                 ;        备注:在MAP文件中,可以发现是通过添加PAD类型的数据进行节的对齐
  28.                 ;              PAD取何值可以指定
  29.                                                             

  30. Stack_Mem       SPACE   Stack_Size
  31.                 ;Stack_Mem 为一个标签(label),标签值为在当前节中的地址
  32.                 ;SPACE 指示(directive)一块内存(memory),这块内存所在节的特性由上面的AREA指定
  33. __initial_sp
  34.                 ;__initial_sp 为上面SPACE块的顶端地址+1,即说明堆栈的初始值为顶端地址,堆栈是向下生长的满栈
  35.                 ;             备注:因为CM的入栈操作是,*(--R13)=R0类似的一种方式,R13指向最后的数据


  36. ; <h> Heap Configuration
  37. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
  38. ; </h>

  39. Heap_Size       EQU     0x00000100
  40.                 ;定义符号指示Heap大小

  41.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  42.                 ;定义一个新的节,节名称为HEAP,其它与STACK相同
  43.                 ;EXPORT __heap_base
  44. __heap_base
  45.                 ;定义一个标签,指示HEAP的基地址,这个标签只用在使用MICROLIB时被EXPORT,即只有这时有效
  46.                 ;使用MICROLIB时,这个标签被EXPORT,类似于C语言中的extern,但只有当HEAP被使用的时候
  47.                 ;                才出现在MAP文件中,如在main()中可以这样来访问__heap_base
  48.                 ;                void main(void)
  49.                 ;                {
  50.                 ;                   extern int __heap_base;
  51.                 ;                   static int HEAPBASE;    //定义静态变量,在内存中有固定的存储空间
  52.                 ;                   ......
  53.                 ;                   HEAPBASE = __heap_base; //读取HEAP的即地址,只在MICROLIB时有效
  54.                 ;                   ......
  55.                 ;                 }
  56.                 ;如果要在不使用MICROLIB时,读取__heap_base, 那只需要在__heap_base前添加EXPORT __heap_base                  
  57. Heap_Mem        SPACE   Heap_Size
  58.                 ;EXPORT Heap_Mem
  59.                 ;定义HEAP的内存段,标签为Heap_Mem,将Heap_Mem EXPORT之后,可以这样访问:
  60.                 ;       extern int Heap_Mem;
  61.                 ;       static int* pHEAPMEM;
  62.                 ;       pHEAPMEM = (int*)Heap_Mem;
  63. __heap_limit
  64.                 ;定义一个标签,HEAP的地址范围为__heap_base ~ (__heap_limit - 1)
  65.                
  66. ;这里结合MAP文件外插上几句
  67. ;1. 当:STACK 所在节属性为 AREA    STACK, NOINIT, READWRITE, ALIGN=3
  68. ;       HEAP  所在节属性为 AREA    HEAP,  NOINIT, READWRITE, ALIGN=3
  69. ;   时,MAP文件的执行时期RAM镜像为
  70. ;   Execution Region RW_IRAM2 (Base: 0x20000000, Size: 0x00000268, Max: 0x00000c00, ABSOLUTE)
  71. ;
  72. ;   Base Addr    Size         Type   Attr      Idx    E Section Name        Object
  73. ;
  74. ;   0x20000000   0x00000004   Data   RW            4    .data               system_mkl02z4.o
  75. ;   0x20000004   0x00000004   Data   RW           61    .data               blinky.o
  76. ;   0x20000008   0x00000060   Zero   RW          139    .bss                c_p.l(libspace.o)
  77. ;   0x20000068   0x00000100   Zero   RW           48    HEAP                startup_mkl02z4.o
  78. ;   0x20000168   0x00000100   Zero   RW           47    STACK               startup_mkl02z4.o
  79. ;
  80. ;   可见,在程序运行时,数据在内存中存放的顺序为有初始化的Data类型,和0初始化的Zero类型
  81. ;   此时,HEAP向上增长,STACK向下生长,二者的方向是相向的
  82. ;   全局变量,如果没有指定初始值,如static int gTestData; 是存放在.dada节,而不是.bss
  83. ;
  84. ;2. 当:STACK 所在节属性为 AREA    STACK,         READWRITE, ALIGN=3
  85. ;       HEAP  所在节属性为 AREA    HEAP,  NOINIT, READWRITE, ALIGN=3
  86. ;   时,MAP文件的执行时期RAM镜像为
  87. ;   Execution Region RW_IRAM2 (Base: 0x20000000, Size: 0x00000268, Max: 0x00000c00, ABSOLUTE)
  88. ;
  89. ;   Base Addr    Size         Type   Attr      Idx    E Section Name        Object
  90. ;
  91. ;   0x20000000   0x00000004   Data   RW            4    .data               system_mkl02z4.o
  92. ;   0x20000004   0x00000004   Data   RW           61    .data               blinky.o
  93. ;   0x20000008   0x00000100   Data   RW           47    STACK               startup_mkl02z4.o
  94. ;   0x20000108   0x00000060   Zero   RW          139    .bss                c_p.l(libspace.o)
  95. ;   0x20000168   0x00000100   Zero   RW           48    HEAP                startup_mkl02z4.o
  96. ;
  97. ;   此时HEAP向上增长,STACK向下生长,二者的方向是相背的
  98. ;   同时可以看出,不用NOINIT修饰时,STACK的数据类型为Data,是一种RW Type,否则是一种ZI Type
  99. ;
  100. ;部分细节看参见Linker User Guide: Type 2 image, one load region and non-contiguous execution regions
  101.    
  102.                 PRESERVE8
  103.                 ;通知链接器(linker)当前文件是以堆栈8字节对齐,使用PRESERVE8的话,说明我们现在的文件堆栈是以8字节对齐的
  104.                 ;这样的话,这里的函数可以调用由REQUIRE8指示的文件的函数,而不引起错误,如LDRD and STRD指令,因为
  105.                 ;LDRD and STRD instructions (double-word transfers) only work correctly if the address they access
  106.                 ;is 8-byte aligned.
  107.                 THUMB
  108.                 ;通知编译器采用THUMB指令集


  109. ; Vector Table Mapped to Address 0 at Reset

  110.                 AREA    RESET, DATA, READONLY
  111.                 ;指示当前节为RESET,节的属性为DATA(Contains data, not instructions),RO
  112.                 EXPORT  __Vectors
  113.                 EXPORT  __Vectors_End
  114.                 EXPORT  __Vectors_Size
  115.                 ;全局变量__Vectors,__Vectors_End,和__Vectors_Size
  116. ;分散加载文件SCT为
  117. ;   LR_IROM1 0x00000000 0x00008000  {       ; load region size_region
  118. ;       ER_IROM1 0x00000000 0x00008000  {   ; load address = execution address
  119. ;           *.o (RESET, +First)             ; +First指示执行时RESET节置于最开始
  120. ;           *(InRoot$Sections)             ; InRoot$Sections指代所有必须放在根区域的节
  121. ;                                           ; 如__main.o, __scatter*.o,
  122. ;                                           ;  __dc*.o, and * Region$Table
  123. ;           .ANY (+RO)                      ; Read only的数据执行时在这里
  124. ;       }
  125. ;       RW_IRAM1 0x1FFFFC00 0x00000400  {   ; RW data
  126. ;           .ANY (+RW +ZI)
  127. ;       }
  128. ;       RW_IRAM2 0x20000000 0x00000C00  {
  129. ;           .ANY (+RW +ZI)
  130. ;       }
  131. ;   }
  132. ;我们可以这样更改分散加载文件为
  133. ;   LR_IROM1 0x00000000 0x00008000  {    ; load region size_region
  134. ;       ER_IROM1 0x00000000 0x00008000  {  ; load address = execution address
  135. ;           *.o (RESET, +First)
  136. ;           *(InRoot$Sections)
  137. ;           .ANY (+RO)
  138. ;       }
  139. ;       RW_IRAM1 0x1FFFFC00 0x00000400  {  ; RW data
  140. ;           .ANY (+ZI)
  141. ;       }
  142. ;       RW_IRAM2 0x20000000 0x00000C00  {
  143. ;           .ANY (+RW)
  144. ;           *.o (.bss)
  145. ;       }
  146. ;   }
  147. ;这样,执行时候的内存镜像变成这样子了,我们利用起来了两块RAM区的特点
  148. ;    Execution Region RW_IRAM1 (Base: 0x1ffffc00, Size: 0x00000200, Max: 0x00000400, ABSOLUTE)
  149. ;
  150. ;    Base Addr    Size         Type   Attr      Idx    E Section Name        Object
  151. ;
  152. ;    0x1ffffc00   0x00000100   Zero   RW           48    HEAP                startup_mkl02z4.o
  153. ;    0x1ffffd00   0x00000100   Zero   RW           47    STACK               startup_mkl02z4.o
  154. ;
  155. ;
  156. ;    Execution Region RW_IRAM2 (Base: 0x20000000, Size: 0x00000068, Max: 0x00000c00, ABSOLUTE)
  157. ;
  158. ;    Base Addr    Size         Type   Attr      Idx    E Section Name        Object
  159. ;
  160. ;    0x20000000   0x00000004   Data   RW            4    .data               system_mkl02z4.o
  161. ;    0x20000004   0x00000004   Data   RW           61    .data               blinky.o
  162. ;    0x20000008   0x00000060   Zero   RW          139    .bss                c_p.l(libspace.o)

  163. __Vectors       DCD     __initial_sp        ; Top of Stack
  164.                                             ; DCD 申请4字节的空间,存放数据
  165.                                             ; 由于分散加载文件SCT中的*.o (RESET, +First)属性
  166.                                             ; RESET节被放在了LR_IROM1的开始位置,即__initial_sp存放在0地址
  167.                 DCD     Reset_Handler       ; Reset Handler
  168.                 DCD     NMI_Handler         ; NMI Handler
  169.                 DCD     HardFault_Handler   ; Hard Fault Handler
  170.                 DCD     0  ; Reserved
  171.                 DCD     0  ; Reserved
  172.                 DCD     0  ; Reserved
  173.                 DCD     0  ; Reserved
  174.                 DCD     0  ; Reserved
  175.                 DCD     0  ; Reserved
  176.                 DCD     0  ; Reserved
  177.                 DCD     SVC_Handler         ; SVCall Handler
  178.                 DCD     0  ; Reserved
  179.                 DCD     0  ; Reserved
  180.                 DCD     PendSV_Handler      ; PendSV Handler
  181.                 DCD     SysTick_Handler     ; SysTick Handler

  182.                 ; External Interrupts
  183.                 DCD     Reserved16_IRQHandler  ; Reserved interrupt 16
  184.                 DCD     Reserved17_IRQHandler  ; Reserved interrupt 17
  185.                 DCD     Reserved18_IRQHandler  ; Reserved interrupt 18
  186.                 DCD     Reserved19_IRQHandler  ; Reserved interrupt 19
  187.                 DCD     Reserved20_IRQHandler  ; Reserved interrupt 20
  188.                 DCD     FTFA_IRQHandler     ; FTFA command complete/read collision interrupt
  189.                 DCD     LVD_LVW_IRQHandler  ; Low Voltage Detect, Low Voltage Warning
  190.                 DCD     Reserved23_IRQHandler  ; Reserved interrupt 23
  191.                 DCD     I2C0_IRQHandler  ; I2C0 interrupt
  192.                 DCD     I2C1_IRQHandler  ; I2C1 interrupt
  193.                 DCD     SPI0_IRQHandler  ; SPI0 interrupt
  194.                 DCD     Reserved27_IRQHandler  ; Reserved interrupt 27
  195.                 DCD     UART0_IRQHandler  ; UART0 status/error interrupt
  196.                 DCD     Reserved29_IRQHandler  ; Reserved interrupt 29
  197.                 DCD     Reserved30_IRQHandler  ; Reserved interrupt 30
  198.                 DCD     ADC0_IRQHandler  ; ADC0 interrupt
  199.                 DCD     CMP0_IRQHandler  ; CMP0 interrupt
  200.                 DCD     TPM0_IRQHandler  ; TPM0 fault, overflow and channels interrupt
  201.                 DCD     TPM1_IRQHandler  ; TPM1 fault, overflow and channels interrupt
  202.                 DCD     Reserved35_IRQHandler  ; Reserved interrupt 35
  203.                 DCD     Reserved36_IRQHandler  ; Reserved interrupt 36
  204.                 DCD     Reserved37_IRQHandler  ; Reserved interrupt 37
  205.                 DCD     Reserved38_IRQHandler  ; Reserved interrupt 38
  206.                 DCD     Reserved39_IRQHandler  ; Reserved interrupt 39
  207.                 DCD     Reserved40_IRQHandler  ; Reserved interrupt 40
  208.                 DCD     Reserved41_IRQHandler  ; Reserved interrupt 41
  209.                 DCD     Reserved42_IRQHandler  ; Reserved interrupt 42
  210.                 DCD     MCG_IRQHandler  ; MCG interrupt
  211.                 DCD     LPTimer_IRQHandler  ; LPTimer interrupt
  212.                 DCD     Reserved45_IRQHandler  ; Reserved interrupt 45
  213.                 DCD     PORTA_IRQHandler  ; Port A interrupt
  214.                 DCD     PORTB_IRQHandler  ; Port B interrupt
  215. __Vectors_End
  216.                 ;这里__Vectors_End的值为0x000000c0 (在MAP文件里查看)

  217. __Vectors_Size         EQU     __Vectors_End - __Vectors   ;计算中断向量表的大小

  218. ; 以下为Freescale特有的配置方式(我的理解,在ST中不是采用的这种配置方法)
  219. ; Flash配置区域在Flash的0x0000_0400开始的空间,一共16字节
  220. ; 关于Flash配置区域在帖子 http://www.amobbs.com/thread-5588189-1-1.html 中有描述
  221. ; 以下定义的变量值,在下面有采用,这边略过Flash配置字的含义,详见Reference Mannual
  222. ;
  223. ;
  224. ; <h> Flash Configuration
  225. ;   <i> 16-byte flash configuration field that stores default protection settings (loaded on reset)
  226. ;   <i> and security information that allows the MCU to restrict acces to the FTFL module.
  227. ;   <h> Backdoor Comparison Key
  228. ;     <o0>  Backdoor Key 0  <0x0-0xFF:2>
  229. ;     <o1>  Backdoor Key 1  <0x0-0xFF:2>
  230. ;     <o2>  Backdoor Key 2  <0x0-0xFF:2>
  231. ;     <o3>  Backdoor Key 3  <0x0-0xFF:2>
  232. ;     <o4>  Backdoor Key 4  <0x0-0xFF:2>
  233. ;     <o5>  Backdoor Key 5  <0x0-0xFF:2>
  234. ;     <o6>  Backdoor Key 6  <0x0-0xFF:2>
  235. ;     <o7>  Backdoor Key 7  <0x0-0xFF:2>
  236. BackDoorK0      EQU     0xFF
  237. BackDoorK1      EQU     0xFF
  238. BackDoorK2      EQU     0xFF
  239. BackDoorK3      EQU     0xFF
  240. BackDoorK4      EQU     0xFF
  241. BackDoorK5      EQU     0xFF
  242. BackDoorK6      EQU     0xFF
  243. BackDoorK7      EQU     0xFF
  244. ;   </h>
  245. ;   <h> Program flash protection bytes (FPROT)
  246. ;     <i> Each program flash region can be protected from program and erase operation by setting the associated PROT bit.
  247. ;     <i> Each bit protects a 1/32 region of the program flash memory.
  248. ;     <h> FPROT0
  249. ;       <i> Program flash protection bytes
  250. ;       <i> 1/32 - 8/32 region
  251. ;       <o.0>   FPROT0.0
  252. ;       <o.1>   FPROT0.1
  253. ;       <o.2>   FPROT0.2
  254. ;       <o.3>   FPROT0.3
  255. ;       <o.4>   FPROT0.4
  256. ;       <o.5>   FPROT0.5
  257. ;       <o.6>   FPROT0.6
  258. ;       <o.7>   FPROT0.7
  259. nFPROT0         EQU     0x00
  260. FPROT0          EQU     nFPROT0:EOR:0xFF
  261. ;     </h>
  262. ;     <h> FPROT1
  263. ;       <i> Program Flash Region Protect Register 1
  264. ;       <i> 9/32 - 16/32 region
  265. ;       <o.0>   FPROT1.0
  266. ;       <o.1>   FPROT1.1
  267. ;       <o.2>   FPROT1.2
  268. ;       <o.3>   FPROT1.3
  269. ;       <o.4>   FPROT1.4
  270. ;       <o.5>   FPROT1.5
  271. ;       <o.6>   FPROT1.6
  272. ;       <o.7>   FPROT1.7
  273. nFPROT1         EQU     0x00
  274. FPROT1          EQU     nFPROT1:EOR:0xFF
  275. ;     </h>
  276. ;     <h> FPROT2
  277. ;       <i> Program Flash Region Protect Register 2
  278. ;       <i> 17/32 - 24/32 region
  279. ;       <o.0>   FPROT2.0
  280. ;       <o.1>   FPROT2.1
  281. ;       <o.2>   FPROT2.2
  282. ;       <o.3>   FPROT2.3
  283. ;       <o.4>   FPROT2.4
  284. ;       <o.5>   FPROT2.5
  285. ;       <o.6>   FPROT2.6
  286. ;       <o.7>   FPROT2.7
  287. nFPROT2         EQU     0x00
  288. FPROT2          EQU     nFPROT2:EOR:0xFF
  289. ;     </h>
  290. ;     <h> FPROT3
  291. ;       <i> Program Flash Region Protect Register 3
  292. ;       <i> 25/32 - 32/32 region
  293. ;       <o.0>   FPROT3.0
  294. ;       <o.1>   FPROT3.1
  295. ;       <o.2>   FPROT3.2
  296. ;       <o.3>   FPROT3.3
  297. ;       <o.4>   FPROT3.4
  298. ;       <o.5>   FPROT3.5
  299. ;       <o.6>   FPROT3.6
  300. ;       <o.7>   FPROT3.7
  301. nFPROT3         EQU     0x00
  302. FPROT3          EQU     nFPROT3:EOR:0xFF
  303. ;     </h>
  304. ;   </h>
  305. ;   </h>
  306. ;   <h> Flash nonvolatile option byte (FOPT)
  307. ;     <i> Allows the user to customize the operation of the MCU at boot time.
  308. ;     <o.0>  LPBOOT0
  309. ;       <0=> Core and system clock divider (OUTDIV1) is 0x7 (divide by 8) or 0x3 (divide by 4)
  310. ;       <1=> Core and system clock divider (OUTDIV1) is 0x1 (divide by 2) or 0x0 (divide by 1)
  311. ;     <o.4>  LPBOOT1
  312. ;       <0=> Core and system clock divider (OUTDIV1) is 0x7 (divide by 8) or 0x1 (divide by 2)
  313. ;       <1=> Core and system clock divider (OUTDIV1) is 0x3 (divide by 4) or 0x0 (divide by 1)
  314. ;     <o.2>  NMI_DIS
  315. ;       <0=> NMI interrupts are always blocked
  316. ;       <1=> NMI pin/interrupts reset default to enabled
  317. ;     <o.3>  RESET_PIN_CFG
  318. ;       <0=> RESET pin is disabled following a POR and cannot be enabled as RESET function
  319. ;       <1=> RESET pin is dedicated
  320. ;     <o.3>  FAST_INIT
  321. ;       <0=> Slower initialization
  322. ;       <1=> Fast Initialization
  323. FOPT            EQU     0xFF
  324. ;   </h>
  325. ;   <h> Flash security byte (FSEC)
  326. ;     <i> WARNING: If SEC field is configured as "MCU security status is secure" and MEEN field is configured as "Mass erase is disabled",
  327. ;     <i> MCU's security status cannot be set back to unsecure state since Mass erase via the debugger is blocked !!!
  328. ;     <o.0..1> SEC
  329. ;       <2=> MCU security status is unsecure
  330. ;       <3=> MCU security status is secure
  331. ;         <i> Flash Security
  332. ;         <i> This bits define the security state of the MCU.
  333. ;     <o.2..3> FSLACC
  334. ;       <2=> Freescale factory access denied
  335. ;       <3=> Freescale factory access granted
  336. ;         <i> Freescale Failure Analysis Access Code
  337. ;         <i> This bits define the security state of the MCU.
  338. ;     <o.4..5> MEEN
  339. ;       <2=> Mass erase is disabled
  340. ;       <3=> Mass erase is enabled
  341. ;         <i> Mass Erase Enable Bits
  342. ;         <i> Enables and disables mass erase capability of the FTFL module
  343. ;     <o.6..7> KEYEN
  344. ;       <2=> Backdoor key access enabled
  345. ;       <3=> Backdoor key access disabled
  346. ;         <i> Backdoor key Security Enable
  347. ;         <i> These bits enable and disable backdoor key access to the FTFL module.
  348. FSEC            EQU     0xFE
  349. ;   </h>
  350. ;
  351. ; 在这里,定义了一个新的节,名称是.ARM,位于地址0x400,在MAP文件里是这样的
  352. ;   ......
  353. ;   0x000003cc   0x00000030   Data   RO          263    Region$Table       anon$obj.o
  354. ;   0x000003fc   0x00000004   PAD
  355. ;   0x00000400   0x00000010   Code   RO           50    .ARM.__at_0x400     startup_mkl02z4.o
  356. ;   0x00000410   0x00000174   Code   RO           59    .text               blinky.o
  357. ;   0x00000584   0x0000015a   Code   RO           93    .text               c_p.l(aeabi_sdiv.o)
  358. ;   ......
  359. ; 可见PAD补充字节空间,.ARM.__at_0x400放在了0x0400地址,而这些地址存放的数据,是CODE,RO类型
  360. ; 下面的DCB填充了这16个字节
  361.                 IF      :LNOT::DEF:RAM_TARGET
  362.                     ; :DEF:A 语句,如果A定义,返回真,否则返回假
  363.                     ; :LNOT:A 语句,是对A的逻辑取反
  364.                     ; 结合上面的 IF,所以以下代码尽在RAM_TARGET没定义的时候会产生
  365.                     ; 如果在RAM中调试的话,应该定义RAM_TARGET,那样的话也就不需要FLASH配置字了
  366.                     ;
  367.                 AREA    |.ARM.__at_0x400|, CODE, READONLY
  368.                     ; 定义一个节,存放配置数据,单片机复位后,FLASH控制器加载这些配置
  369.                     ;
  370.                 DCB     BackDoorK0, BackDoorK1, BackDoorK2, BackDoorK3
  371.                 DCB     BackDoorK4, BackDoorK5, BackDoorK6, BackDoorK7
  372.                 DCB     FPROT0,     FPROT1,     FPROT2,     FPROT3
  373.                 DCB     FSEC,       FOPT,       0xFF,     0xFF
  374.                 ENDIF

  375. ; 下面是程序端的开始
  376.                 AREA    |.text|, CODE, READONLY
  377.                     ; AREA定义.text节存放代码,因为.text不是有效的变量名,所以加||限定


  378. ; Reset Handler

  379. Reset_Handler   PROC
  380.                     ; 同FUNCTION,标记一个函数的开始
  381.                 EXPORT  Reset_Handler             [WEAK]
  382.                     ; 弱引用,通知链接器,其它文件中的同名函数的优先级高于这个函数,即只有当其它文件中无
  383.                     ; Reset_Handler函数时,Reset_Handler()才指向这里
  384.                 IMPORT  SystemInit
  385.                     ; 告诉链接器到其它文件中查找SystemInit函数
  386.                 IMPORT  __main
  387.                     ; 告诉链接器到其它文件中查找__main函数
  388.                 LDR     R0, =SystemInit
  389.                     ; 执行SystemInit();
  390.                 BLX     R0
  391.                 LDR     R0, =__main
  392.                     ; 执行__main(); __main()调用main(),因而正常情况下不返回
  393.                 BX      R0
  394.                 ENDP
  395.                     ; 标记函数的结束


  396. ; Dummy Exception Handlers (infinite loops which can be modified)
  397. ; 异常函数,弱引用,需要在其它文件中自定义相同名称的函数,以进行异常的处理
  398. ;
  399. NMI_Handler     PROC
  400.                 EXPORT  NMI_Handler               [WEAK]
  401.                 B       .   ; B . 表示跳转到当前地址
  402.                 ENDP
  403. HardFault_Handler\
  404.                 PROC
  405.                 EXPORT  HardFault_Handler         [WEAK]
  406.                 B       .
  407.                 ENDP
  408. SVC_Handler     PROC
  409.                 EXPORT  SVC_Handler               [WEAK]
  410.                 B       .
  411.                 ENDP
  412. PendSV_Handler  PROC
  413.                 EXPORT  PendSV_Handler            [WEAK]
  414.                 B       .
  415.                 ENDP
  416. SysTick_Handler PROC
  417.                 EXPORT  SysTick_Handler           [WEAK]
  418.                 B       .
  419.                 ENDP

  420. Default_Handler PROC
  421.                 EXPORT  Reserved16_IRQHandler     [WEAK]
  422.                 EXPORT  Reserved17_IRQHandler     [WEAK]
  423.                 EXPORT  Reserved18_IRQHandler     [WEAK]
  424.                 EXPORT  Reserved19_IRQHandler     [WEAK]
  425.                 EXPORT  Reserved20_IRQHandler     [WEAK]
  426.                 EXPORT  FTFA_IRQHandler     [WEAK]
  427.                 EXPORT  LVD_LVW_IRQHandler     [WEAK]
  428.                 EXPORT  Reserved23_IRQHandler     [WEAK]
  429.                 EXPORT  I2C0_IRQHandler     [WEAK]
  430.                 EXPORT  I2C1_IRQHandler     [WEAK]
  431.                 EXPORT  SPI0_IRQHandler     [WEAK]
  432.                 EXPORT  Reserved27_IRQHandler     [WEAK]
  433.                 EXPORT  UART0_IRQHandler     [WEAK]
  434.                 EXPORT  Reserved29_IRQHandler     [WEAK]
  435.                 EXPORT  Reserved30_IRQHandler     [WEAK]
  436.                 EXPORT  ADC0_IRQHandler     [WEAK]
  437.                 EXPORT  CMP0_IRQHandler     [WEAK]
  438.                 EXPORT  TPM0_IRQHandler     [WEAK]
  439.                 EXPORT  TPM1_IRQHandler     [WEAK]
  440.                 EXPORT  Reserved35_IRQHandler     [WEAK]
  441.                 EXPORT  Reserved36_IRQHandler     [WEAK]
  442.                 EXPORT  Reserved37_IRQHandler     [WEAK]
  443.                 EXPORT  Reserved38_IRQHandler     [WEAK]
  444.                 EXPORT  Reserved39_IRQHandler     [WEAK]
  445.                 EXPORT  Reserved40_IRQHandler     [WEAK]
  446.                 EXPORT  Reserved41_IRQHandler     [WEAK]
  447.                 EXPORT  Reserved42_IRQHandler     [WEAK]
  448.                 EXPORT  MCG_IRQHandler     [WEAK]
  449.                 EXPORT  LPTimer_IRQHandler     [WEAK]
  450.                 EXPORT  Reserved45_IRQHandler     [WEAK]
  451.                 EXPORT  PORTA_IRQHandler     [WEAK]
  452.                 EXPORT  PORTB_IRQHandler     [WEAK]
  453.                 EXPORT  DefaultISR                      [WEAK]

  454. Reserved16_IRQHandler
  455. Reserved17_IRQHandler
  456. Reserved18_IRQHandler
  457. Reserved19_IRQHandler
  458. Reserved20_IRQHandler
  459. FTFA_IRQHandler
  460. LVD_LVW_IRQHandler
  461. Reserved23_IRQHandler
  462. I2C0_IRQHandler
  463. I2C1_IRQHandler
  464. SPI0_IRQHandler
  465. Reserved27_IRQHandler
  466. UART0_IRQHandler
  467. Reserved29_IRQHandler
  468. Reserved30_IRQHandler
  469. ADC0_IRQHandler
  470. CMP0_IRQHandler
  471. TPM0_IRQHandler
  472. TPM1_IRQHandler
  473. Reserved35_IRQHandler
  474. Reserved36_IRQHandler
  475. Reserved37_IRQHandler
  476. Reserved38_IRQHandler
  477. Reserved39_IRQHandler
  478. Reserved40_IRQHandler
  479. Reserved41_IRQHandler
  480. Reserved42_IRQHandler
  481. MCG_IRQHandler
  482. LPTimer_IRQHandler
  483. Reserved45_IRQHandler
  484. PORTA_IRQHandler
  485. PORTB_IRQHandler
  486. DefaultISR
  487.     ;上面这些函数的地址都是一样的,即标号的值都相同,但都是弱引用
  488.                 B       .

  489.                 ENDP


  490.                 ALIGN
  491.                     ; ALIGN不指定参数时,将当前地址对起到4字节,填0或NOP,或其它给定值


  492. ; User Initial Stack & Heap

  493.                 IF      :DEF:__MICROLIB
  494.                     ; 如果定义使用MICROLIB,则将下面的标号声明为全局变量,供MICROLIB使用
  495.                     ;
  496.                 EXPORT  __initial_sp
  497.                 EXPORT  __heap_base
  498.                 EXPORT  __heap_limit

  499.                 ELSE

  500.                 IMPORT  __use_two_region_memory
  501.                     ; 指定存储器模式为双区模式
  502.                     ; 单区模型:(r0, r1)是单个堆栈和堆区,r1大于r0,忽略r2和r3
  503.                     ;           堆和栈共用一块内存区域
  504.                     ; 双区模型:(r0, r2)是初始堆,(r3, r1)是初始栈
  505.                     ;           堆和栈分别指定了单独的内存区域
  506.                     ;
  507.                 EXPORT  __user_initial_stackheap
  508.                     ; 声明一个全局标号 __user_initial_stackheap作为函数使用
  509. __user_initial_stackheap
  510.                     ; C标准库调用__user_initial_stackheap()函数,获得堆栈信息
  511.                     ; 这里没有使用PROC标记
  512.                     ;
  513.                 LDR     R0, =  Heap_Mem
  514.                 LDR     R1, =(Stack_Mem + Stack_Size)
  515.                 LDR     R2, = (Heap_Mem +  Heap_Size)
  516.                 LDR     R3, = Stack_Mem
  517.                 BX      LR

  518.                 ALIGN

  519.                 ENDIF


  520.                 END
复制代码

里面我有一个没搞懂的地方,就是最后的__user_initial_stackheap为什么不加PROC标记
KL02官方Keil MDK例程文件

附图1:堆栈分配


附图2:加载镜像和执行镜像

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-8-25 16:09:21 | 显示全部楼层
启动文件很长啊  需要仔细看下
感谢

出0入0汤圆

发表于 2014-8-25 16:11:18 | 显示全部楼层
厉害,这个我还没仔细看过呢,有空了跟着楼主学习下

出0入0汤圆

发表于 2014-8-25 16:15:13 | 显示全部楼层
楼楼能否将指令集也传上来下呢

出0入0汤圆

发表于 2014-8-25 16:17:05 | 显示全部楼层
这个···强烈支持一下 ,慢慢消化

出0入0汤圆

发表于 2014-8-25 16:19:25 | 显示全部楼层
楼主的资料太好了,正是我需要的。

出0入0汤圆

发表于 2014-8-25 16:19:30 | 显示全部楼层
柯南兄的资料室一如既往的犀利啊!!

出0入0汤圆

 楼主| 发表于 2014-8-25 16:22:32 | 显示全部楼层
abszy 发表于 2014-8-25 16:09
启动文件很长啊  需要仔细看下
感谢

其实不是很长,因为我加了好多注释

出0入0汤圆

 楼主| 发表于 2014-8-25 16:23:08 | 显示全部楼层
浪里白条 发表于 2014-8-25 16:11
厉害,这个我还没仔细看过呢,有空了跟着楼主学习下

我也是边查资料边整理的,整理了一个下午,嘿嘿

出0入0汤圆

发表于 2014-8-25 16:24:25 | 显示全部楼层
sunnyqd 发表于 2014-8-25 16:23
我也是边查资料边整理的,整理了一个下午,嘿嘿

佩服,要弄懂这些语句,必须要有一定的功底才行的。

出0入0汤圆

发表于 2014-8-25 16:25:22 | 显示全部楼层
一直没搞懂启动文件是怎么工作的

出0入0汤圆

发表于 2014-8-25 16:25:52 | 显示全部楼层
好像全部是汇编

出0入0汤圆

 楼主| 发表于 2014-8-25 16:26:26 | 显示全部楼层
浪里白条 发表于 2014-8-25 16:15
楼楼能否将指令集也传上来下呢

我找找我电脑上有没有

出0入93汤圆

发表于 2014-8-25 16:26:38 | 显示全部楼层
不错,收藏,鼎鼎!

出0入0汤圆

 楼主| 发表于 2014-8-25 16:55:44 | 显示全部楼层
浪里白条 发表于 2014-8-25 16:15
楼楼能否将指令集也传上来下呢

指令集从ARM官网上下载下来了

出0入0汤圆

 楼主| 发表于 2014-8-25 16:56:06 | 显示全部楼层
cn_x 发表于 2014-8-25 16:17
这个···强烈支持一下 ,慢慢消化

多谢支持  

出0入0汤圆

发表于 2014-8-25 16:56:27 | 显示全部楼层
sunnyqd 发表于 2014-8-25 16:55
指令集从ARM官网上下载下来了

看到了的,给你顶起了,多谢楼楼了。

出0入0汤圆

 楼主| 发表于 2014-8-25 16:56:40 | 显示全部楼层
laotui 发表于 2014-8-25 16:19
楼主的资料太好了,正是我需要的。

我也是刚好想看,以前这方面都不懂,整理了一遍就都懂啦

出0入0汤圆

 楼主| 发表于 2014-8-25 16:57:11 | 显示全部楼层
sdlibin007 发表于 2014-8-25 16:19
柯南兄的资料室一如既往的犀利啊!!

还第一次被叫柯南兄。。

出0入0汤圆

 楼主| 发表于 2014-8-25 16:57:53 | 显示全部楼层
xlxbangel 发表于 2014-8-25 16:25
一直没搞懂启动文件是怎么工作的

详细的看上一遍基本都懂了

出0入0汤圆

发表于 2014-8-25 16:59:07 | 显示全部楼层
sunnyqd 发表于 2014-8-25 16:57
还第一次被叫柯南兄。。

嗯??难道改叫柯南姐??O(∩_∩)O~

出0入0汤圆

发表于 2014-8-25 16:59:17 | 显示全部楼层
sunnyqd 发表于 2014-8-25 16:56
我也是刚好想看,以前这方面都不懂,整理了一遍就都懂啦

不知道KEIL哪个版本能支持到KL、KE系列?我的芯片列表里没有这两种。

出0入0汤圆

 楼主| 发表于 2014-8-25 17:01:18 | 显示全部楼层
laotui 发表于 2014-8-25 16:59
不知道KEIL哪个版本能支持到KL、KE系列?我的芯片列表里没有这两种。

4.72我的是

出0入0汤圆

 楼主| 发表于 2014-8-25 17:01:56 | 显示全部楼层
sdlibin007 发表于 2014-8-25 16:59
嗯??难道改叫柯南姐??O(∩_∩)O~

嗯,南哥挺好的

出0入0汤圆

发表于 2014-8-25 17:02:04 | 显示全部楼层

谢谢,我用的4.7。

出0入0汤圆

发表于 2014-8-25 17:11:54 | 显示全部楼层
sunnyqd 发表于 2014-8-25 17:01
嗯,南哥挺好的

你真是女生啊??

出0入0汤圆

 楼主| 发表于 2014-8-25 17:35:36 | 显示全部楼层
sdlibin007 发表于 2014-8-25 17:11
你真是女生啊??

。。。。你见过女生写这个么。。。

出0入0汤圆

发表于 2014-8-25 18:08:54 | 显示全部楼层
强烈支持一下 ,很少有人这么弄了。

出0入0汤圆

 楼主| 发表于 2014-8-25 18:11:16 | 显示全部楼层
jianbo513 发表于 2014-8-25 18:08
强烈支持一下 ,很少有人这么弄了。

我是恰好自己学了一下,终于都搞懂了,嘿嘿

出0入0汤圆

发表于 2014-8-25 18:59:46 | 显示全部楼层
对这个不是很了解了。

出0入0汤圆

发表于 2014-8-25 19:12:20 | 显示全部楼层
sunnyqd 发表于 2014-8-25 17:35
。。。。你见过女生写这个么。。。

论坛里面不是还有女生招亲的么??

出0入0汤圆

发表于 2014-8-25 19:22:19 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-8-25 19:40:44 | 显示全部楼层
sdlibin007 发表于 2014-8-25 19:12
论坛里面不是还有女生招亲的么??

哈哈      

出0入0汤圆

 楼主| 发表于 2014-8-25 19:46:12 | 显示全部楼层
sdlibin007 发表于 2014-8-25 19:12
论坛里面不是还有女生招亲的么??

这个明显不一样好不。。

出0入0汤圆

发表于 2014-8-25 19:50:45 | 显示全部楼层
楼主要继续更下去哦

出0入0汤圆

发表于 2014-8-25 19:51:30 | 显示全部楼层
看楼楼的签名,女娃儿明显做不来这些事情。

出0入0汤圆

 楼主| 发表于 2014-8-25 19:51:31 | 显示全部楼层
湛泸骏驰 发表于 2014-8-25 19:50
楼主要继续更下去哦

码这么一篇累啊。。

出0入0汤圆

 楼主| 发表于 2014-8-25 19:52:23 | 显示全部楼层
浪里白条 发表于 2014-8-25 19:51
看楼楼的签名,女娃儿明显做不来这些事情。

那也可能是一个强悍的女汉子

出0入0汤圆

发表于 2014-8-25 19:54:06 | 显示全部楼层
谢谢分享,楼主很细心。

出0入0汤圆

发表于 2014-8-25 20:17:53 | 显示全部楼层

前段时间确实见到有个帖子招亲,O(∩_∩)O~

出0入0汤圆

发表于 2014-8-25 20:27:00 | 显示全部楼层
注释的那叫相当详细啊

出0入0汤圆

 楼主| 发表于 2014-8-25 20:34:46 | 显示全部楼层
chenguanghua 发表于 2014-8-25 20:27
注释的那叫相当详细啊

加完这一遍注释之后,我是全部了解啦,嘿嘿,本来也是一知半解

出0入0汤圆

发表于 2014-8-25 22:14:53 | 显示全部楼层
有空学习了,谢谢

出0入0汤圆

发表于 2014-8-25 23:11:00 | 显示全部楼层
跟着楼主好好学习。

出0入0汤圆

发表于 2014-8-25 23:13:27 | 显示全部楼层
__user_initial_stackheap楼主可以看下ARM官方的doc,直接进主页的doc下面搜索关键字看一下

一般在高版本中已经不需要重写他了,内部有各种实现方式,能够自动检测
可以通过分散加载描述文件或者 Image$$ZI$$Limit 的值等

http://infocenter.arm.com/help/i ... 349bc/Cihhdahf.html

出0入0汤圆

发表于 2014-8-25 23:13:45 | 显示全部楼层
2.10.5. __user_initial_stackheap()
如果您使用的是旧式源代码,则可能会看到 __user_initial_stackheap()。 这是旧函数,支持它只是为了与旧式源代码向后兼容。 其当前等效项是 __user_setup_stackheap()。
从 RVCT v2.x 及更低版本移植到 RVCT v4.0
在 RVCT 2.x 及更低版本中,__user_initial_stackheap() 的缺省实现使用符号 Image$$ZI$$Limit 的值。 如果链接器使用分散加载描述文件(使用 --scatter 命令行选项指定),则不会定义该符号;因此,如果使用的是分散加载描述文件,则必须重新实现 __user_initial_stackheap(),否则,链接步骤将会失败。
另外,您也可以使用 __user_setup_stackheap()(而不是 __user_initial_stackheap())来升级源代码。
从 RVCT v3 移植到 RVCT v4.0
在 RVCT v3.x 和更高版本中,库包含更多的 __user_initial_stackheap() 实现,并且可通过分散加载描述文件中提供的信息自动选择正确的实现。 这意味着,如果使用的是分散加载文件,则不需要重新实现该函数。 有关详细信息,请参阅使用分散加载描述文件。
语法
extern __value_in_regs struct __user_initial_stackheap __user_initial_stackheap(unsigned R0, unsigned SP, unsigned R2, unsigned SL);
用法
__user_initial_stackheap() 返回:
r0 中的堆基址
r1 中的堆栈基址,即堆栈区中的最高地址
r2 中的堆限制
r3 中的堆栈限制,即堆栈区中的最低地址。
如果重新实现了此函数,则必须满足下列条件:
最多使用堆栈中的 88 个字节
不能破坏 r12 (ip) 以外的寄存器
保持堆的 8 字节对齐方式。
对于缺省单区模型,将忽略 r2 和 r3 中的值,并且 r0 和 r1 之间的所有内存始终可供堆使用。 对于双区模型,堆限制是由 r2 设置的,堆栈限制是由 r3 设置的。
调用 __main() 时的 sp (r13) 值将作为 r1 中的自变量进行传递。 __user_initial_stackheap() 的缺省实现(使用半主机 SYS_HEAPINFO)是由 sys_stackheap.o 模块中的库提供的。
要创建从执行环境中继承 sp 并且不使用堆的 __user_initial_stackheap() 版本,请将 r0 和 r2 设置为 r3 的值并返回。 有关详细信息,请参阅__user_setup_stackheap()。
rt_misc.h 中的 __initial_stackheap 的定义是:
struct __initial_stackheap{
    unsigned heap_base, stack_base, heap_limit, stack_limit;
};
Note
stack_base 的值比堆栈使用的最高地址大 0x1,这是因为使用的是满降序堆栈。
有关该函数的重新实现示例,请参阅示例目录。
返回值
r0 到 r3 中返回的值取决于是使用单区内存模型,还是使用双区内存模型:
单区
(r0,r1) 是单个堆栈和堆区。r1 大于 r0,并忽略 r2 和 r3。
双区
(r0, r2) 是初始堆,(r3, r1) 是初始堆栈。r2 大于或等于 r0。r3 小于 r1。
使用分散加载描述文件
__user_initial_stackheap() 的缺省实现使用 Image$$ZI$$Limit 符号的值。 如果链接器使用分散加载描述文件,则不会定义此符号。 不过,C 库提供了替代实现,可通过分散加载描述文件中的信息来使用这些实现。
自动选择单区模型
在分散加载描述文件中定义一个特殊执行区,即 ARM_LIB_STACKHEAP。 该区具有 EMPTY 属性。
这导致库选择一个 __user_initial_stackheap() 实现,它将该区用作复合堆/堆栈区。 它使用 Image$$ARM_LIB_STACKHEAP$$Base 和 Image$$ARM_LIB_STACKHEAP$$ZI$$Limit 符号的值。
自动选择双区模型
在分散加载描述文件中定义两个特殊执行区:        ARM_LIB_HEAP 和 ARM_LIB_STACK。 两个区均具有 EMPTY 属性。
这导致库选择一个使用以下符号值的 __user_initial_stackheap() 实现:Image$$ARM_LIB_HEAP$$Base、Image$$ARM_LIB_HEAP$$ZI$$Limit、Image$$ARM_LIB_STACK$$Base 和 Image$$ARM_LIB_STACK$$ZI$$Limit。
Example 2.10 显示了一个用于定义 ARM_LIB_HEAP 和 ARM_LIB_STACK 的分散加载描述文件示例。 (它是在主示例目录 install_directory\RVDS\Examples 中作为 Cortex-M3.scat 提供的。)
Example 2.10. ARM_LIB_HEAP 和 ARM_LIB_STACK 分散加载描述
FLASH_LOAD 0x0000 0x00200000
{
  ;; Maximum of 256 exceptions (256*4 bytes == 0x400)
  VECTORS 0x0 0x400
  {
    ; Exception table provided by the user in exceptions.c
    exceptions.o (exceptions_area, +FIRST)
  }
  
  ;; Code is placed immediately (+0) after the previous root region
  ;; (so code region will also be a root region)
  CODE +0
  {
    * (+RO)
  }

  DATA 0x20000000 0x00100000
  {
    * (+RW, +ZI)
  }

  ;; Heap starts at 1MB and grows upwards
  ARM_LIB_HEAP 0x20100000 EMPTY 0x100000-0x8000
  {
  }
  ;; Stack space starts at the end of the 2MB of RAM
  ;; And grows downwards for 32KB
  ARM_LIB_STACK 0x20200000 EMPTY -0x8000
  {
  }
}

将从 ARM_LIB_STACKHEAP(对于单区模型)或 ARM_LIB_STACK(对于双区模型)中对 sp 进行相应的初始化。
错误消息
如果使用分散文件,而没有指定任何特殊区名称,并且没有重新实现 __user_initial_stackheap(),库将生成一条错误消息。

出0入0汤圆

发表于 2014-8-25 23:15:15 | 显示全部楼层


看图比较清晰,相关启动文件中所有不清楚的地方都可以参考官方的doc文档说明,非常详细

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-8-25 23:51:29 | 显示全部楼层
lyzhangxiang 发表于 2014-8-25 23:13
2.10.5. __user_initial_stackheap()
如果您使用的是旧式源代码,则可能会看到 __user_initial_stackheap() ...

很给力,居然还是中文的,解释的很详细呢

出0入0汤圆

 楼主| 发表于 2014-8-25 23:51:58 | 显示全部楼层
lyzhangxiang 发表于 2014-8-25 23:15
看图比较清晰,相关启动文件中所有不清楚的地方都可以参考官方的doc文档说明,非常详细 ...

找到了,多谢!很好的文档

出0入0汤圆

发表于 2014-8-26 00:11:04 | 显示全部楼层
sunnyqd 发表于 2014-8-25 23:51
很给力,居然还是中文的,解释的很详细呢

是啊  中文版本的也有
当初我也很惊讶

哎,最近在arm9上移植rtos,网上看了各种资料,参差不齐。还是官方的doc比较靠谱点。

出0入0汤圆

 楼主| 发表于 2014-8-26 09:52:58 | 显示全部楼层
lyzhangxiang 发表于 2014-8-26 00:11
是啊  中文版本的也有
当初我也很惊讶

是的,许多书籍都是抄官方文档的

出100入101汤圆

发表于 2014-8-26 10:01:58 | 显示全部楼层
“里面我有一个没搞懂的地方,就是最后的__user_initial_stackheap为什么不加PROC标记”

LZ搞懂了么?

出0入0汤圆

 楼主| 发表于 2014-8-26 10:03:55 | 显示全部楼层
fengyunyu 发表于 2014-8-26 10:01
“里面我有一个没搞懂的地方,就是最后的__user_initial_stackheap为什么不加PROC标记”

LZ搞懂了么? ...

这个没搞懂,但我反汇编查看,这就是作为一个函数调用
我记得有一个地方说,PROC加于不加,只是为了阅读方便和书写条理,但我忘了在哪里看到过了。。。所以我也不确定
PS:兄台看的好仔细

出0入0汤圆

 楼主| 发表于 2014-8-26 11:12:55 | 显示全部楼层

我加了很多注释在里面

出0入0汤圆

发表于 2014-8-26 14:18:48 | 显示全部楼层
感谢楼主位和47楼的资料 慢慢学习

出0入0汤圆

 楼主| 发表于 2014-8-29 15:49:16 | 显示全部楼层
Lengxue 发表于 2014-8-26 14:18
感谢楼主位和47楼的资料 慢慢学习

多谢支持

出0入0汤圆

发表于 2014-8-30 20:53:51 | 显示全部楼层
我给lz提个意见哈,栈和堆地址不是刚好放在你想的地方的,而是分散加载文件决定的,mdk默认把这个搞定了,去看看这个文件就知道了,在你的当前项目下

出0入0汤圆

发表于 2014-8-30 20:56:34 | 显示全部楼层
至于后面提到不用proc指定,原因是proc指导的就是函数了,会对使用的寄存器有个入栈操作,而这个很明显不需要的,类似于rtos里的任务

出0入0汤圆

发表于 2014-8-30 20:57:45 | 显示全部楼层
第一个问题在坛里搜下xinv1987的帖子,那里bluesky有详细解释

出0入0汤圆

 楼主| 发表于 2014-8-30 21:05:31 来自手机 | 显示全部楼层
myxiaonia 发表于 2014-8-30 20:53
我给lz提个意见哈,栈和堆地址不是刚好放在你想的地方的,而是分散加载文件决定的,mdk默认把这个搞定了, ...

对的,是通过分散加载文件决定的,我在里面有描述,实际map文件里的位置就是实际的位置吧?

出0入0汤圆

 楼主| 发表于 2014-8-30 21:06:07 来自手机 | 显示全部楼层
myxiaonia 发表于 2014-8-30 20:56
至于后面提到不用proc指定,原因是proc指导的就是函数了,会对使用的寄存器有个入栈操作,而这个很明显不需 ...

多谢指点,原来这样呢

出0入0汤圆

 楼主| 发表于 2014-8-30 21:06:54 来自手机 | 显示全部楼层
myxiaonia 发表于 2014-8-30 20:57
第一个问题在坛里搜下xinv1987的帖子,那里bluesky有详细解释

好的,明天电脑搜一下试试,现在在高铁上。。多谢!

出0入0汤圆

发表于 2014-8-30 22:12:32 | 显示全部楼层
好长,收藏先~

出0入0汤圆

发表于 2014-8-30 22:19:07 | 显示全部楼层
sunnyqd 发表于 2014-8-30 21:05
对的,是通过分散加载文件决定的,我在里面有描述,实际map文件里的位置就是实际的位置吧? ...

map文件就是链接后的绝对地址了,你分析的很详细啊,而我却对你的帖子看的还不够仔细
关于flash配置部分,stm32有单独的选项字节配置文件叫stm32option.s,具体在mdk哪个目录我也记不清了

出0入0汤圆

发表于 2014-8-31 05:53:29 | 显示全部楼层
启动文件有中文解析的啊

出0入0汤圆

发表于 2014-8-31 07:43:09 | 显示全部楼层
理解启动文件,更好地连接单片机的工作特点

出0入0汤圆

 楼主| 发表于 2014-8-31 07:51:56 来自手机 | 显示全部楼层
taojie 发表于 2014-8-31 05:53
启动文件有中文解析的啊

这个是分析的最详细的版本

出0入0汤圆

 楼主| 发表于 2014-8-31 07:52:11 来自手机 | 显示全部楼层
qinshiysb 发表于 2014-8-31 07:43
理解启动文件,更好地连接单片机的工作特点

是这样子的

出0入0汤圆

发表于 2014-8-31 07:54:26 来自手机 | 显示全部楼层
楼主要拿3万的那个

出0入0汤圆

发表于 2014-8-31 07:55:50 | 显示全部楼层

看这个东西,有点枯燥哈'也不好理解

出0入0汤圆

发表于 2014-8-31 07:59:08 | 显示全部楼层
lyzhangxiang 发表于 2014-8-25 23:15
看图比较清晰,相关启动文件中所有不清楚的地方都可以参考官方的doc文档说明,非常详细 ...

这是一个软件还是一份帮助文档

出0入0汤圆

 楼主| 发表于 2014-8-31 08:17:52 来自手机 | 显示全部楼层
DiaoMao_Huang 发表于 2014-8-31 07:54
楼主要拿3万的那个

那个鸭梨太大

出0入0汤圆

 楼主| 发表于 2014-8-31 08:18:56 来自手机 | 显示全部楼层
qinshiysb 发表于 2014-8-31 07:55
看这个东西,有点枯燥哈'也不好理解

很好理解的,整理了一遍我也理解比较透彻了

出0入0汤圆

发表于 2014-8-31 08:41:48 来自手机 | 显示全部楼层
不错,支持楼主。

出0入0汤圆

 楼主| 发表于 2014-8-31 09:03:06 | 显示全部楼层
chjf 发表于 2014-8-31 08:41
不错,支持楼主。

多谢支持,嘿嘿

出0入0汤圆

发表于 2014-9-1 07:52:37 | 显示全部楼层
sunnyqd 发表于 2014-8-31 08:18
很好理解的,整理了一遍我也理解比较透彻了

那倒也是,你整理的,你会细心的看

出0入0汤圆

发表于 2014-9-1 08:08:48 | 显示全部楼层
厉害,强帖要MARK,留着学习

出0入0汤圆

发表于 2014-9-1 08:41:51 | 显示全部楼层
好资料,学习了

出0入0汤圆

发表于 2014-11-25 13:17:26 | 显示全部楼层
非常好的文章,必须支持!

出0入0汤圆

发表于 2014-11-25 19:55:41 | 显示全部楼层
多谢分享  留着备用

出0入0汤圆

发表于 2014-11-25 19:56:03 | 显示全部楼层
谢谢分享,收藏。

出0入0汤圆

发表于 2014-11-25 19:56:28 | 显示全部楼层
真够用功的,先赞一下啊

出0入0汤圆

 楼主| 发表于 2014-11-26 15:18:27 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-11-25 13:17
非常好的文章,必须支持!

多谢,刚来看又有一个精华啦

出0入0汤圆

发表于 2014-11-26 16:42:08 | 显示全部楼层
写贴不易啊,这么多内容,感谢了,顶起!

出0入0汤圆

发表于 2014-11-26 17:36:37 | 显示全部楼层
要认真学习一下,先收藏看看~

出0入0汤圆

发表于 2014-11-27 08:55:58 | 显示全部楼层
这个东西 以前不在意 后来发现还是很有用的

出0入0汤圆

发表于 2014-11-27 09:20:49 | 显示全部楼层
这个很给力啊

出0入17汤圆

发表于 2014-11-27 09:27:48 | 显示全部楼层
有时候,一款芯片都用好久了才想起来研究启动文件。

出0入0汤圆

发表于 2014-11-28 19:44:21 | 显示全部楼层
这启动文件,看得眼花啊~没坚持看完

出0入0汤圆

发表于 2014-11-28 19:53:44 | 显示全部楼层
sunnyqd 发表于 2014-8-25 16:57
还第一次被叫柯南兄。。

最近见你的身影比较少了;

出0入0汤圆

发表于 2014-12-7 12:14:29 | 显示全部楼层
如果不使用堆空间。,我看到map文件中。都是先分配 .data 在分配rodata 最后.bss 段。确实在SRAM 中都是连续的。随后就是stack 的地址。 栈顶地址就是stack 的地址加上他的大小了、
1、在SRAM 中。这些是连续分布的。。
2、ke02 有两快 RAM .如果keil 中都设置了。那么首先就会从高端开始分配那么变量。
3、这样的话。SRAM_L 是不是就没有使用呢。

出0入0汤圆

发表于 2014-12-7 16:41:51 | 显示全部楼层
厉害,这个我还没仔细看过呢,有空了跟着楼主学习下

出0入0汤圆

发表于 2014-12-7 21:39:40 | 显示全部楼层
你代码的map部分有这段 代码 ;   0x20000068   0x00000100   Zero   RW           48    HEAP                startup_mkl02z4.o
1、 请问是不是在程序中使用malloc()函数
2、我在启动文件中设置了堆的大小,但是看不到map 文件的有关堆的信息、

出0入0汤圆

发表于 2014-12-9 16:30:22 | 显示全部楼层
mark。。。。。。。。。。。

出0入0汤圆

发表于 2014-12-10 21:24:14 | 显示全部楼层
注释写的很仔细 , 很好的帖子 ,好好学习一下 。

出0入0汤圆

发表于 2014-12-11 10:45:19 | 显示全部楼层
这么详细,竟然还有注释,

出0入0汤圆

发表于 2014-12-11 12:59:07 | 显示全部楼层
7inspire 发表于 2014-12-11 10:45
这么详细,竟然还有注释,

学习一下启动文件。确实对理解单片机很有帮助。。

出0入0汤圆

发表于 2015-2-8 13:49:19 | 显示全部楼层
好东西,正需要呢,谢谢!

出0入0汤圆

发表于 2015-2-9 10:08:39 | 显示全部楼层
最近要用到,收藏看看再说!谢谢楼主了.

出0入0汤圆

发表于 2015-2-9 10:59:05 | 显示全部楼层
认真学习一下,收藏看看~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 03:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表