14931|17

78

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

进入不了PendSV_Handler [复制链接]

我使用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             
此帖出自stm32/stm8论坛

最新回复

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

回复
举报

91

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

向量表

                                 μCOS-II的程序,如果没加以改动,这个中断的名字应该是OS_CPU_PendSVHandler,是不是在中断向量表里映射的不是这个名字?
此帖出自stm32/stm8论坛
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

中断向量表是PendSV_Handler

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

回复

58

帖子

0

TA的资源

一粒金砂(初级)

4
 

试试这个,已经调通了的

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
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 

还是进入不了啊

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()卡住了。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 

有问题

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

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 

__main不是我的代码

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

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 

NVIC

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

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 

是从片内flash启动的

                                 是从片内flash 0x08000000启动的。这有什么问题吗?
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

10
 

仿真吧

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

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 

断点

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 

都是调试惹的祸

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

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 

单步

                                 我当时做的时候单步也会这样,我以为你是说全速运行有这个问题。
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

14
 

谢谢lonely8122

                                 都是我没有表达清楚。
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

15
 
                                 我做全速运行也存在这个问题啊
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

16
 
                                 有没人能指点下啊
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

17
 
我也碰到过这个问题。

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

解决办法:把ucos-II中的OS_CPU_PendSVHandler改成PendSV_Handler。这样就能进入中断处理函数了。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

禁止访问

18
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表