(嵌入式 实时操作系统 rtos nuttx 7.18 stm32 源代码分析)
NuttX 任务管理
转载请注明出处:
http://blog.csdn.net/zhumaill/article/details/70175079
1 任务控制块
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字段 */ /* 任务管理字段***********************************
版权声明:本文为zhumaill原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。