(嵌入式 实时操作系统 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 版权协议,转载请附上原文出处链接和本声明。