初级会员
- 积分
- 141
- 金钱
- 141
- 注册时间
- 2019-5-21
- 在线时间
- 45 小时
|
1金钱
在学习中断一节,复位中断书写出现两个问题,无法跳到Main函数。请求各位帮忙解决。如下代码:
问题1:在清除bss段那段代码上出现了以下错误(该段被我屏蔽掉了)
- xt@Mamba:~/linux/imx6ull/programe/board_driver/int/int1$ make
- arm-linux-gnueabihf-gcc -Wall -nostdlib -c -I imx6ull -I project -I bsp/clk -I bsp/delay -I bsp/led -I bsp/beep -I bsp/key project/start.s -o obj/start.o
- project/start.s: Assembler messages:
- project/start.s:57: 错误: internal_relocation (type: OFFSET_IMM) not fixed up
- project/start.s:58: 错误: internal_relocation (type: OFFSET_IMM) not fixed up
- Makefile:68: recipe for target 'obj/start.o' failed
- make: *** [obj/start.o] Error 1
复制代码
问题2:用户模式的sp设置那段需要注释掉,否则无反应。注释掉后能正常跳到main函数。
- .global _start
- _start:
- /* 设置中断向量表 */
- ldr pc,=Reset_Handler
- ldr pc,=Undefined_Handler
- ldr pc,=SVC_Handler
- ldr pc,=PreAbort_Handler
- ldr pc,=DataAbort_Handler
- ldr pc,=NotUsed_Handler
- ldr pc,=IRQ_Handler
- ldr pc,=FIQ_Handler
- Reset_Handler:
- cpsid i // 关闭总IRQ中断
- MRC p15, 0, R0, c1, c0, 0 // 读取 SCTLR寄存器R0
- BIC R0,R0,#(1<<12) // 清零12位 关闭ICACHE
- BIC R0,R0,#(1<<11) // 关闭分支预测:预测跳转如if等,如果预测对,将代码先提取到缓存,增快速度
- BIC R0,R0,#(1<<2) // 关闭Data Cache
- BIC R0,R0,#(1<<1) // 关闭对齐
- BIC R0,R0,#(1<<0) // 关闭MMU
- MCR p15, 0, R0, c1, c0, 0 // 将R0设置到SCTLR寄存器
- /*
- 2. 设置 中断向量地址
-
- */
- ldr r0,=0X87800000
- DSB // DSB指令,数据同步指令,在前面寄存器数据操作完成后才能往下执行
- ISB // ISB指令,指令同步指令,在前面寄存器指令操作完成后才能往下执行
- MCR p15, 0, R0, c12, c0, 0 // 将R0设置到VBAR寄存器,用于设置中断向量表
- DSB // DSB指令,数据同步指令,在前面寄存器数据操作完成后才能往下执行
- ISB // ISB指令,指令同步指令,在前面寄存器指令操作完成后才能往下执行
- /*
- 3.清除BSS段
- */
- ldr r0, bss_start
- ldr r1, bss_end
- mov r2,#0
- bss_loop:
- stmia r0,{r2} // 将r2的值存储到r0指的地址上,并且r0+=4
- cmp r0,r1 // 比较r1和r0 r0-r1
- ble bss_loop // 如果r0 <= r1,跳转继续清0
-
- /*
- 4. 设置处理器的每个工作模式 下的堆栈SP指针指向空间
-
- */
- // 4.1. 用户模式 80200000~80000000 2MB
- // 可能中断不能设置用户模式
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x10 // 10000用户模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x81500000 // 用户模式下sp指向80200000
- // 4.2. 快速模式 80400000~80200000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x11 // 10001FIQ模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x80400000 // fiq模式下sp指向80400000
- // 4.3. IRQ模式 80600000~80400000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x12 // 10010IRQ模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x80600000 // IRQ模式下sp指向80600000
- // 4.4. SVC模式 80800000~80600000 2MB
- mrs r0,cpsr // 读取cpsr到r0 [url=home.php?mod=space&uid=95564]@[/url] // 4.5. mon模式 80a00000~80800000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x16 // 10110mon模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x80a00000 // mon模式下sp指向0x80a00000
- // 4.6. abort模式 80c00000~80a00000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x17 // 10111abort模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x80c00000 // abort模式下sp指向0x80c00000
- // 4.7. hsy模式 80e00000~80c00000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x1a // 10111abort模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x80e00000 // hsy模式下sp指向0x80e00000
- // 4.8. und模式 81000000~80e00000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x1b // 10111abort模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x81100000 // und模式下sp指向81000000
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x13 // 10011svc模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x80800000 // svc模式下sp指向80800000
- // 4.5. mon模式 80a00000~80800000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x16 // 10110mon模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x80a00000 // mon模式下sp指向0x80a00000
- // 4.6. abort模式 80c00000~80a00000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x17 // 10111abort模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x80c00000 // abort模式下sp指向0x80c00000
- // 4.7. hsy模式 80e00000~80c00000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x1a // 10111abort模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x80e00000 // hsy模式下sp指向0x80e00000
- // 4.8. und模式 81000000~80e00000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x1b // 10111abort模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x81100000 // und模式下sp指向81000000
- // 4.9. sys模式 81300000~81100000 2MB
- mrs r0,cpsr // 读取cpsr到r0
- bic r0,r0,#0x1f // 清空r0的bit0~bit4
- orr r0,r0,#0x1f // 10111abort模式
- msr cpsr,r0 // 设置r0到cpsr
- ldr sp,=0x81300000 // und模式下sp指向81300000
-
- cpsie i // 使能总IRQ中断
- // 5.跳转到main
- b main
- Undefined_Handler:
- ldr r0,=Undefined_Handler
- bx r0
- SVC_Handler:
- ldr r0,=SVC_Handler
- bx r0
- PreAbort_Handler:
- ldr r0,=Reset_Handler
- bx r0
- DataAbort_Handler:
- ldr r0,=DataAbort_Handler
- bx r0
- NotUsed_Handler:
- ldr r0,=NotUsed_Handler
- bx r0
- IRQ_Handler:
- ldr r0,=IRQ_Handler
- bx r0
- FIQ_Handler:
- ldr r0,=FIQ_Handler
- bx r0
复制代码
|
|