打印

谁发现micrium在stm32上移植的ucos有bug?

[复制链接]
楼主: anzil
手机看帖
扫描二维码
随时随地手机跟帖
21
anzil|  楼主 | 2010-3-1 11:14 | 只看该作者 回帖奖励 |倒序浏览
鉴于楼上四位大侠的意见,今天升级到了2.88,仍然是设置优先级后,运行一段时间,程序进入hardfault.

使用特权

评论回复
22
anzil|  楼主 | 2010-3-1 11:19 | 只看该作者
TO 12楼:我按照上面10楼的提士做了修改,更改后的代码如下,可能和你的有些不一样,请给予指导:

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

    MRS     R0, MSP
    MSR     PSP, R0

    MRS     R0, CONTROL
    ORR     R0, R0, #0x02
    MSR     CONTROL, R0

    LDR     R1, =OSTCBCur
    MRS     R0, PSP
    SUBS    R0, R0, #0x24
    STR     R0, [R1]

    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
   
        NOP
    B       OSStartHang                                         ; Should never get here

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

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

OS_CPU_PendSVHandler
    ;CPSID   I                                                   ; Prevent interruption during context switch
    MRS     R0, PSP                                             ; PSP is process stack pointer
    ;CBZ     R0, OS_CPU_PendSVHandler_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, =OSTCBCur                                       ; 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
OS_CPU_PendSVHandler_nosave
    PUSH    {R14}                                               ; Save LR exc_return value
    LDR     R0, =OSTaskSwHook                                   ; OSTaskSwHook();
    BLX     R0
    POP     {R14}

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

    LDR     R0, =OSTCBCur                                       ; OSTCBCur  = OSTCBHighRdy;
    LDR     R1, =OSTCBHighRdy
    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
    ;CPSIE   I
    BX      LR                                                  ; Exception return will restore remaining context

    END

使用特权

评论回复
23
anzil|  楼主 | 2010-3-1 11:25 | 只看该作者
同时,发一下没有更改前的代码,如果您有和我同样的问题,并且已经解决或正在解决,欢迎您和我交流,这个问题已经快把我搞疯了!
之前出现问题的代码如下:
;********************************************************************************************************
;                                               uC/OS-II
;                                         The Real-Time Kernel
;
;                               (c) Copyright 1992-2006, Micrium, Weston, FL
;                                          All Rights Reserved
;
;                                           Generic ARM Port
;
; File      : OS_CPU_A.ASM
; Version   : V2.86(fix)
; By        : Jean J. Labrosse
;
; For       : ARMv7M Cortex-M3
; Mode      : Thumb2
; Toolchain : RealView Development Suite
;             RealView Microcontroller Development Kit (MDK)
;             ARM Developer Suite (ADS)
;             Keil uVision
;********************************************************************************************************

;********************************************************************************************************
;                                           PUBLIC FUNCTIONS
;********************************************************************************************************

    EXTERN  OSRunning                                           ; External references
    EXTERN  OSPrioCur
    EXTERN  OSPrioHighRdy
    EXTERN  OSTCBCur
    EXTERN  OSTCBHighRdy
    EXTERN  OSIntNesting
    EXTERN  OSIntExit
    EXTERN  OSTaskSwHook


    EXPORT  OS_CPU_SR_Save                                      ; Functions declared in this file
    EXPORT  OS_CPU_SR_Restore
    EXPORT  OSStartHighRdy
    EXPORT  OSCtxSw
    EXPORT  OSIntCtxSw
    EXPORT  OS_CPU_PendSVHandler

;********************************************************************************************************
;                                                EQUATES
;********************************************************************************************************

NVIC_INT_CTRL   EQU     0xE000ED04                              ; Interrupt control state register.
NVIC_SYSPRI2    EQU     0xE000ED20                              ; System priority register (priority 2).
NVIC_PENDSV_PRI EQU     0xFFFF                              ; PendSV priority value (lowest).
NVIC_PENDSVSET  EQU     0x10000000                              ; Value to trigger PendSV exception.

;********************************************************************************************************
;                                      CODE GENERATION DIRECTIVES
;********************************************************************************************************

    AREA |.text|, CODE, READONLY, ALIGN=2
    THUMB
    REQUIRE8
    PRESERVE8

;********************************************************************************************************
;                                   CRITICAL SECTION METHOD 3 FUNCTIONS
;
; Description: Disable/Enable interrupts by preserving the state of interrupts.  Generally speaking you
;              would store the state of the interrupt disable flag in the local variable 'cpu_sr' and then
;              disable interrupts.  'cpu_sr' is allocated in all of uC/OS-II's functions that need to
;              disable interrupts.  You would restore the interrupt disable state by copying back 'cpu_sr'
;              into the CPU's status register.
;
; Prototypes :     OS_CPU_SR  OS_CPU_SR_Save(void);
;                  void       OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);
;
;
; Note(s)    : 1) These functions are used in general like this:
;
;                 void Task (void *p_arg)
;                 {
;                 #if OS_CRITICAL_METHOD == 3          /* Allocate storage for CPU status register */
;                     OS_CPU_SR  cpu_sr;
;                 #endif
;
;                          :
;                          :
;                     OS_ENTER_CRITICAL();             /* cpu_sr = OS_CPU_SaveSR();                */
;                          :
;                          :
;                     OS_EXIT_CRITICAL();              /* OS_CPU_RestoreSR(cpu_sr);                */
;                          :
;                          :
;                 }
;********************************************************************************************************

OS_CPU_SR_Save
    MRS     R0, PRIMASK                                         ; Set prio int mask to mask all (except faults)
    CPSID   I
    BX      LR

OS_CPU_SR_Restore
    MSR     PRIMASK, R0
    BX      LR



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

    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




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



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



OS_CPU_PendSVHandler
    CPSID   I                                                   ; Prevent interruption during context switch
    MRS     R0, PSP                                             ; PSP is process stack pointer
    CBZ     R0, OS_CPU_PendSVHandler_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, =OSTCBCur                                       ; 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
OS_CPU_PendSVHandler_nosave
    PUSH    {R14}                                               ; Save LR exc_return value
    LDR     R0, =OSTaskSwHook                                   ; OSTaskSwHook();
    BLX     R0
    POP     {R14}

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

    LDR     R0, =OSTCBCur                                       ; OSTCBCur  = OSTCBHighRdy;
    LDR     R1, =OSTCBHighRdy
    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
    CPSIE   I
    BX      LR                                                  ; Exception return will restore remaining context

    END

22楼的代码就是我在此基础改的,改完之后,程序运行后直接进入hardfaulthandler。
这段代码的问题是,设置优先级之后,程序运行一段时间进入hardfaulthandler;如果不设置优先级,运行没有问题!

使用特权

评论回复
24
ShakaLeo| | 2010-3-1 13:13 | 只看该作者
在更改中断优先级的时候要确保PendSV中断的抢占优先级是最低的,也就是说PendSV不能抢占任何中断。
否则就可能hardfault。

使用特权

评论回复
25
电子乌托邦| | 2010-3-1 13:31 | 只看该作者
lz,几天没上,今天刚看见,文件已发送!
希望对你有帮助!

使用特权

评论回复
26
anzil|  楼主 | 2010-3-1 16:09 | 只看该作者
To:电子乌托邦
问题已经解决,按照十楼电子乌托邦的修改之后,程序实际是在另外一个地方跑飞了,当时脑袋比较热,就认为是更改的代码本身有问题。今天调试后发现,程序在下面的代码处跑飞:
/*
*********************************************************************************************************
*                                     uC/OS-View TASK SWITCH HOOK
*
* Description: This function MUST be called by uC/OS-II's Task Switch Hook function: OSTaskSwHook().
*********************************************************************************************************
*/

void  OSView_TaskSwHook (void)
{
    INT32U  cycles;


    cycles                         = OSView_TimeGetCycles();    /* This task is done                           */
    OSTCBCur->OSTCBCyclesTot      += cycles - OSTCBCur->OSTCBCyclesStart;/*跑飞处*/
    OSTCBHighRdy->OSTCBCyclesStart = cycles;                    /* Save absolute #cycles at task activation    */
}

因为在按照十楼的修改之前并没有在这里出现问题,所以想当然是更改部分的问题了,实在是汗颜的很!
虽然现在还没有找到这段代码为什么出问题,但是我通设置掉程序中的OS_VIEW_MODULE=DISABLED,
已经可以正常运行了。
在这里实在是感谢电子乌托邦,还有四位**让我更新为2.88的大侠,谢谢!!!!

使用特权

评论回复
27
sinadz| | 2010-3-1 20:35 | 只看该作者
楼主可以先升级版本试下,应该是这个问题

使用特权

评论回复
28
cwei85| | 2010-3-10 17:25 | 只看该作者
同样遇到这个问题,解决中

使用特权

评论回复
29
jqkbridge| | 2010-3-12 17:10 | 只看该作者
赶快升级吧!

使用特权

评论回复
30
dfsa| | 2010-3-12 20:38 | 只看该作者
也问题,也应该是移植时软件出现的问题

使用特权

评论回复
31
anzil|  楼主 | 2010-5-25 09:56 | 只看该作者
我是楼主,这个问题到现在其实还是没有一个很好地解决办法。后来我没有继续研究出现问题的原因,现在发现在应用中会出现一些莫名奇妙的问题,可能还是双堆栈应用上面的问题。有没有人在stm32f103VE上移植过比较稳定的版本?能否共享一下,感激万分!
shenmon@126.com

使用特权

评论回复
32
xiepengchenghn| | 2010-5-30 22:12 | 只看该作者
20# tsx1983
我想问一下,我用的UCOS2.86的版本,在STM32F107下,用ST固件库2.0版本,可以使用,跑马灯可以正常工作,但是把ST的固件库升级为3.2.0版本后,就不正常了,进入了
OSStartHang   
    B       OSStartHang  
死循环中,不知道这是何故呢?难道真的是要升级到2.88吗?

使用特权

评论回复
33
xiepengchenghn| | 2010-5-30 22:12 | 只看该作者
19# 司徒老鹰

我想问一下,我用的UCOS2.86的版本,在STM32F107下,用ST固件库2.0版本,可以使用,跑马灯可以正常工作,但是把ST的固件库升级为3.2.0版本后,就不正常了,进入了
OSStartHang   
    B       OSStartHang  
死循环中,不知道这是何故呢?难道真的是要升级到2.88吗?

使用特权

评论回复
34
xiepengchenghn| | 2010-5-30 22:13 | 只看该作者
16# zjianq

我想问一下,我用的UCOS2.86的版本,在STM32F107下,用ST固件库2.0版本,可以使用,跑马灯可以正常工作,但是把ST的固件库升级为3.2.0版本后,就不正常了,进入了
OSStartHang   
    B       OSStartHang  
死循环中,不知道这是何故呢?难道真的是要升级到2.88吗?

使用特权

评论回复
35
lordor| | 2010-7-8 15:55 | 只看该作者
这个问题确实难搞,好像跟UCOS版本无关,试过2.52及2.90的,同样的问题

使用特权

评论回复
36
coreduo| | 2011-6-20 19:31 | 只看该作者
2.86确实发现问题。
害惨我了。

使用特权

评论回复
37
i55| | 2011-6-20 21:10 | 只看该作者
1)hardfault问题不是ucos的问题,一般是数组越界了等原因。
2)ucos2.86的bug我也遇到过,现象是高优先级的就绪任务无法进入,这个问题在2.88和2.90的手册里面都提到过,就是OSSched()和OSIntExit()两个函数的隐患,用2.88的这两个函数替代即可。
3)之所以还用2.86而不是升级,是因为IAR对2.86支持极好,运行时的各种资源都可以实时监测,任务栈是否溢出也看得很清楚。相比来说,MDK简直就是垃圾中的战斗机。

使用特权

评论回复
38
mxh0506| | 2011-6-20 22:51 | 只看该作者
mark.

使用特权

评论回复
39
yaoyyie2003| | 2011-7-8 11:04 | 只看该作者
不知

使用特权

评论回复
40
wu0232| | 2011-7-8 13:53 | 只看该作者
mark~~~

使用特权

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

本版积分规则