本文仅是自己阅读RTAI源码所作笔记。有从网上搜到的一些知识,如果侵犯到您的权益,请通知我,我会及时修改或删除,如有理解的不对的地方,还望高手指出,谢谢。
1. RTAI 的实时任务类型:RT_TASK
typedef struct rt_task_struct {
int *stack __attribute__ ((__aligned__ (L1_CACHE_BYTES)));
int uses_fpu;
int magic;
volatile int state, running;
unsigned long runnable_on_cpus;
int *stack_bottom;
volatile int priority;
int base_priority;
int policy;
int sched_lock_priority;
struct rt_task_struct *prio_passed_to;
RTIME period;
RTIME resume_time;
RTIME yield_time;
int rr_quantum;
int rr_remaining;
int suspdepth;
struct rt_queue queue;
int owndres;
struct rt_queue *blocked_on;
struct rt_queue msg_queue;
int tid; /* trace ID */
unsigned msg;
struct rt_queue ret_queue;
void (*signal)(void);
FPU_ENV fpu_reg __attribute__ ((__aligned__ (L1_CACHE_BYTES)));
struct rt_task_struct *prev;
struct rt_task_struct *next;
struct rt_task_struct *tprev;
struct rt_task_struct *tnext;
struct rt_task_struct *rprev;
struct rt_task_struct *rnext;
/* Appended for calls from LINUX. */
int *fun_args, *bstack;
struct task_struct *lnxtsk;
long long retval;
char *msg_buf[2];
int max_msg_size[2];
char task_name[16];
void *system_data_ptr;
struct rt_task_struct *nextp;
struct rt_task_struct *prevp;
/* Added to support user specific trap handlers. */
RT_TRAP_HANDLER task_trap_handler[RTAI_NR_TRAPS];
/* Added from rtai-22. */
void (*usp_signal)(void);
volatile unsigned long pstate;
unsigned long usp_flags;
unsigned long usp_flags_mask;
unsigned long force_soft;
volatile int is_hard;
void *trap_handler_data;
struct rt_task_struct *linux_syscall_server;
/* For use by watchdog. */
int resync_frame;
/* For use by exit handler functions. */
XHDL *ExitHook;
RTIME exectime[2];
struct mcb_t mcb;
/* Real time heaps. */
struct rt_heap_t heap[2];
} RT_TASK __attribute__ ((__aligned__ (L1_CACHE_BYTES)));
其中,stack用于保存实时任务的当前堆栈指针;
uses_fpu表示任务是否使用FPU;
magic用于标识这个结构是否是RT_TASK数据结构;
字段state,running用于表示任务所处的状态;
字段runnable_on_cpus用于表示任务当前运行的CPU;
stack_bottom
指向任务对栈的栈底;
priority表示任务的当前优先级,由于优先级继承的机制存在,这个字段的指有可能会和base_priority 的值不同;
base_priority表示任务本身的优先级;
字段prio_passed_to表示这个任务在优先级继承机制中将优先级传给了那个任务;
字段
period 周期任务的周期,非周期任务不使用该字段
resume_time 任务下一次的触发时间
yield_time 任务放弃CPU时间;
rr_quantum,rr_remaining用于同等优先级任务的时间片轮转调度;Round-Robin Scheduling.
rr_quantum 表示Time Slice interval value,在被抢占之前每个任务可以运行的时间。也就是Time Slice.
rr_remaining 为剩余的运行时间。
字段suspdepth用于记录任务被挂起的次数;
字段signal保存任务的一个类似于Linux下的信号处理函数,这个函数在任务调度的
时候会被调用;
字段prev,next,tprev,tnext,rprev,rnext用于任务的队列管理;
tprev, tnext 表示在Timed List中
rprev, rnext 表示是在 Ready List 中。
在RTAI中,存在一个全局变量rt_linux_task, 它代表普通的Linux进程,拥有最低的优先级和最大的时间恢复点。由于Timed List && Ready List 都是循环队列,它们都使用rt_linux_task作为队列尾,故rt_task_task.rnext 或rt_linux_task.tnext就指向了Timed List和Ready List的第一个任务。
阅读(1037) | 评论(0) | 转发(0) |