高通操作系统分析.pdf
《高通操作系统分析.pdf》由会员分享,可在线阅读,更多相关《高通操作系统分析.pdf(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 REX 操作系统分析 System Group 1.数据定义与宏定义(Defines&Macros).5 1.1.数据结构.5 1.1.1.TCB(任务控制块).5 1.1.2.定时器(timer)数据结构.7 1.1.3.临界区(Critical Section)数据结构.7 1.1.4.上下文帧的结构.7 1.2.几个全局变量.8 1.2.1.rex_curr_task.8 1.2.2.rex_best_task.8 1.2.3.rex_task_list.8 1.2.4.rex_num_tasks.8 1.2.5.rex_kernel_tcb.8 1.2.6.rex_sched_all
2、ow.8 1.2.7.rex_nest_depth.9 1.2.8.rex_timer_list.9 1.2.9.rex_null_timer.9 1.2.10.rex_irq_vector&rex_fiq_vector.9 1.3.MACROS(几个宏定义).9 1.3.1.REX_VERSION_NUMBER.9 1.3.2.任务链表操作宏.9 1.3.3.REX_TASK_RUNNABLE(tcb).10 1.3.4.看门狗操作宏.10 2.任务(TASK).10 2.1.创建任务.11 2.1.1.rex_def_task_internal().11 2.2.任务的通用引导函数.14
3、2.2.1.rex_task_preamble().14 2.3.任务挂起和继续.15 2.3.1.rex_suspend_task().15 2.3.2.rex_resume_task().15 2.4.删除任务.16 2.4.1.rex_remove_task().16 2.4.2.rex_kill_task_ext().16 2.5.Others.19 2.5.1.rex_self().19 2.5.2.rex_get_pri().19 2.5.3.rex_set_pri().19 2.5.4.rex_task_pri().19 3.调度(Schedule).21 3.1.调度代码.21
4、 3.1.1.rex_sched().21 3.2.设定rex_best_task.23 3.2.1.rex_set_best_task().24 3.3.任务调度加锁/解锁.24 3.3.1.rex_task_lock().24 3.3.2.rex_task_free().25 3.3.3.rex_tasks_are_locked().25 4.中断(Interrupts).25 4.1.设置中断向量.26 4.1.1.rex_set_interrupt_vector().26 4.2.PIC Trampoline Service(可编程控制弹簧中断服务).26 4.2.1.tramp_in
5、it().26 4.2.2.tramp_set_isr().27 4.2.3.tramp_isr().29 4.3.IRQ_handler.33 5.信号量(Signals)和定时器(Timers).37 5.1.信号量.37 5.1.1.rex_wait().38 5.1.2.rex_set_sigs().39 5.1.3.rex_get_sigs().39 5.1.4.rex_clr_sigs().40 5.2.定时器.40 5.2.1.rex_init_timer_list().41 5.2.2.rex_insert_timer().41 5.2.3.rex_def_timer().42
6、 5.2.4.rex_set_timer().43 5.2.5.rex_timed_wait().44 5.2.6.rex_clr_timer().44 5.2.7.rex_get_timer().45 5.2.8.rex_pause_timer().46 5.2.9.rex_resume_timer().46 5.2.10.rex_delete_task_timers().47 5.2.11.rex_decrement_timers().47 5.2.12.rex_tick().49 5.3.Others.49 5.3.1.rex_sleep().49 6.临界区(Critical Sect
7、ion).50 6.1.rex_init_crit_sect().51 6.2.rex_enter_crit_sect().51 6.3.rex_leave_crit_sect_internals().53 7.APC&DPC.56 7.1.DPC的实现.56 7.1.1.rex_dpc_task().56 7.1.2.rex_execute_next_dpc().57 7.1.3.rex_queue_dpc().57 7.2.APC的实现.58 7.2.1.rex_queue_apc().58 7.2.2.rex_queue_apc_internal().59 7.2.3.rex_apc_p
8、rolog().60 7.2.4.rex_call_apc().62 7.2.5.rex_apc_epilog.63 8.REX操作系统的初始化与退出.63 8.1.main().64 8.2.rex_init().64 8.3.rex_exit().67 8.4.rex_get_version_number().67 9.内存管理.67 9.1.rex_mem_init().67 9.2.rex_malloc().67 9.3.rex_calloc().68 9.4.rex_realloc().68 9.5.rex_free().68 REX(Real Time Executive)是一个面
9、向嵌入式应用的、简单高效的、抢先式、多任务实时操作系统,支持基于优先级的任务调度算法(支持优先级反转)。它提供了任务控制、任务同步、互斥、定时器和中断控制等 API。REX 所有的函数都在任务上下文环境里执行。REX 只需要少于 5k 的 ROM 空间,需要的 RAM 空间取决于运行的任务数目加上几k 字节的状态数据和堆栈空间。REX 处理了 IRQ 中断。1.数据定义与宏定义(Defines&Macros)1.1.数据结构 rex.h 中定义了 REX 中的各种数据结构。1.1.1.TCB(任务控制块)?用于描述一个 REX 任务?不能被外部直接访问?由于内核按照排列顺序对其进行访问,结构中
10、数据的排列顺序不能更改 typedef struct rex_tcb_struct void *sp;/*堆栈指针 */void *stack_limit;/*堆栈限值 */unsigned long slices;/*任务的时间片 */rex_sigs_type sigs;/*当前持有的信号量*/rex_sigs_type wait;/*等待获得的信号量 */rex_priority_type pri;/*任务优先级*/#if defined FEATURE_REX_PROFILE unsigned long time_samples;/*Profiling information*/uns
11、igned long max_intlock_time;/*Profiling Info*/#endif#if defined TIMETEST word leds;/*TIMETEST val */#endif#if defined FEATURE_SOFTWARE_PROFILE /*32 bits counter,30 usec/tick,35 hours*/dword numticks;#endif#ifdef FEATURE_REX_APC long num_apcs;/*APC调用数目*/#endif /*以上数据域的偏移量已在rexarm.h中定义。注意保持两者一致*/rex_t
12、cb_link_type cs_link;/*当等待临界区时,为非空*/rex_crit_sect_type *cs_stackREX_CRIT_SECT_MAX;/*持有和等待临界区的TCB堆栈*/rex_crit_sect_type *cs_sp;/*临界区堆栈指针*/boolean suspended;/*任务是否挂起*/char task_nameREX_TASK_NAME_LEN+1;#if defined FEATURE_REX_EXTENDED_CONTEXT void *ext;#endif unsigned long thread_id;unsigned long stack
13、_size;/检查task堆栈的使用情况,该特性没有打开#ifdef FEATURE_SI_STACK_WM unsigned long stack_wm;#endif /用于BSD socket数据服务#if defined FEATURE_DS_SOCKETS_BSD void *bsdcb_ptr;#endif int err_num;/*Error code */用于在task被阻塞时,通知Dog停止监视 int dog_report_val;/*Dog Report Id */int autodog_enabled;/*Dog Report enabled?*/#if defined
14、 FEATURE_REX_CREATE_TASK|defined FEATURE_ZREX boolean is_dynamic;#endif#ifdef FEATURE_REX_IPC rex_ipc_info_type ipc_info;#endif rex_tcb_type;1.1.2.定时器(timer)数据结构?描述 REX 使用的定时器?不能被外部直接访问 typedef struct rex_timer_struct struct struct rex_timer_struct*next_ptr;struct rex_timer_struct*prev_ptr;link;rex_
15、timer_cnt_type cnt;/*当前计数值 */rex_tcb_type *tcb_ptr;/*指向需要信号的TCB结构*/rex_sigs_type sigs;/*关联的信号量 */#ifdef FEATURE_REX_TIMER_EX rex_timer_cb_type cb_ptr;/*Function called when timer expires*/unsigned long cb_param;/*Argument to callback function */#endif rex_timer_type;1.1.3.临界区(Critical Section)数据结构?提
16、供互斥机制 typedef struct byte lock_count;/*0 if crit sect is taken */struct rex_tcb_struct*owner;/*持有者的TCB指针*/struct rex_tcb_struct*tcb_link;/*等待队列的头指针*/rex_priority_type orig_pri;/*原始优先级,为支持优先级反转而提供*/rex_crit_sect_type;1.1.4.上下文帧的结构?任务的上下文,记录了 ARM 的各个寄存器的数据 typedef PACKED struct rex_cpu_register_type s
17、psr;rex_cpu_register_type r13;/*r0-r7,r8-r12*/rex_cpu_register_type lr;/*r14 */rex_cpu_register_type pc;/*r15 */rex_context_frame_type;1.2.几个全局变量 1.2.1.rex_curr_task?当前任务的控制块 TCB 指针 rex_tcb_type *rex_curr_task;1.2.2.rex_best_task?处于 ready 状态、优先级最高的 task?将想要成为 rex_curr_task 的任务设为 rex_best_task,再调用 re
18、x_sched()进行任务的上下文切换?有些情况下,由于任务调度被加锁、或处于 ISR 中断模式,rex_sched()不会马上进行任务切换。因此,在 rex_sched()真正进行调度之前,rex_best_task 可能在不同地方被多次更改。所以在确定是否 rex_best_task 时,应该将需要切换的任务与rex_best_task 进行比较(而不是 rex_curr_task)。只有当该任务处于 ready 状态,且优先级比 rex_best_task 更高时,才允许更新 rex_best_task rex_tcb_type *rex_best_task;1.2.3.rex_task
19、_list?任务链表的头节点 rex_tcb_type rex_task_list;1.2.4.rex_num_tasks?任务个数 int rex_num_tasks=0;1.2.5.rex_kernel_tcb?任务链表的最末尾的节点、及其堆栈?一般指向 Idle task static rex_tcb_type rex_kernel_tcb;rex_stack_word_type rex_kernel_stack REX_KERNEL_STACK_SIZE/sizeof(rex_stack_word_type);1.2.6.rex_sched_allow?任务调度是否加锁的标志位 int
20、 rex_sched_allow=TRUE;/*turns sched on/off*/1.2.7.rex_nest_depth?用于支持任务调度的嵌套加锁,记录嵌套层数 unsigned int rex_nest_depth=0;/*supports nesting of TASKLOCK/*FREE.*/1.2.8.rex_timer_list?定时器链表的头节点 static rex_timer_type rex_timer_list;1.2.9.rex_null_timer?空定时器?定时器链表的最末尾节点 static rex_timer_type rex_null_timer;1.
21、2.10.rex_irq_vector&rex_fiq_vector?包含用户定义的 ISR 中断服务函数的入口点 void (*rex_irq_vector)(void);void (*rex_fiq_vector)(void);1.3.MACROS(几个宏定义)1.3.1.REX_VERSION_NUMBER#define REX_VERSION_NUMBER(unsigned long)403)1.3.2.任务链表操作宏?REX_TASK_LIST_FRONT()获得任务链表的头节点,多用于链表循环?REX_TASK_LIST_NEXT(tcb_ptr)获得指定任务的下一个任务?REX_
22、TASK_LIST_PREV(tcb_ptr)获得指定任务的前一个任务?REX_TASK_LIST_POP(tcb_ptr)将指定任务从任务链表中移除#define REX_TASK_LIST_FRONT()(&rex_task_list)#define REX_TASK_LIST_NEXT(tcb_ptr)(rex_tcb_type*)tcb_ptr-link.next_ptr)#define REX_TASK_LIST_PREV(tcb_ptr)(rex_tcb_type*)tcb_ptr-link.prev_ptr)#define REX_TASK_LIST_POP(tcb_ptr)tc
23、b_ptr-link.next_ptr-link.prev_ptr=tcb_ptr-link.prev_ptr;tcb_ptr-link.prev_ptr-link.next_ptr=tcb_ptr-link.next_ptr;1.3.3.REX_TASK_RUNNABLE(tcb)?判断指定任务是否处于 ready 状态。?判据:1、任务是否挂起;2、任务是否在等待进入临界区;3、任务是否在等待信号量;4、是否有 APC 队列需要处理。#define REX_TASK_RUNNABLE(tcb)(tcb-suspended=FALSE)&(tcb-cs_link.next_ptr=NULL)
24、&(tcb-wait =0)|(tcb-num_apcs 0)1.3.4.看门狗操作宏?REX_PAUSE_DOG_MONITOR(tcb_ptr)通知 DOG 停止监视该任务?REX_RESUME_DOG_MONITOR(tcb_ptr)通知 DOG 恢复对该任务的监视#define REX_PAUSE_DOG_MONITOR(tcb_ptr)if(tcb_ptr-autodog_enabled)&(tcb_ptr-dog_report_val=0)dog_monitor_pause(tcb_ptr-dog_report_val);#define REX_RESUME_DOG_MONITOR
25、(tcb_ptr)if(tcb_ptr-dog_report_val=0)dog_monitor_resume(tcb_ptr-dog_report_val);2.任务(TASK)REX 把 task 当作一个个独立的入口函数,每个 task 都拥有各自的堆栈、优先级,这些共同构成了任务的上下文。每个任务都有一个相关联的数据结构,称为 TCB(任务控制块)。REX 允许在执行任意时刻创建任意数目的 task。实际上,每增加一个任务,由于遍历更长的任务链表,REX 的性能会有轻微的下降。需要小心控制任务的数目。?任务堆栈:任务堆栈:每个任务都拥有自己的堆栈,在运行时被使用。当任务挂起时(如运行其
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 分析
限制150内