搜索
bottom↓
回复: 9

stm32F4discovery移植uC/OSIIv2.8

[复制链接]

出0入0汤圆

发表于 2013-9-29 16:36:31 | 显示全部楼层 |阅读模式
stm32F4discovery移植uC/OSIIv2.8,v2.8有BUG所以附上v2.9的源代码和解决方法。不要开FPU,否则容易进硬件中断。解决方法(转):
os_cpu_a.asm里:
  OSPendSV
    CPSID   I                                                   ; Prevent interruption during context switch
    MRS     R0, PSP                                             ; PSP is process stack pointer
    CBZ     R0, OSPendSV_nosave                                 ; Skip register save the first time


    SUB     R0, R0, #0x20                                       ; Save remaining regs r4-11 on process stack
    STM     R0, {R4-R11}
    SUB     R0, R0, #0X40
    VSTM    R0, {D8-D15}

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

s

wi

tched out

                                                                ; At this point, entire context of process has been saved
OSPendSV_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;

    VLDM    R0,  {D8-D15}
    ADD     R0,  R0, #0X40
    LDM     R0,  {R4-R11}
    ADD     R0,  R0, #0X20

    BIC.W   LR, LR, #0x10                                       ; Set exception return uses floating-point state

    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

os_cpu_c.c

OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
    OS_STK *stk;
    unsigned int i;


    (void)opt;                                   /* 'opt' is not used, prevent warning                 */
    stk       = ptos;                            /* Load stack pointer                                 */

    *(stk) = (INT32U)0xCCUL;
    *(--stk) = (INT32U)0xDDUL;

    for(i = 16u; i != 0; i--)
    {
      *(--stk) = (INT32U)0xAAAAAAAAUL;
    }
  /* Registers stacked as if auto-saved on exception    */
    *(--stk)  = (INT32U)0x01000000uL;            /* xPSR                                               */
    *(--stk)  = (INT32U)task;                    /* Entry Point PC                                     */
    *(--stk)  = (INT32U)0xFFFFFFFEL;             /* R14 (LR)  (init value will  */
                                                 /* cause fault if ever used)   */
    *(--stk)  = (INT32U)0x12121212uL;            /* R12                                                */
    *(--stk)  = (INT32U)0x03030303uL;            /* R3                                                 */
    *(--stk)  = (INT32U)0x02020202uL;            /* R2                                                 */
    *(--stk)  = (INT32U)0x01010101uL;            /* R1                                                 */
    *(--stk)  = (INT32U)p_arg;                   /* R0 : argument                                      */

  /* Remaining registers saved on process stack         */
    *(--stk)  = (INT32U)0x11111111uL;            /* R11 */
    *(--stk)  = (INT32U)0x10101010uL;            /* R10 */
    *(--stk)  = (INT32U)0x09090909uL;            /* R9  */
    *(--stk)  = (INT32U)0x08080808uL;            /* R8  */
    *(--stk)  = (INT32U)0x07070707uL;            /* R7  */
    *(--stk)  = (INT32U)0x06060606uL;            /* R6  */
    *(--stk)  = (INT32U)0x05050505uL;            /* R5  */
    *(--stk)  = (INT32U)0x04040404uL;            /* R4  */

    for (i = 16u; i != 0; i--)          /* Initialize general-purpose Floating point registers  */
    {
      *--stk = (INT32U)0xBBBBBBBBuL;      /* S16-S31                        */
    }

    return (stk);
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入13汤圆

发表于 2013-9-29 21:05:42 | 显示全部楼层
十一放假正好有时间试试咯。。。。。

出0入0汤圆

发表于 2013-9-29 22:25:44 | 显示全部楼层
Mark
正需要

出0入0汤圆

发表于 2013-9-29 22:55:15 | 显示全部楼层
不能用fpu那么f4不就浪费么

出0入0汤圆

发表于 2013-10-1 00:45:12 | 显示全部楼层
fpu运算放到一个线程

出0入0汤圆

发表于 2013-10-2 18:30:51 | 显示全部楼层
好东西 正想学stm32 嵌入式

出0入0汤圆

发表于 2013-10-8 22:15:29 | 显示全部楼层
貌似已经有f4带fpu的ucosii模版了,最重要的是,ucos3出很久了。。

出0入0汤圆

 楼主| 发表于 2013-10-24 19:25:27 | 显示全部楼层
~just_yy 发表于 2013-9-29 22:55
不能用fpu那么f4不就浪费么

恩 按照上面说的改就可以用fpu了

出0入0汤圆

 楼主| 发表于 2013-10-24 19:27:33 | 显示全部楼层
tyou 发表于 2013-10-1 00:45
fpu运算放到一个线程

UC/OS没有线程,也不是严格意义上的进程,那叫任务。

出0入0汤圆

 楼主| 发表于 2013-10-24 19:29:10 | 显示全部楼层
windrarara 发表于 2013-10-8 22:15
貌似已经有f4带fpu的ucosii模版了,最重要的是,ucos3出很久了。。

恩,是的呢,不过就学习而言uCOSII已经够用了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 08:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表