NuttX 任务管理

(嵌入式 实时操作系统 rtos nuttx 7.18 stm32 源代码分析)
NuttX 任务管理
转载请注明出处: http://blog.csdn.net/zhumaill/article/details/70175079

1 任务控制块

/* struct tcb_s ******************************************************************/
/* 这是任务控制块(TCB)的共用部分。
 * TCB是NuttX任务控制逻辑的核心,  每个任务或线程都由TCB表示。
 * 包括这些共用的定义
 */

FAR struct wdog_s;                       /* Forward reference                   */

struct tcb_s
{
  /* 用于支持列表管理的字段 *************************************/

  FAR struct tcb_s *flink;               /* 双向链表                 */
  FAR struct tcb_s *blink;

  /* 任务组 *****************************************************************/

#ifdef HAVE_TASK_GROUP
  FAR struct task_group_s *group;        /* Pointer to shared task group data   */
#endif

  /* 任务管理字段 *****************************************************/

  pid_t    pid;                          /* 线程ID        */
  start_t  start;                        /* 线程起始函数              */
  entry_t  entry;                        /* 线程入口点         */
  uint8_t  sched_priority;               /* 线程的当前优先级      */
  uint8_t  init_priority;                /* 线程的初始优先级     */

#ifdef CONFIG_PRIORITY_INHERITANCE
#if CONFIG_SEM_NNESTPRIO > 0
  uint8_t  npend_reprio;                 /* 嵌套重设优先级的数量,优先级继承时会重设优先级  */
  uint8_t  pend_reprios[CONFIG_SEM_NNESTPRIO];
#endif
  uint8_t  base_priority;                /* 只允许继承一次时的重设优先级    */
#endif

  uint8_t  task_state;                   /* 线程的当前状态         */
#ifdef CONFIG_SMP
  uint8_t  cpu;                          /* 正在运行或已分配的CPU索引    */
  cpu_set_t affinity;                    /* 允许的CPU位组           */
#endif
  uint16_t flags;                        /* 各种常规状态标志          */    //bit4-5存储调度策略
  int16_t  lockcount;                    /* 0=可抢占(未锁定)          */
#ifdef CONFIG_SMP
  int16_t  irqcount;                     /* 0=中断使能                */
#endif

#if CONFIG_RR_INTERVAL > 0 || defined(CONFIG_SCHED_SPORADIC)
  int32_t  timeslice;                    /* 轮转调度的时间片或偶发调度剩余的时间间隔    */
#endif
#ifdef CONFIG_SCHED_SPORADIC
  FAR struct sporadic_s *sporadic;       /* 偶发调度的参数      */
#endif

  FAR struct wdog_s *waitdog;            /* 使用此定时器的所有计时等待     */

  /* 与栈有关的字段 *******************************************************/

  size_t    adj_stack_size;              /* 因硬件、处理器等而调整栈后的栈大小         */
                                         /* (仅为了调试目的)           */
  FAR void *stack_alloc_ptr;             /* 栈指针          */
                                         /* 需要释放           */
  FAR void *adj_stack_ptr;               /* 因硬件而调整 stack_alloc_ptr     */
                                         /* 初始栈指针值     */

  /* 外部模块支持 ****************************************************/

#ifdef CONFIG_PIC
  FAR struct dspace_s *dspace;           /* 为 .bss 和 .data 分配区空间  */
#endif

  /* POSIX 信号量控制字段 *********************************************/

  sem_t *waitsem;                        /* 等待中的信号量ID             */

  /* POSIX 信号控制字段 ************************************************/

#ifndef CONFIG_DISABLE_SIGNALS
  sigset_t   sigprocmask;                /* 被阻塞的信号            */
  sigset_t   sigwaitmask;                /* 等待挂起的信号        */
  sq_queue_t sigpendactionq;             /* 挂起信号列表     */
  sq_queue_t sigpostedq;                 /* 发送信号列表              */
  siginfo_t  sigunbinfo;                 /* 任务解锁时的信号信息     */
#endif

  /* POSIX 有名消息队列字段 *******************************************/

#ifndef CONFIG_DISABLE_MQUEUE
  FAR struct mqueue_inode_s *msgwaitq;   /* 等待中的消息队列     */
#endif

  /* 与库关联的字段 *****************************************************/

  int pterrno;                           /* Current per-thread errno            */

  /* 状态保存区域 ***********************************************************/
  /* 这些字段的表格和内容是平台特定的。               */

  struct xcptcontext xcp;                /* 中断寄存器保存区域        */

#if CONFIG_TASK_NAME_SIZE > 0
  char name[CONFIG_TASK_NAME_SIZE+1];    /* 任务名(以NUL结尾)     */
#endif
};

/* struct task_tcb_s *************************************************************/
/*这是任务和内核线程使用的任务控制块(TCB)结构体。有2个TCB表:
 * 一个用于pthreads,一个用于任务。2个都包含一个共用的TCB字段
 * (必须出现在结构体的顶部),加上任务和线程特有的字段。
 * 分开的结构体增加了一些复杂性,但节省了内存,
 * 它可以防止pthreads 负担任务所需的开销(反之亦然)。
 */
struct task_tcb_s
{
  /* 共用的TCB 字段 **********************************************************/

  struct tcb_s cmn;                      /* 共用的TCB 字段                  */

  /* 任务管理字段 *****************************************************/

#ifdef CONFIG_SCHED_STARTHOOK
  starthook_t starthook;                 /* 任务起始函数               */
  FAR void *starthookarg;                /* 传递给函数的参数 */
#endif

  /* [Re-]start name + start-up parameters **************************************/

  FAR char **argv;                       /* Name+start-up parameters            */
};

/* struct pthread_tcb_s **********************************************************/
/*这是pthreads使用的任务控制块(TCB)结构体。有2个TCB表:
 * 一个用于pthreads,一个用于任务。2个都包含一个共用的TCB字段
 * (必须出现在结构体的顶部),加上任务和线程特有的字段。
 * 分开的结构体增加了一些复杂性,但节省了内存,
 * 它可以防止pthreads 负担任务所需的开销(反之亦然)。
 */

#ifndef CONFIG_DISABLE_PTHREAD
struct pthread_tcb_s
{
  /* 共用的TCB字段 **********************************************************/

  struct tcb_s cmn;                      /* 共用的TCB字段                   */

  /* 任务管理字段***********************************
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值