硬汉嵌入式论坛

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

[μCOS-III] UCOSIII内核变量TCB咋只有声明?

[复制链接]

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2019-5-12 19:02:23 | 显示全部楼层 |阅读模式
读UCOSIII源码时发现一个现象,就是跟内核有关的TCB只在os.h中有声明(如下),但找不到定义的地方,这是怎么回事儿?
OS_EXT            OS_TCB                    OSStatTaskTCB;
OS_EXT            OS_TCB                    OSIdleTaskTCB;

于是随便在一个地方定义了一下OS_TCB  OSStatTaskTCB;
编译后提示跟os_var.o这个文件重定义,但是在os_var.c文件中就这么几行代码(如下),也没有定义啊,难道UCOSIII把这个变量隐藏了不成?
/*
*********************************************************************************************************
*                                               VARIABLES
*
* File    : os_var.c
* Version : V3.07.03
*********************************************************************************************************
*/

#define   OS_GLOBALS

#define  MICRIUM_SOURCE
#include "os.h"

#ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
const  CPU_CHAR  *os_var__c = "$Id: $";
#endif


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-5-13 02:30:28 | 显示全部楼层
typedef  struct  os_tcb              OS_TCB;

  1. /*
  2. ------------------------------------------------------------------------------------------------------------------------
  3. *                                                  TASK CONTROL BLOCK
  4. ------------------------------------------------------------------------------------------------------------------------
  5. */

  6. struct os_tcb {
  7.     CPU_STK             *StkPtr;                            /* Pointer to current top of stack                        */

  8.     void                *ExtPtr;                            /* Pointer to user definable data for TCB extension       */

  9.     CPU_STK             *StkLimitPtr;                       /* Pointer used to set stack 'watermark' limit            */

  10. #if (OS_CFG_DBG_EN == DEF_ENABLED)
  11.     CPU_CHAR            *NamePtr;                           /* Pointer to task name                                   */
  12. #endif

  13.     OS_TCB              *NextPtr;                           /* Pointer to next     TCB in the TCB list                */
  14.     OS_TCB              *PrevPtr;                           /* Pointer to previous TCB in the TCB list                */

  15. #if (OS_CFG_TICK_EN == DEF_ENABLED)
  16.     OS_TCB              *TickNextPtr;
  17.     OS_TCB              *TickPrevPtr;
  18. #endif

  19. #if ((OS_CFG_DBG_EN == DEF_ENABLED) || (OS_CFG_STAT_TASK_STK_CHK_EN == DEF_ENABLED) || (OS_CFG_TASK_STK_REDZONE_EN == DEF_ENABLED))
  20.     CPU_STK             *StkBasePtr;                        /* Pointer to base address of stack                       */
  21. #endif

  22. #if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
  23.     OS_TLS               TLS_Tbl[OS_CFG_TLS_TBL_SIZE];
  24. #endif

  25. #if (OS_CFG_DBG_EN == DEF_ENABLED)
  26.     OS_TASK_PTR          TaskEntryAddr;                     /* Pointer to task entry point address                    */
  27.     void                *TaskEntryArg;                      /* Argument passed to task when it was created            */
  28. #endif

  29.     OS_TCB              *PendNextPtr;                       /* Pointer to next     TCB in pend list.                  */
  30.     OS_TCB              *PendPrevPtr;                       /* Pointer to previous TCB in pend list.                  */
  31.     OS_PEND_OBJ         *PendObjPtr;                        /* Pointer to object pended on.                           */
  32.     OS_STATE             PendOn;                            /* Indicates what task is pending on                      */
  33.     OS_STATUS            PendStatus;                        /* Pend status                                            */

  34.     OS_STATE             TaskState;                         /* See OS_TASK_STATE_xxx                                  */
  35.     OS_PRIO              Prio;                              /* Task priority (0 == highest)                           */
  36. #if (OS_CFG_MUTEX_EN == DEF_ENABLED)
  37.     OS_PRIO              BasePrio;                          /* Base priority (Not inherited)                          */
  38.     OS_MUTEX            *MutexGrpHeadPtr;                   /* Owned mutex group head pointer                         */
  39. #endif

  40. #if ((OS_CFG_DBG_EN == DEF_ENABLED) || (OS_CFG_STAT_TASK_STK_CHK_EN == DEF_ENABLED) || (OS_CFG_TASK_STK_REDZONE_EN == DEF_ENABLED))
  41.     CPU_STK_SIZE         StkSize;                           /* Size of task stack (in number of stack elements)       */
  42. #endif
  43.     OS_OPT               Opt;                               /* Task options as passed by OSTaskCreate()               */

  44. #if (OS_CFG_TS_EN == DEF_ENABLED)
  45.     CPU_TS               TS;                                /* Timestamp                                              */
  46. #endif
  47. #if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN == DEF_ENABLED))
  48.     CPU_INT16U           SemID;                             /* Unique ID for third-party debuggers and tracers.       */
  49. #endif
  50.     OS_SEM_CTR           SemCtr;                            /* Task specific semaphore counter                        */

  51.                                                             /* DELAY / TIMEOUT                                        */
  52. #if (OS_CFG_TICK_EN == DEF_ENABLED)
  53.     OS_TICK              TickRemain;                        /* Number of ticks remaining                              */
  54.     OS_TICK              TickCtrPrev;                       /* Used by OSTimeDlyXX() in PERIODIC mode                 */
  55. #endif

  56. #if (OS_CFG_SCHED_ROUND_ROBIN_EN == DEF_ENABLED)
  57.     OS_TICK              TimeQuanta;
  58.     OS_TICK              TimeQuantaCtr;
  59. #endif

  60. #if (OS_MSG_EN == DEF_ENABLED)
  61.     void                *MsgPtr;                            /* Message received                                       */
  62.     OS_MSG_SIZE          MsgSize;
  63. #endif

  64. #if (OS_CFG_TASK_Q_EN == DEF_ENABLED)
  65.     OS_MSG_Q             MsgQ;                              /* Message queue associated with task                     */
  66. #if (OS_CFG_TASK_PROFILE_EN == DEF_ENABLED)
  67.     CPU_TS               MsgQPendTime;                      /* Time it took for signal to be received                 */
  68.     CPU_TS               MsgQPendTimeMax;                   /* Max amount of time it took for signal to be received   */
  69. #endif
  70. #endif

  71. #if (OS_CFG_TASK_REG_TBL_SIZE > 0u)
  72.     OS_REG               RegTbl[OS_CFG_TASK_REG_TBL_SIZE];  /* Task specific registers                                */
  73. #endif

  74. #if (OS_CFG_FLAG_EN == DEF_ENABLED)
  75.     OS_FLAGS             FlagsPend;                         /* Event flag(s) to wait on                               */
  76.     OS_FLAGS             FlagsRdy;                          /* Event flags that made task ready to run                */
  77.     OS_OPT               FlagsOpt;                          /* Options (See OS_OPT_FLAG_xxx)                          */
  78. #endif

  79. #if (OS_CFG_TASK_SUSPEND_EN == DEF_ENABLED)
  80.     OS_NESTING_CTR       SuspendCtr;                        /* Nesting counter for OSTaskSuspend()                    */
  81. #endif

  82. #if (OS_CFG_TASK_PROFILE_EN == DEF_ENABLED)
  83.     OS_CPU_USAGE         CPUUsage;                          /* CPU Usage of task (0.00-100.00%)                       */
  84.     OS_CPU_USAGE         CPUUsageMax;                       /* CPU Usage of task (0.00-100.00%) - Peak                */
  85.     OS_CTX_SW_CTR        CtxSwCtr;                          /* Number of time the task was switched in                */
  86.     CPU_TS               CyclesDelta;                       /* value of OS_TS_GET() - .CyclesStart                    */
  87.     CPU_TS               CyclesStart;                       /* Snapshot of cycle counter at start of task resumption  */
  88.     OS_CYCLES            CyclesTotal;                       /* Total number of # of cycles the task has been running  */
  89.     OS_CYCLES            CyclesTotalPrev;                   /* Snapshot of previous # of cycles                       */

  90.     CPU_TS               SemPendTime;                       /* Time it took for signal to be received                 */
  91.     CPU_TS               SemPendTimeMax;                    /* Max amount of time it took for signal to be received   */
  92. #endif

  93. #if (OS_CFG_STAT_TASK_STK_CHK_EN == DEF_ENABLED)
  94.     CPU_STK_SIZE         StkUsed;                           /* Number of stack elements used from the stack           */
  95.     CPU_STK_SIZE         StkFree;                           /* Number of stack elements free on   the stack           */
  96. #endif

  97. #ifdef CPU_CFG_INT_DIS_MEAS_EN
  98.     CPU_TS               IntDisTimeMax;                     /* Maximum interrupt disable time                         */
  99. #endif
  100. #if (OS_CFG_SCHED_LOCK_TIME_MEAS_EN == DEF_ENABLED)
  101.     CPU_TS               SchedLockTimeMax;                  /* Maximum scheduler lock time                            */
  102. #endif

  103. #if (OS_CFG_DBG_EN == DEF_ENABLED)
  104.     OS_TCB              *DbgPrevPtr;
  105.     OS_TCB              *DbgNextPtr;
  106.     CPU_CHAR            *DbgNamePtr;
  107. #endif
  108. #if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN == DEF_ENABLED))
  109.     CPU_INT16U           TaskID;                            /* Unique ID for third-party debuggers and tracers.       */
  110. #endif
  111. };
复制代码


回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2019-5-13 09:01:09 | 显示全部楼层
eric2013 发表于 2019-5-13 02:30
typedef  struct  os_tcb              OS_TCB;

我之前没有描述清楚,我指的是任务的CTB变量,如OSStatTaskTCB,这个找不到他们的定义。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-5-13 11:32:59 | 显示全部楼层
云琴箫龙 发表于 2019-5-13 09:01
我之前没有描述清楚,我指的是任务的CTB变量,如OSStatTaskTCB,这个找不到他们的定义。

全工程检索就找到了。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2019-5-13 14:27:56 | 显示全部楼层
eric2013 发表于 2019-5-13 11:32
全工程检索就找到了。

这么检索没问题吧!可是确实没发现啊。
我一直怀疑是在哪儿藏着没搜索出来,不然编译器怎么不报错。
11.png 12.png

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-5-13 15:18:05 | 显示全部楼层
云琴箫龙 发表于 2019-5-13 14:27
这么检索没问题吧!可是确实没发现啊。
我一直怀疑是在哪儿藏着没搜索出来,不然编译器怎么不报错。

实际上他们是用的

#ifdef   OS_GLOBALS
#define  OS_EXT
#else
#define  OS_EXT  extern
#endif

里面的 #define  OS_EXT ,也就是什么也没有定义
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2019-5-13 15:40:40 | 显示全部楼层
eric2013 发表于 2019-5-13 15:18
实际上他们是用的

#ifdef   OS_GLOBALS

明白了,之前因为OS_EXT 右键go to definition时跳转到的是#define  OS_EXT  extern,因此就没有怀疑上面的宏的打开的。不过它在头文件中定义全局变量也够奇特的啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 16:21 , Processed in 0.202790 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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