打印
[应用相关]

进入不了 PendSV_Handler

[复制链接]
9468|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feifan570|  楼主 | 2009-5-13 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用STM32F103VC的芯片跑UCOS。但是执行了如下的代码就是进入不了PendSV_Handler。用软件仿真还是可以的,但是烧到板上就不可以了。执行这段
代码的时候BASEPRI = 0,PRIMASK = 0.这应该没有关中断吧。为什么就是进入不了呢?


NVIC_INT_CTRL   EQU     0xE000ED04  ; Interrupt control state register 
NVIC_SYSPRI2    EQU     0xE000ED20  ; System priority register (2)  
NVIC_PENDSV_PRI EQU     0xFFFF0000  ; PendSV and system tick priority(Both are lowest,0xff) 
NVIC_PENDSVSET        EQU  0x10000000  ; Value to trigger PendSV exception  触发软件中断的值

OSStartHighRdy

        LDR     R4, =NVIC_SYSPRI2       ; set the PendSV exception priority 设置PendSV优先级
        LDR     R5, =NVIC_PENDSV_PRI    
        STR     R5, [R4]
        
        MOV     R4, #0                  ; set the PSP to 0 for initial context switch call 使PSP等于0
        MSR     PSP, R4

        LDR     R4, =OSRunning          ; OSRunning = TRUE
        MOV     R5, #1
        STRB    R5, [R4]

        LDR     R4, =NVIC_INT_CTRL      ; trigger the PendSV exception 触发软件中断
        LDR     R5, =NVIC_PENDSVSET
        STR     R5, [R4]

        CPSIE   I                       ; enable interrupts at processor level 使能所有优先级的中断
OSStartHang
        B       OSStartHang             
沙发
lonely8122| | 2009-5-13 22:23 | 只看该作者

向量表

μCOS-II的程序,如果没加以改动,这个中断的名字应该是OS_CPU_PendSVHandler,是不是在中断向量表里映射的不是这个名字?

使用特权

评论回复
板凳
feifan570|  楼主 | 2009-5-14 09:07 | 只看该作者

中断向量表是PendSV_Handler

如果是中断向量表有问题,它也应该有跳到默认的处理函数才对,而不应该跑到
OSStartHang
        B       OSStartHang  
这个语句。

使用特权

评论回复
地板
lonely8122| | 2009-5-14 10:10 | 只看该作者

试试这个,已经调通了的

NVIC_INT_CTRL   EQU     0xE000ED04                              ; Interrupt control state register.
NVIC_SYSPRI14   EQU     0xE000ED22                              ; System priority register (priority 14).
NVIC_PENDSV_PRI EQU           0xFF                              ; PendSV priority value (lowest).
NVIC_PENDSVSET  EQU     0x10000000                              ; Value to trigger PendSV exception.





OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14                                  ; Set the PendSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]

    MOVS    R0, #0                                              ; Set the PSP to 0 for initial context switch call
    MSR     PSP, R0

    LDR     R0, =OSRunning                                      ; OSRunning = TRUE
    MOVS    R1, #1
    STRB    R1, [R0]

    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]

    CPSIE   I                                                   ; Enable interrupts at processor level

OSStartHang
    B       OSStartHang                                         ; Should never get here

使用特权

评论回复
5
feifan570|  楼主 | 2009-5-14 10:56 | 只看该作者

还是进入不了啊

lonely8122: 你是不是在OSStartHighRdy()前面有对NVIC初始化的代码?
我现在是复位后直接调用                
LDR     R0, =__main
BX      R0
跑到main()后。
int main(void)
{
    OSInit(); 
    OSTaskCreateExt(InitTask,(void  *)0,&InitTaskStk[INIT_TASK_STK_SIZE -1],INIT_TASK_PRIV,INIT_TASK_PRIV,InitTaskStk,INIT_TASK_STK_SIZE,"Init",0);
    OSStart();
    return 0;
}
现在就是OSStart()卡住了。

使用特权

评论回复
6
lonely8122| | 2009-5-14 11:28 | 只看该作者

有问题

“我现在是复位后直接调用                
LDR     R0, =__main
BX      R0”
这估计会有问题,这样不是跳过了编译器生成的启动代码了吗

使用特权

评论回复
7
feifan570|  楼主 | 2009-5-14 12:36 | 只看该作者

__main不是我的代码

__main就是编译器生成的,它最终跑到我的main。所以并没有跳过keil 的启动程序。
附加说明:我用的编译器是Keil,调试器是Ulink2。

使用特权

评论回复
8
lonely8122| | 2009-5-14 13:11 | 只看该作者

NVIC

我是在OSStart之前初始化的NVIC,但是我试了一下在第一个任务里初始化NVIC也能够运行,我用的IAR4.42,μCOS-II v2.86版。你的程序是从0x8000000开始的吗?

使用特权

评论回复
9
feifan570|  楼主 | 2009-5-14 13:40 | 只看该作者

是从片内flash启动的

是从片内flash 0x08000000启动的。这有什么问题吗?

使用特权

评论回复
10
lonely8122| | 2009-5-14 14:49 | 只看该作者

仿真吧

用仿真器看看Interrupt control state register里那个pendSV的位是不是真的置位了,如果没关中断,又没有其它优先级高的中断,这位置1后就应该进入pendSV中断。

使用特权

评论回复
11
zgcumt| | 2009-5-14 21:39 | 只看该作者

断点

使用特权

评论回复
12
feifan570|  楼主 | 2009-5-15 11:47 | 只看该作者

都是调试惹的祸

这个问题在单步调试的时候就存在,但是如果是全速运行的话就不存在。
在KEIL 和Ulink2下我发现是这样,不知道在IAR下使用Jlink调试是否也
有这样的情况?

使用特权

评论回复
13
lonely8122| | 2009-5-15 23:16 | 只看该作者

单步

我当时做的时候单步也会这样,我以为你是说全速运行有这个问题。

使用特权

评论回复
14
feifan570|  楼主 | 2009-5-16 15:18 | 只看该作者

谢谢lonely8122

都是我没有表达清楚。

使用特权

评论回复
15
xiepengchenghn| | 2010-5-31 11:12 | 只看该作者
我做全速运行也存在这个问题啊

使用特权

评论回复
16
xiepengchenghn| | 2010-5-31 11:31 | 只看该作者
有没人能指点下啊

使用特权

评论回复
17
智多芯| | 2010-10-5 11:19 | 只看该作者
我也碰到过这个问题。

错误原因:中断向量表里映射的标号是PendSV_Handler.
而ucos-II源码中PendSV中断处理函数标号是OS_CPU_PendSVHandler。

解决办法:把ucos-II中的OS_CPU_PendSVHandler改成PendSV_Handler。这样就能进入中断处理函数了。

使用特权

评论回复
18
shxizhou| | 2010-11-16 10:57 | 只看该作者
17# 智多芯

我来回答一下这个问题:我也是这两天遇到这个问题,前一天调试所有能运行的程序,第二天一开机以后就都死机在:B       OSStartHang;这个地方。怎么搞都不行,后来在keil的例程中找了个能运行的程序运行通过后,好,这下所有先前不能运行的程序就都可以运行啦。今天也是这个问题,我上网查了一下,看有好多的朋友也遇到我一样的问题,没有一个具体的答案,能找到的几个仅有的答案我都试过了,不能解决问题。我还是按昨天的做法,找个能运行的程序运行一下,怪,真是的,所以的程序又能运行啦,我也不知是什么原因。反正能运行就好。等待高人来解释。

使用特权

评论回复
19
流浪终生| | 2011-11-30 12:40 | 只看该作者
4# lonely8122

我刚刚开始搞这个东西,有这么几个问题要问
  LDR     R0, =NVIC_SYSPRI14                                  ; Set the PendSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI
    STRB    R1, [R0]

    MOVS    R0, #0                                              ; Set the PSP to 0 for initial context switch call
    MSR     PSP, R0

为什么这里的PSP要从地址零开始呢,这个地址零代表物理地质0吗?

使用特权

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

本版积分规则

92

主题

195

帖子

1

粉丝