找回密码
 注册
关于网站域名变更的通知
查看: 370|回复: 1
打印 上一主题 下一主题

Cortex-M/R 内核启动流程之初始化阶段

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-9-10 18:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
0 p2 R* ~4 x. p1 h9 t
初始化阶段: ~% l. Y# k1 D1 m/ |: d" C4 B+ m' X
  在系统启动期间,进入 main() 函数之前执行初始化序列。 初始化序列处理目标硬件和 C/C++ 运行环境所需的初始化。初始化是在应用程序(CPU 复位)启动但是进入用户的 main() 函数之前来执行的。初始化阶段可以简单地分为:
$ G1 r% j/ B" J+ H) r: _; g& \  X+ y; p; Z1 V
硬件初始化,通常至少初始化堆栈指针。
! A$ h9 |! }; M4 r$ o4 [  Z  硬件初始化通常在系统启动代码 cstartup.s 中执行,如果需要,还可以通过用户提供的额外的低级接口(__low_level_init)来执行用户自己的代码。 它可能包括重置/启动其余硬件,设置 CPU 等,以准备软件 C/C++ 系统初始化。0 `0 e1 A; k' L' c: g
# l+ K3 A6 v. ]* P; M
  • 当 CPU 复位时,程序将从系统启动代码中的程序入口标签__iar_program_start处开始执行。
  • 堆栈指针初始化为 CSTACK 块的末尾
  • For ARM7/9/11, Cortex-A, and Cortex-R devices, exception stack pointers are initialized to the end of each corresponding section. 对于 Arm7/9/11、Cortex-A 和Cortex-R 器件,异常堆栈指针初始化为每个相应部分的末尾
  • The function __low_level_init is called if you defined it, giving the application a chance to peRForm early initializations.如果用户定义了函数__low_level_init,则为应用程序提供执行早期初始化的机会。( `+ u& X' f0 h$ H
. W+ d) ]) q+ B' k2 x9 }
C/C++ 软件系统初始化5 H7 H/ o8 n; }3 T
  通常,此步操作确保在调用 main 函数之前,每个全局(静态链接)的 C/C++ 符号都会收到其正确的初始化值。0 T2 P' z3 ?, `+ w

# E  D! e, f" L5 e2 [: z- L
  • Static and global variables are initialized. That is, zero-initialized variables are cleared and the values of other initialized variables are copied from ROM to RAM memory. This step is skipped if __low_level_init returns zero. 静态和全局变量初始化。 也就是说,清零初始化为零的变量,并将其他初始化变量的值从 ROM 复制到 RAM 存储器。 如果 __low_level_init 返回零,则跳过此步骤。
      R" ]7 z/ A( F( X/ d
  In Standard C, all static variables—variables that are allocated at a fixed memory address—must be initialized by the runtime system to a known value at application startup. This value is either an explicit value assigned to the variable, or if no value is given, it is cleared to zero. In the compiler, there are exceptions to this rule, for example variables declared __no_init, which are not initialized at all.在标准 C 中,所有静态变量 - 在固定内存地址分配的变量 - 必须由运行时系统初始化为应用程序启动时的已知值。 此值是分配给变量的显式值,或者如果没有给出值,则将其清零。 在编译器中,此规则有例外,例如声明为 __no_init 的变量,它们根本没有初始化。
7 V3 V4 x7 M+ n% V+ @5 \The compiler generates a specific type of section for each type of variable initialization:编译器为每种类型的变量初始化生成特定类型的节:
" S6 ?/ r1 @$ W3 L( d) q
1 d2 `' w8 C/ m7 @3 L0 n
  • Static C++ objects are constructed 构造静态 C++ 对象
  • The main function is called, which starts the application. 调用主函数,启动应用程序。
    3 ~5 G9 Y0 H4 t( N% T
7 m. Z0 K% b- l, {9 f
应用程序初始化
  @. i, F' X# u5 A1 Y觉就是用户自己的程序部分。这完全取决于用户的应用程序。 它可以包括设置 RTOS 内核并启动 RTOS 驱动的应用程序的初始任务。 对于裸机应用程序,它可以包括设置各种中断,初始化通信,初始化设备等。
+ a. U+ t, o" k+ t2 E, X, a% B* y
0 p1 X7 G; F9 }% k- j  对于基于 ROM/flash 的系统,常量和函数已经放在 ROM 中。 放置在 RAM 中的所有符号必须在调用 main 函数之前初始化。 链接器已将可用RAM划分为变量,堆栈,堆等的不同区域。' I) y& \& y" w7 a7 O7 k0 X' x
  以下序列说明简要概述了初始化的不同阶段。  V2 y( x  N9 Q8 i$ Q; N* ?1 M" E

, ]3 C. ]5 T1 k0 P3 N1 [; j6 f
  • 当应用程序启动时,系统启动代码首先执行硬件初始化,例如初始化栈顶指针以指向预定义堆栈区域的末尾:& C$ g5 S: D; e0 u% W9 r
  • 然后,清除应该零初始化的存储器,换句话说,用零填充:2 ~- a) d% X# z7 @* Q8 E6 K

    + \+ h% g, B1 r% x, h7 f: P# P4 i通常,这些数据指的是那些初始化为零的数据; 例如,变量声明为int i = 0;
  • 对于已经初始化的数据,例如,声明的数据int i = 6;,初始化器从ROM复制到RAM:
    8 V% S& Z$ m5 f  Y+ M3 F% g- O# H
  • 最终,main()函数被调用:6 w% K7 k8 |- M- H

    $ T) ~  h6 j6 H% Z( p

8 B0 }  M$ R5 \% M% F
6 _6 x, ~3 t8 c4 o) w

该用户从未签到

2#
发表于 2020-9-10 18:40 | 只看该作者
Cortex-M/R 内核启动流程之初始化阶段
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 22:32 , Processed in 0.171875 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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