打印
[uCOS/RTOS]

UCOS 在任务切换中PSP出现-4字节的问题

[复制链接]
1497|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ucos, ps, os, AC
本帖最后由 qq924698880 于 2017-7-10 16:50 编辑

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



相关帖子

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

使用特权

评论回复
板凳
qq924698880|  楼主 | 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的数据,怎么解?

使用特权

评论回复
地板
feelhyq| | 2017-7-10 18:23 | 只看该作者
qq924698880 发表于 2017-7-10 18:19
触发异常的地方是OSCtxSw
    LDR     R0, =NVIC_INT_CTRL                              
    LDR      ...

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

使用特权

评论回复
5
qq924698880|  楼主 | 2017-7-10 18:28 | 只看该作者
feelhyq 发表于 2017-7-10 18:23
还有一点,需要看看反汇编,看看在进入异常之前反汇编有没有对通用寄存器进行压栈操作。 ...

没有多余的压栈操作

3.png (20.16 KB )

3.png

使用特权

评论回复
6
qq924698880|  楼主 | 2017-7-10 18:30 | 只看该作者
有没有可能是PendSV_Handler的问题呢?我看网上有些地方写着要修改中断向量表的,

使用特权

评论回复
7
feelhyq| | 2017-7-10 18:59 | 只看该作者
qq924698880 发表于 2017-7-10 18:30
有没有可能是PendSV_Handler的问题呢?我看网上有些地方写着要修改中断向量表的, ...

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

使用特权

评论回复
8
qq924698880|  楼主 | 2017-7-10 19:10 | 只看该作者
feelhyq 发表于 2017-7-10 18:59
应该不会吧,毕竟UCOS这么多人用都跑的没问题,就你的出问题了

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

使用特权

评论回复
9
feelhyq| | 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一直用的是特权模式,没有开启线程模式

使用特权

评论回复
10
feelhyq| | 2017-7-10 19:16 | 只看该作者
qq924698880 发表于 2017-7-10 18:19
触发异常的地方是OSCtxSw
    LDR     R0, =NVIC_INT_CTRL                              
    LDR     R ...

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

使用特权

评论回复
11
feelhyq| | 2017-7-10 19:19 | 只看该作者
qq924698880 发表于 2017-7-10 19:10
我是重头写的,所以可能有些东西没注意到。只是用了他的asm文件而已

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

使用特权

评论回复
12
qq924698880|  楼主 | 2017-7-10 19:41 | 只看该作者
feelhyq 发表于 2017-7-10 19:19
不要重复造轮子啦,操作系统这个东西,谁都会用成熟的,不然出了问题怎么搞?当然自己想写个就另外算啦 ...

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

使用特权

评论回复
13
feelhyq| | 2017-7-10 21:48 | 只看该作者
qq924698880 发表于 2017-7-10 19:41
有没有时间啊?帮忙看看,QQ924698880

明天帮你看看

使用特权

评论回复
14
feelhyq| | 2017-7-15 16:06 | 只看该作者
本帖最后由 feelhyq 于 2017-7-15 16:11 编辑
qq924698880 发表于 2017-7-10 19:41
有没有时间啊?帮忙看看,QQ924698880


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

1

粉丝