修改点:

1. 所有vrs[7]都要改成vrs[11],

2. unwind_frame()

/* We are done if current frame pc is equal to the virtual pc, prevent infinite loop */
    if(pc == ucb.vrs[15]) {
        return 0;
    }

如果C代码函数有递归调用,可能不会push pc,所以pop时pc是没有改变的,递归虽然调用的是同一个函数,但不能只认为只有一次调用,

(这里同时也是3.)

3. unwind_frame()

  /* Set the virtual pc to the virtual lr if this is the first unwind */if(ucb.vrs[15] == 0) {ucb.vrs[15] = ucb.vrs[14];}

init初始化时,

/* Initialize the virtual register set */if(frame) {ucb->vrs[11] = frame->fp;ucb->vrs[13] = frame->sp;ucb->vrs[14] = frame->lr;ucb->vrs[15] = frame->pc;}这里当时没注意,原出处是ucb->vrs[15] = 0;

但同样的是递归时不更新PC同样是会提前结束。

修改为每次都设置pc = lr

代码做应用时发现的问题,做修改后,暂时OK了

## Total Size      = 0x0000a158 = 41304 Bytes
## Start Addr      = 0x40000000
## Starting application at 0x40000000 ...
GIC version: 2
********************************
 FuKe OS [Dec 12 2020 17:42:35]
 ------------------------------
OS MEM: (0x4000F000) 0x4000F000 - 0x42000000, size 0x01FF1000
        (DDR 0x40000000 - 0x42000000, 0x02000000)
 IDLE Task Id 0
=== APP run err 1

RootFs: VFS, UID 1
/
|--- dev/(mount DevFS, UID 2)
        |---    |---
EXCEPT: Data Abort
----- Unwind BackTrace -----
R0: 0x6559244E, R1: 0x44388BF9, R2: 0x3FEAD06D, R3: 0x31727D4E, R4: 0x00000006
R5: 0x4000A0D0, R6: 0x168A05AD, R7: 0x13E199CE  R8: 0x00000001, R9: 0xDEADBEEF
R10: 0x00000001, R11: 0x4000F8A4 R12: 0x4000F665
SP: 0x4000F880, LR: 0x00000005, PC: 0x40002420, CPSR: 0x60000013
0x400023D4(print_node) @0x40002420

R0: 0x6559244E, R1: 0x44388BF9, R2: 0x3FEAD06D, R3: 0x31727D4E, R4: 0x4000F920
R5: 0x4000F8D0, R6: 0x4000F8D4, R7: 0x4000A028  R8: 0x00000000, R9: 0xDEADBEEF
R10: 0x00000001, R11: 0x4000F8CC R12: 0x4000F665
SP: 0x4000F8A8, LR: 0x4000249C, PC: 0x4000249C, CPSR: 0x60000013
0x400023D4(print_node) @0x4000249C

R0: 0x6559244E, R1: 0x44388BF9, R2: 0x3FEAD06D, R3: 0x31727D4E, R4: 0x00000000
R5: 0x4000DA40, R6: 0xDEADBEEF, R7: 0xDEADBEEF  R8: 0xDEADBEEF, R9: 0xDEADBEEF
R10: 0xDEADBEEF, R11: 0x4000F8EC R12: 0x4000F665
SP: 0x4000F8D0, LR: 0x400026D0, PC: 0x400026D0, CPSR: 0x60000013
0x40002658(test_fs_tree) @0x400026D0

R0: 0x6559244E, R1: 0x44388BF9, R2: 0x3FEAD06D, R3: 0x31727D4E, R4: 0x4000A008
R5: 0xDEADBEEF, R6: 0xDEADBEEF, R7: 0xDEADBEEF  R8: 0xDEADBEEF, R9: 0xDEADBEEF
R10: 0xDEADBEEF, R11: 0x4000F904 R12: 0x4000F665
SP: 0x4000F8F0, LR: 0x40002278, PC: 0x40002278, CPSR: 0x60000013
0x40002208(osIdleTask) @0x40002278

----- Unwind BackTrace End -----
@ FK_ExceptHandle() L652: ERROR TO HANG !!!

ARM_UNWIND_BACKTRACE (2)相关推荐

  1. ARM_UNWIND_BACKTRACE

    代码仓: https://codechina.csdn.net/fu851523125/arm_unwind_backtrace.git 参考文章:arm上backtrace的分析与实现原理_流风回雪 ...

最新文章

  1. 杀死本地80端口被占用的进程,还你一片宁静乐土
  2. 【MATLAB】数据分析之求函数的极限(limit)
  3. react学习笔记(二)编写第一个react组件
  4. 《Spring Cloud Netflix官方文档》1.服务发现:Eureka客户端
  5. P2467 [SDOI2010]地精部落
  6. Linux程序之触摸,linux 触摸屏驱动编写
  7. python urllib3 request 无返回结果_python urllib request urlopen请求网页返回bytes类型
  8. oracle的一些操作
  9. 程序员测试死循环给老板发了10000条短信……
  10. web怎么在圆圈里画半html,在WEB里绘制爱心
  11. 判断操作系统多久没有任何操作.e
  12. Android应用开发学习笔记之事件处理
  13. mergesort unrecursive 归并排序的非递归实现
  14. (十六)企业部分之lvs
  15. 基于数字证书的UKEY安全登录
  16. 3DMAX渲染了很久还是黑的或有部分黑​屏?
  17. 【操作指导】安捷伦数据采集器开机自检/通讯接口设置说明
  18. 计算机组成原理—第4章数值的机器运算
  19. 吉林大学软件学院黄庆道《最优化算法》对偶单纯形使用大M法条件
  20. vs中开发web项目IIS Express支持局域网连接

热门文章

  1. Ubuntu安装和配置ssh教程
  2. 预见2022 | 客户体验的3大最新趋势
  3. unity用射线实现瞬移(连接VR设备)
  4. IP网络防水号角扬声器 IP网络有源高音号角铝质防水号角喇叭网络广播终端
  5. 关于选择女生的实战篮球鞋以及gs简配情况
  6. 【Java学习路线之JavaWeb】Spring Cloud教程(非常详细)
  7. 【计算机网络】网络基础(一)
  8. HTML编写渐变色动画登录页面全攻略
  9. PPP用户认证和IP地址分配
  10. html网页设计思路,极简主义网页设计思路与原则