13988|34

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

谁发现micrium在stm32上移植的ucos有bug? [复制链接]

各位大侠,我是在micrium网站上下载了其在stm32f10x上的ucos移植程序。发现在这个程序中如果各个中断的优先级都设为0,那么任务调度都很正常,我创建了9个任务。一旦更改这些优先级,如,分别设为 2,3,那么程序运行一段时间后就会死机。有人说在OSStartHighRdy,OSPendSVCHandler,OSPendSVCHandlerNoSave,函数有bug,请问是不是真的?本人初学ucos,一点头绪都没有,还请大虾指点啊。

shenmon@126.com
此帖出自stm32/stm8论坛

最新回复

请问代码里的CONTROL是什么啊?  详情 回复 发表于 2012-2-23 20:04
点赞 关注
 

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己顶一个
个人认为,micrium应该不会留下这么大的bug吧。但是我在使用中确实碰到了这个问题,搜遍了网上认为移植成功的ucos代码,发现这几个函数的代码是一样的。在st推出的几块开发板的资料中,比较了这几个函数,也没有什么区别。
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的问题我想应该存在。
我以前在51系统上移植的操作系统,开发的时候正常,但是长期运行发现死机,当时找了好长时间。后来偶尔把优先级别都改成0,中断的优先级别是改成芯片的现有的优先级别后,系统很稳定。

我虽然没有在STM32上试过,没有改优先级。(CPU速度快,还用DMA,没有必要改用中断优先级)
你说的现象,我认为是存在。
顺便说,不改优先级,我认为系统是很稳定的
此帖出自stm32/stm8论坛
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 中断是可以设置优先级的。设置优先级会导致高优先中断抢占,所以要把主堆栈(MSP,不是ucos的任务堆栈)设置大点,以防止抢占时会产生堆栈溢出。
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
你说的是这个文件吧:
LR_IROM1 0x08000000 0x0007ffff                                                                         ;; Load region
{
    ER_IROM1 0x08000000        0x0807ffff
    {
        vectors.o (VECT, +First)
        init.o (INIT)
        * (+RO)
    }

    RW_IRAM1 0x20000000  0x0000FC00        ;;4C00
    {
        * (+RW,+ZI)
    }                                                           ;; The following declarations select the "two region model" ;
                                                                ;; A default __user_initial_stackheap() will be used        ;
    ARM_LIB_HEAP  0x2000F700 EMPTY  0x00000200   {}
    ARM_LIB_STACK 0x2000FB00 EMPTY -0x00000200   {}
}
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 这个可以有!
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(中级)

7
 
                                 请升级到2.88版本
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 中断优先级都设置成0,不存在中断嵌套,需要的主堆栈也就会小一些。而更改了中断优先级,尤其是设置了抢占优先级,就可能有中断嵌套的情况发生,需要的主堆栈就会大一些,如果主堆栈的空间不够,就会死机了。
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
不知道楼主用的哪个ARM核,如果是ARM7TDMI,那么该内核是不支持硬件中断嵌套的,所以也不会出现楼上所说的情况,如果是CORTEX-M3内核,那么2.86确实有bug,请参考https://bbs.eeworld.com.cn/icview-95426-1-1.html
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 


引用其他一个帖子的原文:

官方(micrium)的例子(stm32+ucosii2.86)不太好,不能中断嵌套,所有中断必须在同一优先级别,官方例子都是0,主要是在双堆栈指针使用上有问题
用下面两段代码替换就没问题了,也不存在原来有人说使用不同优化级别编译会死机的问题

OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI2                                   ; 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
   
    MRS     R0, MSP
    MSR     PSP, R0
   
    MRS     R0, CONTROL
    ORR     R0, R0, #0x02
    MSR     CONTROL, R0
   
    LDR     R1, __OS_TCBCur
    MRS     R0, PSP
    SUBS    R0, R0, #0x24
    STR     R0, [R1]
   
   
    LDR     R0, __OS_Running                                    ; 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
    NOP
    B       OSStartHang          ;Should never get here






OSPendSV
    MRS     R0, PSP                                             ; PSP is process stack pointer
    ;CBZ     R0, OSPendSV_nosave                                 ; skip register save the first time

    SUBS    R0, R0, #0x20                                       ; save remaining regs r4-11 on process stack
    STM     R0, {R4-R11}

    LDR     R1, __OS_TCBCur                                     ; OSTCBCur->OSTCBStkPtr = SP;
    LDR     R1, [R1]
    STR     R0, [R1]                                            ; R0 is SP of process being switched out

                                                                ; at this point, entire context of process has been saved
OSPendSV_nosave
    PUSH    {R14}                                               ; need to save LR exc_return value
    LDR     R0, __OS_TaskSwHook                                 ; OSTaskSwHook();
    BLX     R0
    POP     {R14}

    LDR     R0, __OS_PrioCur                                    ; OSPrioCur = OSPrioHighRdy;
    LDR     R1, __OS_PrioHighRdy
    LDRB    R2, [R1]
    STRB    R2, [R0]

    LDR     R0, __OS_TCBCur                                     ; OSTCBCur  = OSTCBHighRdy;
    LDR     R1, __OS_TCBHighRdy
    LDR     R2, [R1]
    STR     R2, [R0]

    LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr;
    LDM     R0, {R4-R11}                                        ; restore r4-11 from new process stack
    ADDS    R0, R0, #0x20
    MSR     PSP, R0                                             ; load PSP with new process SP
    ;ORR     LR, LR, #0x04                                       ; ensure exception return uses process stack
    BX      LR

工作环境STM32-Cortex核,MDK编译。不知是否存在这个问题?
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
To 电子乌托邦:
我是楼主,这个帖子我搜到了,也进行了尝试,更改之后,系统直接跳转的异常HardFaultHandler.具体原因还没有查明。感谢大家的帮忙,期待更详细的解答
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
To  zengfan155:
我用的是cortex-m3内核+2.86,看了你所说的bug,感觉和我现在的问题没有太大关系。
To yugen:
对于MSP,我已经尝试过改的非常大,仍然是运行一段时间后就死机。
感谢大家的帮助,这个问题现在还没有解决
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
                                 估计可能是某个任务的堆栈(PSP)不够用了。
此帖出自stm32/stm8论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 LZ,听了你12楼说的,我试了一下,并没有你说的会发生硬件错误的情况。
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

15
 
                                 已经有2个人说了让你升级到v2.88,楼主你咋就听不进去呢
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

16
 
                                 确定和版本有关系吗
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

17
 
To 电子乌托邦:
你好!谢谢你的回复。能不能把你的移植的文件发给我一下?谢谢
我的邮箱是
shenmon@126.com
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

18
 
已经有2个人说了让你升级到v2.88,楼主你咋就听不进去呢
我当第三个
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

19
 
                                 我当四个。这个问题当初把我害惨了
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

20
 
                                 鉴于楼上四位大侠的意见,今天升级到了2.88,仍然是设置优先级后,运行一段时间,程序进入hardfault.
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表