查看: 547|回复: 13
收起左侧

[uCOS/RTOS] UCOS 在任务切换中PSP出现-4字节的问题

[复制链接]
     

1

主题

6

帖子

18

积分

初级技术员

 楼主| 发表于 2017-7-10 16:25 | 显示全部楼层 |返回版面||阅读模式
本帖最后由 qq924698880 于 2017-7-10 16:50 编辑

在任务切换中PSP出现-4字节的问题,即堆栈多压了一层,导致出栈的时候不能重新进入之前的任务,求解,如图在task0中的时候PSP=84,而进入任务切换的时候,PSP=60,导致保存任务R4-R11出错以及SP的地址也出错



本帖子中包含更多资源

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

x
     

4

主题

708

帖子

2159

积分

初级工程师

发表于 2017-7-10 17:36 | 显示全部楼层 |返回版面
从问题分析来看,楼主应该对cortex-M的硬件出入栈非常熟悉了,但是忽略了一个问题,即进行BL指令(调用RAYS_TimeDelay函数)跳转的时候,首先会将下一条指令的地址存放在lr寄存器中,但是lr里面又有数据,那么需要将lr进行压栈,即-4的个字节。然后再触发异常,依次压栈 xpsr,pc, lr, r12,r0~r3。可以调试进入RAYS_TimeDelay里面即将触发异常的代码打个断点,看看PSP的值。
     

1

主题

6

帖子

18

积分

初级技术员

 楼主| 发表于 2017-7-10 18:19 | 显示全部楼层 |返回版面
本帖最后由 qq924698880 于 2017-7-10 18:23 编辑
feelhyq 发表于 2017-7-10 17:36
从问题分析来看,楼主应该对cortex-M的硬件出入栈非常熟悉了,但是忽略了一个问题,即进行BL指令(调用RAYS_ ...

触发异常的地方是OSCtxSw
    LDR     R0, =NVIC_INT_CTRL                              
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]
    BX      LR
在LR之前,PSP都是0X84,返回之后触发PendSV_Handler异常,这个时候压栈的结果直接就是PSP=0X60,对比之下,发现多压的数据是LR的数据,怎么解?
     

4

主题

708

帖子

2159

积分

初级工程师

发表于 2017-7-10 18:23 | 显示全部楼层 |返回版面
qq924698880 发表于 2017-7-10 18:19
触发异常的地方是OSCtxSw
    LDR     R0, =NVIC_INT_CTRL                              
    LDR      ...

还有一点,需要看看反汇编,看看在进入异常之前反汇编有没有对通用寄存器进行压栈操作。
     

1

主题

6

帖子

18

积分

初级技术员

 楼主| 发表于 2017-7-10 18:28 | 显示全部楼层 |返回版面
feelhyq 发表于 2017-7-10 18:23
还有一点,需要看看反汇编,看看在进入异常之前反汇编有没有对通用寄存器进行压栈操作。 ...

没有多余的压栈操作

本帖子中包含更多资源

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

x
     

1

主题

6

帖子

18

积分

初级技术员

 楼主| 发表于 2017-7-10 18:30 | 显示全部楼层 |返回版面
有没有可能是PendSV_Handler的问题呢?我看网上有些地方写着要修改中断向量表的,
     

4

主题

708

帖子

2159

积分

初级工程师

发表于 2017-7-10 18:59 | 显示全部楼层 |返回版面
qq924698880 发表于 2017-7-10 18:30
有没有可能是PendSV_Handler的问题呢?我看网上有些地方写着要修改中断向量表的, ...

应该不会吧,毕竟UCOS这么多人用都跑的没问题,就你的出问题了
     

1

主题

6

帖子

18

积分

初级技术员

 楼主| 发表于 2017-7-10 19:10 | 显示全部楼层 |返回版面
feelhyq 发表于 2017-7-10 18:59
应该不会吧,毕竟UCOS这么多人用都跑的没问题,就你的出问题了

我是重头写的,所以可能有些东西没注意到。只是用了他的asm文件而已
     

4

主题

708

帖子

2159

积分

初级工程师

发表于 2017-7-10 19:12 | 显示全部楼层 |返回版面
qq924698880 发表于 2017-7-10 18:19
触发异常的地方是OSCtxSw
    LDR     R0, =NVIC_INT_CTRL                              
    LDR     R ...

问你一下 你知道PSP和MSP的区别么,什么时候用PSP,什么时候用MSP?据我了解UCOS好像没有用PSP啊,UCOS一直用的是特权模式,没有开启线程模式
     

4

主题

708

帖子

2159

积分

初级工程师

发表于 2017-7-10 19:16 | 显示全部楼层 |返回版面
qq924698880 发表于 2017-7-10 18:19
触发异常的地方是OSCtxSw
    LDR     R0, =NVIC_INT_CTRL                              
    LDR     R ...

还有一点 C调用C竟然没有消耗栈,这也太不科学了吧,至少也要保存lr寄存器的值啊,不然怎么返回呢?你在捋一捋思路。
     

4

主题

708

帖子

2159

积分

初级工程师

发表于 2017-7-10 19:19 | 显示全部楼层 |返回版面
qq924698880 发表于 2017-7-10 19:10
我是重头写的,所以可能有些东西没注意到。只是用了他的asm文件而已

不要重复造轮子啦,操作系统这个东西,谁都会用成熟的,不然出了问题怎么搞?当然自己想写个就另外算啦
     

1

主题

6

帖子

18

积分

初级技术员

 楼主| 发表于 2017-7-10 19:41 | 显示全部楼层 |返回版面
feelhyq 发表于 2017-7-10 19:19
不要重复造轮子啦,操作系统这个东西,谁都会用成熟的,不然出了问题怎么搞?当然自己想写个就另外算啦 ...

有没有时间啊?帮忙看看,QQ924698880
     

4

主题

708

帖子

2159

积分

初级工程师

发表于 2017-7-10 21:48 | 显示全部楼层 |返回版面
qq924698880 发表于 2017-7-10 19:41
有没有时间啊?帮忙看看,QQ924698880

明天帮你看看
     

4

主题

708

帖子

2159

积分

初级工程师

发表于 2017-7-15 16:06 | 显示全部楼层 |返回版面
本帖最后由 feelhyq 于 2017-7-15 16:11 编辑
qq924698880 发表于 2017-7-10 19:41
有没有时间啊?帮忙看看,QQ924698880


您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

关闭

热门推荐上一条 /3 下一条

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