14.3.2 reset标号

本文详细解析了ARM处理器启动时的reset标号代码执行过程,包括设置CPU模式为超级保护模式、关闭看门狗定时器、配置时钟分频等关键步骤,并介绍了根据不同配置跳转至开发板初始化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

14.3.2  reset标号

reset标号的代码在处理器启动的时候最先被执行。

 

106 /*

107 * the actual reset code

108 */

109

110 reset:

111   /*

112    * set the cpu to SVC32 mode

113    */

114   mrs r0,cpsr                   // 保存CPSR寄存器的值到r0寄存器

115   bic r0,r0,#0x1f               // 清除中断

116   orr r0,r0,#0xd3

117   msr cpsr,r0                   // 设置CPSR为超级保护模式

118

119 /* turn off the watchdog */     // 关闭看门狗

120 #if defined(CONFIG_S3C2400)

121 # define pWTCON   0x15300000 // 看门狗寄存器地址

122 # define INTMSK   0x14400008  /* Interupt-Controller base addresses */
                                    //
中断控制器基址

123 # define CLKDIVN  0x14800014  /* clock divisor register */

124 #elif defined(CONFIG_S3C2410)

125 # define pWTCON   0x53000000

126 # define INTMSK   0x4A000008  /* Interupt-Controller base addresses */

127 # define INTSUBMSK  0x4A00001C

128 # define CLKDIVN  0x4C000014  /* clock divisor register */

129 #endif

130

131 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)

132   ldr     r0, =pWTCON            // 取出当前看门狗控制寄存器的地址到r0

133   mov     r1, #0x0               // 设置r1寄存器值为0

134   str     r1, [r0]               // 写入看门狗控制寄存器

135

136   /*

137    * mask all IRQs by setting all bits in the INTMR - default

138    */

139   mov r1, #0xffffffff           // 设置r1

140   ldr r0, =INTMSK               // 取出中断屏蔽寄存器地址到r0

141   str r1, [r0]                  // r1的值写入中断屏蔽寄存器

142 # if defined(CONFIG_S3C2410)

143   ldr r1, =0x3ff

144   ldr r0, =INTSUBMSK

145   str r1, [r0]

146 # endif

147

148   /* FCLK:HCLK:PCLK = 1:2:4 */

149   /* default FCLK is 120 MHz ! */

150   ldr r0, =CLKDIVN              // 取出时钟寄存器地址到r0

151   mov r1, #3                // 设置r1的值

152   str r1, [r0]                  // 写入时钟配置

153 #endif  /* CONFIG_S3C2400 || CONFIG_S3C2410 */

154

155   /*

156    * we do sys-critical inits only at reboot,

157    * not when booting from ram!

158    */

159 #ifndef CONFIG_SKIP_LOWLEVEL_INIT

160   bl  cpu_init_crit              // 跳转到开发板相关初始化代码

161 #endif

 

程序第114行取出CPSR寄存器的值,CPSR寄存器保存当前系统状态,第115行使用比特清除命令清空了CPSR寄存器的中断控制位,表示清除中断。程序116行设置了CPSR寄存器的处理器模式位为超级保护模式,然后在第117行写入 CPSR的值强制切换处理器为超级保护模式。

程序第120129行定义看门狗控制器有关的变量,第131153行根据平台设置看门狗定时器。在程序第150行设置时钟分频寄存器的值。

程序第160行需要根据CONFIG_SKIP_LOWLEVEL_INIT宏的值是否跳转到cpu_init_crit标号执行。请注意这里使用bl指令,在执行完cpu_init_crit标号的代码后会      返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值