OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5067|回复: 5

学习imx6ul中断,复位中断编写出现问题,求助。

[复制链接]

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-5-21
在线时间
45 小时
发表于 2020-10-13 00:37:09 | 显示全部楼层 |阅读模式
1金钱
在学习中断一节,复位中断书写出现两个问题,无法跳到Main函数。请求各位帮忙解决。如下代码:
问题1:在清除bss段那段代码上出现了以下错误(该段被我屏蔽掉了)
  1. xt@Mamba:~/linux/imx6ull/programe/board_driver/int/int1$ make
  2. 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
  3. project/start.s: Assembler messages:
  4. project/start.s:57: 错误: internal_relocation (type: OFFSET_IMM) not fixed up
  5. project/start.s:58: 错误: internal_relocation (type: OFFSET_IMM) not fixed up
  6. Makefile:68: recipe for target 'obj/start.o' failed
  7. make: *** [obj/start.o] Error 1
复制代码



问题2:用户模式的sp设置那段需要注释掉,否则无反应。注释掉后能正常跳到main函数。
  1. .global _start


  2. _start:
  3.     /* 设置中断向量表 */
  4.     ldr pc,=Reset_Handler
  5.     ldr pc,=Undefined_Handler
  6.     ldr pc,=SVC_Handler
  7.     ldr pc,=PreAbort_Handler
  8.     ldr pc,=DataAbort_Handler
  9.     ldr pc,=NotUsed_Handler
  10.     ldr pc,=IRQ_Handler
  11.     ldr pc,=FIQ_Handler



  12. Reset_Handler:

  13.     cpsid i  // 关闭总IRQ中断

  14.     MRC p15, 0, R0, c1, c0, 0 // 读取 SCTLR寄存器R0
  15.     BIC R0,R0,#(1<<12)  // 清零12位 关闭ICACHE
  16.     BIC R0,R0,#(1<<11)  // 关闭分支预测:预测跳转如if等,如果预测对,将代码先提取到缓存,增快速度
  17.     BIC R0,R0,#(1<<2)   // 关闭Data Cache
  18.     BIC R0,R0,#(1<<1)   // 关闭对齐
  19.     BIC R0,R0,#(1<<0)   // 关闭MMU
  20.     MCR p15, 0, R0, c1, c0, 0 // 将R0设置到SCTLR寄存器

  21.     /*
  22.         2. 设置 中断向量地址
  23.       
  24.     */
  25.     ldr r0,=0X87800000
  26.     DSB  // DSB指令,数据同步指令,在前面寄存器数据操作完成后才能往下执行
  27.     ISB  // ISB指令,指令同步指令,在前面寄存器指令操作完成后才能往下执行
  28.     MCR p15, 0, R0, c12, c0, 0 // 将R0设置到VBAR寄存器,用于设置中断向量表
  29.     DSB  // DSB指令,数据同步指令,在前面寄存器数据操作完成后才能往下执行
  30.     ISB  // ISB指令,指令同步指令,在前面寄存器指令操作完成后才能往下执行

  31.     /*
  32.         3.清除BSS段
  33.          */
  34.     ldr r0, bss_start
  35.     ldr r1, bss_end
  36.     mov r2,#0
  37. bss_loop:
  38.         stmia r0,{r2}  // 将r2的值存储到r0指的地址上,并且r0+=4
  39.         cmp r0,r1      // 比较r1和r0  r0-r1
  40.         ble bss_loop   // 如果r0 <= r1,跳转继续清0
  41.    

  42.     /*
  43.         4. 设置处理器的每个工作模式 下的堆栈SP指针指向空间
  44.         
  45.      */
  46.     // 4.1. 用户模式 80200000~80000000 2MB
  47.     // 可能中断不能设置用户模式
  48.     mrs r0,cpsr      // 读取cpsr到r0
  49.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  50.     orr r0,r0,#0x10  // 10000用户模式
  51.     msr cpsr,r0      // 设置r0到cpsr
  52.     ldr sp,=0x81500000 // 用户模式下sp指向80200000

  53.     // 4.2. 快速模式 80400000~80200000 2MB
  54.     mrs r0,cpsr      // 读取cpsr到r0
  55.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  56.     orr r0,r0,#0x11  // 10001FIQ模式
  57.     msr cpsr,r0      // 设置r0到cpsr
  58.     ldr sp,=0x80400000 // fiq模式下sp指向80400000

  59.     // 4.3. IRQ模式 80600000~80400000 2MB
  60.     mrs r0,cpsr      // 读取cpsr到r0
  61.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  62.     orr r0,r0,#0x12  // 10010IRQ模式
  63.     msr cpsr,r0      // 设置r0到cpsr
  64.     ldr sp,=0x80600000 // IRQ模式下sp指向80600000

  65.     // 4.4. SVC模式 80800000~80600000 2MB
  66.     mrs r0,cpsr      // 读取cpsr到r0    [url=home.php?mod=space&uid=95564]@[/url] // 4.5. mon模式 80a00000~80800000 2MB
  67.     mrs r0,cpsr      // 读取cpsr到r0
  68.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  69.     orr r0,r0,#0x16  // 10110mon模式
  70.     msr cpsr,r0      // 设置r0到cpsr
  71.     ldr sp,=0x80a00000 // mon模式下sp指向0x80a00000

  72.     // 4.6. abort模式 80c00000~80a00000 2MB
  73.     mrs r0,cpsr      // 读取cpsr到r0
  74.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  75.     orr r0,r0,#0x17  // 10111abort模式
  76.     msr cpsr,r0      // 设置r0到cpsr
  77.     ldr sp,=0x80c00000 // abort模式下sp指向0x80c00000

  78.     // 4.7. hsy模式 80e00000~80c00000 2MB
  79.     mrs r0,cpsr      // 读取cpsr到r0
  80.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  81.     orr r0,r0,#0x1a  // 10111abort模式
  82.     msr cpsr,r0      // 设置r0到cpsr
  83.     ldr sp,=0x80e00000 // hsy模式下sp指向0x80e00000

  84.     // 4.8. und模式 81000000~80e00000 2MB
  85.     mrs r0,cpsr      // 读取cpsr到r0
  86.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  87.     orr r0,r0,#0x1b  // 10111abort模式
  88.     msr cpsr,r0      // 设置r0到cpsr
  89.     ldr sp,=0x81100000 // und模式下sp指向81000000

  90.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  91.     orr r0,r0,#0x13  // 10011svc模式
  92.     msr cpsr,r0      // 设置r0到cpsr
  93.     ldr sp,=0x80800000 // svc模式下sp指向80800000

  94.     // 4.5. mon模式 80a00000~80800000 2MB
  95.     mrs r0,cpsr      // 读取cpsr到r0
  96.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  97.     orr r0,r0,#0x16  // 10110mon模式
  98.     msr cpsr,r0      // 设置r0到cpsr
  99.     ldr sp,=0x80a00000 // mon模式下sp指向0x80a00000

  100.     // 4.6. abort模式 80c00000~80a00000 2MB
  101.     mrs r0,cpsr      // 读取cpsr到r0
  102.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  103.     orr r0,r0,#0x17  // 10111abort模式
  104.     msr cpsr,r0      // 设置r0到cpsr
  105.     ldr sp,=0x80c00000 // abort模式下sp指向0x80c00000

  106.     // 4.7. hsy模式 80e00000~80c00000 2MB
  107.     mrs r0,cpsr      // 读取cpsr到r0
  108.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  109.     orr r0,r0,#0x1a  // 10111abort模式
  110.     msr cpsr,r0      // 设置r0到cpsr
  111.     ldr sp,=0x80e00000 // hsy模式下sp指向0x80e00000

  112.     // 4.8. und模式 81000000~80e00000 2MB
  113.     mrs r0,cpsr      // 读取cpsr到r0
  114.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  115.     orr r0,r0,#0x1b  // 10111abort模式
  116.     msr cpsr,r0      // 设置r0到cpsr
  117.     ldr sp,=0x81100000 // und模式下sp指向81000000


  118.     // 4.9. sys模式 81300000~81100000 2MB
  119.     mrs r0,cpsr      // 读取cpsr到r0
  120.     bic r0,r0,#0x1f  // 清空r0的bit0~bit4
  121.     orr r0,r0,#0x1f  // 10111abort模式
  122.     msr cpsr,r0      // 设置r0到cpsr
  123.     ldr sp,=0x81300000 // und模式下sp指向81300000

  124.    
  125.     cpsie i // 使能总IRQ中断

  126.     // 5.跳转到main
  127.     b main


  128. Undefined_Handler:
  129.     ldr r0,=Undefined_Handler
  130.     bx r0

  131. SVC_Handler:
  132.     ldr r0,=SVC_Handler
  133.     bx r0

  134. PreAbort_Handler:
  135.     ldr r0,=Reset_Handler
  136.     bx r0

  137. DataAbort_Handler:
  138.     ldr r0,=DataAbort_Handler
  139.     bx r0

  140. NotUsed_Handler:
  141.     ldr r0,=NotUsed_Handler
  142.     bx r0

  143. IRQ_Handler:
  144.     ldr r0,=IRQ_Handler
  145.     bx r0

  146. FIQ_Handler:
  147.     ldr r0,=FIQ_Handler
  148.     bx r0
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-5-21
在线时间
45 小时
 楼主| 发表于 2020-10-13 10:32:45 | 显示全部楼层
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-5-21
在线时间
45 小时
 楼主| 发表于 2020-10-13 16:03:23 | 显示全部楼层
???????????????????????????????????????????
回复

使用道具 举报

0

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
442
金钱
442
注册时间
2019-5-16
在线时间
143 小时
发表于 2020-10-13 16:50:46 | 显示全部楼层
在论坛里搜索关键词bss,很多帖子都有帮助
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-5-21
在线时间
45 小时
 楼主| 发表于 2020-10-13 22:53:37 | 显示全部楼层
橙子熊 发表于 2020-10-13 16:50
在论坛里搜索关键词bss,很多帖子都有帮助

谢谢!!!!!!!
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-5-21
在线时间
45 小时
 楼主| 发表于 2020-10-13 22:55:37 | 显示全部楼层
bss的解决了。
但是为什么加了下面的设置用户模式,就跳转到main失败了,没反应?


  1.     /* 进入用户模式 */
  2.         mrs r0, cpsr
  3.         bic r0, r0, #0x1f         /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4         */
  4.         orr r0, r0, #0x10         /* r0或上0x10,表示使用用户模式                                        */
  5.         msr cpsr, r0                /* 将r0 的数据写入到cpsr_c中                                         */
  6.         ldr sp, =0x80800000        /* 设置IRQ模式下的栈首地址为0X80800000,大小为2MB */
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 18:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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