硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4363|回复: 4
收起左侧

[μCOS-III] 官方uCOS-III例程中FPU程序部分求解。

[复制链接]

17

主题

132

回帖

183

积分

初级会员

积分
183
发表于 2015-11-18 16:48:07 | 显示全部楼层 |阅读模式
下载官方例程Micrium_STM3240G-EVAL_OS3,版本号V3.04.05,在os_cpu_c.c中
CPU_STK  *OSTaskStkInit (OS_TASK_PTR    p_task,
                         void          *p_arg,
                         CPU_STK       *p_stk_base,
                         CPU_STK       *p_stk_limit,
                         CPU_STK_SIZE   stk_size,
                         OS_OPT         opt)
{
    CPU_STK    *p_stk;


    (void)opt;                                                  /* Prevent compiler warning                               */

    p_stk = &p_stk_base[stk_size];                              /* Load stack pointer                                     */
                                                                /* Align the stack to 8-bytes.                            */
    p_stk = (CPU_STK *)((CPU_STK)(p_stk) & 0xFFFFFFF8);
                                                                /* Registers stacked as if auto-saved on exception        */
    *--p_stk = (CPU_STK)0x01000000u;                            /* xPSR                                                   */
    *--p_stk = (CPU_STK)p_task;                                 /* Entry Point                                            */
    *--p_stk = (CPU_STK)OS_TaskReturn;                          /* R14 (LR)                                               */
    *--p_stk = (CPU_STK)0x12121212u;                            /* R12                                                    */
    *--p_stk = (CPU_STK)0x03030303u;                            /* R3                                                     */
    *--p_stk = (CPU_STK)0x02020202u;                            /* R2                                                     */
    *--p_stk = (CPU_STK)p_stk_limit;                            /* R1                                                     */
    *--p_stk = (CPU_STK)p_arg;                                  /* R0 : argument                                          */
                                                                /* Remaining registers saved on process stack             */
    *--p_stk = (CPU_STK)0x11111111u;                            /* R11                                                    */
    *--p_stk = (CPU_STK)0x10101010u;                            /* R10                                                    */
    *--p_stk = (CPU_STK)0x09090909u;                            /* R9                                                     */
    *--p_stk = (CPU_STK)0x08080808u;                            /* R8                                                     */
    *--p_stk = (CPU_STK)0x07070707u;                            /* R7                                                     */
    *--p_stk = (CPU_STK)0x06060606u;                            /* R6                                                     */
    *--p_stk = (CPU_STK)0x05050505u;                            /* R5                                                     */
    *--p_stk = (CPU_STK)0x04040404u;                            /* R4                                                     */

#if (OS_CPU_ARM_FP_EN == DEF_ENABLED)
    if ((opt & OS_OPT_TASK_SAVE_FP) != (OS_OPT)0) {
        *--p_stk = (CPU_STK)0x02000000u;                        /* FPSCR                                                  */
                                                                /* Initialize S0-S31 floating point registers             */
        *--p_stk = (CPU_STK)0x41F80000u;                        /* S31                                                    */
        *--p_stk = (CPU_STK)0x41F00000u;                        /* S30                                                    */
        *--p_stk = (CPU_STK)0x41E80000u;                        /* S29                                                    */
        *--p_stk = (CPU_STK)0x41E00000u;                        /* S28                                                    */ 后略过

中描红段判断使用FPU与否,跟踪OS_CPU_ARM_FP_EN到os_cpu.h中,如下:
#ifndef  __TARGET_FPU_SOFTVFP
#define  OS_CPU_ARM_FP_EN                              DEF_ENABLED
#else
#define  OS_CPU_ARM_FP_EN                              DEF_DISABLED
#endif

__TARGET_FPU_SOFTVFP找遍整个工程没发现定义,是否在C/C++ 标签define中添加?

__TARGET_FPU_SOFTVFP这句的意思是什么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2015-11-18 16:57:34 | 显示全部楼层
__TARGET_FPU_SOFTVFP是软件实现FPU,对于M4内核带硬件浮点的不需要定义这个。

使用uCOS的这种浮点寄存器处理方式时,那个任务进行了浮点运算,那个任务创建的时候一定要加上OS_OPT_TASK_SAVE_FP选项。
回复

使用道具 举报

17

主题

132

回帖

183

积分

初级会员

积分
183
 楼主| 发表于 2015-11-18 18:18:57 | 显示全部楼层
从程序中看__TARGET_FPU_SOFTVFP这句不定义的话OSTaskStkInit 函数中不对浮点寄存器进行入践处理啊。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2015-11-18 18:22:06 | 显示全部楼层
注意条件编译是#ifndef

#ifndef  __TARGET_FPU_SOFTVFP
#define  OS_CPU_ARM_FP_EN                              DEF_ENABLED
#else
#define  OS_CPU_ARM_FP_EN                              DEF_DISABLED
#endif
回复

使用道具 举报

17

主题

132

回帖

183

积分

初级会员

积分
183
 楼主| 发表于 2015-11-18 19:52:18 | 显示全部楼层
自己粗心了,#ifndef是"if not defined"的简写。谢谢。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 12:41 , Processed in 0.156373 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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