转载:http://hi.baidu.com/qinzhispace/item/46a0dfe13131cf216dabb8a7
一:Kernel篇
1.描述:uItron内核,是操作系统的核心,可以实时多任务处理,它有三个主要的概要:
1.1响应事件:(Response to events)认可的事件可以异步的产生,并且可以立即执行一个任务去处理这
个事件。
1.2任务调度:(Task scheduling)任务的调度依赖于任务的优先级。
1.3执行服务调用(Service call execution)在任务中,为了处理不同的要求,调用服务函数,可以执行适当
的处理。
2.功能:一个应用程序可以利用服务函数去实现大部分内核的功能
2.1任务管理功能:当一个任务在执行的时候,CPU被分配给这个任务,由内核控制CPU分配的指令和任务
的开始和结束,多任务可以利用共享堆栈的方法共用一个堆栈。
2.2任务同步管理功能:为任务执行基本的同步处理,例如,执行任务的挂起,恢复和任务事件的标志位处理。
2.3同步和通讯管理功能:利用事件标志位(event flag),信号量(semaphres),队列(data queue)和
邮箱(mailbox)可以为为内部的任务实现同步和通讯。
2.4扩展同步和管理功能:利用互斥(mutex),消息缓存(message buffer)也可以为内部实现同步和通
讯。
2.5内存池管理功能:在用户的系统里,管理没有被用过的内存作为一个内存池,一个任务动态取得的块石
来自于内存池,并且可以归还个内存池,作为内存池的大小可以是固定的或者是可变的。
2.6时间管理功能:为系统管理与时间相关联的信息,为了控制的目的,还要监听任务的时间。
2.7系统状态管理功能:执行系统状态功能,例如,修改或者查询环境和系统状态。
2.8中断管理功能:开始时适当的中断处理响应外部中断,这个中断处理执行适当的中断处理,并且通报任
务的中断。
2.9服务调用管理功能:定义或者调用一个扩展的服务调用。
2.10系统配置管理功能:执行系统配置管理功能,例如定义CPU异常handler和读内核版本号。
2.11DSP/FPU支持:在多任务处理环境中,支持DSP/FPU,每个任务可用特殊地注册去执行D/F指令。
3.处理单元(Processing Units)一个应用程序被执行在下列的处理单元中
3.1任务(Task):一个任务是一个处理单元,有多任务处理控制。
3.2任务异常处理程序(Task Exception Processing Routine)当一个任务通过任务异常处理调用函数要求异常处理的时候,这个任务异常处理程序会被执行。
3.3中断Handler(Interrupt Handler):当一个中断发生的时候,一个中断Handler会被执行。
3.4CPU异常Handler(CPU Exception Handler ):当一个CPU异常发生的时候,一个CPU异常Handler会被执行。
3.5Time Event Handler(Cyclic Handler,Alarm Handler,Overrun Handler)当一个特殊的循环或者时间到了的时候,一个时间事件Handler会被执行。
3.6Extended Service Call:扩展服务调用。
4.优先级(Precedence):每个处理单元按一下的优先级顺序被执行:
中断Handler,Time event handler,CPU exection handler,Dispatche ,Task,任务异常处理。
4.1中断Handler(Interrupt handler),时间事件(Time event handler)和CPU异常处理Handler(CPU Excepion handler)它们的优先级处理:当有高优先级中断发生,中断Handler就会变成优先级最高的这个。一个时间事件Handler优先级与一个定时中断时一个级别。
4.2分派(Dispatcher):分派是内核处理过程,是由内核转换一个任务去执行。
4.3任务(Task):任务的遇险记依赖于任务的优先级定义。
4.4任务异常处理(Task Exception Process):任务异常处理程序的优先级比该任务高,比其它高优先级任务低。
4.5特殊情况:当以下的服务函数被调用,优先级不使用上面的情况:
4.5.1当dis_dsp被调用,这个优先级在上面提到的4.1和4.2之间,利用dis_dsp这个状态返回到从前的状态。
4.5.2当loc_cpu或者iloc_cpu被调用,这个优先级是与Interrupt handler一致的,这个interrupt handler的级别与CFG_KNLMSKLLL一致。调用unl_cpu或者iunl_cpu状态会返回到从前的状态。
4.5.3当这个interrupt mask级别被改变除了0以外,利用chg_ims这个优先数同interrupt handler一样,是同一个级别。
5.系统状态(System state):系统状态定义了以下几个状态:任务环境状态/无任务环境状态;可执行分派状态/不可执行分派状态;CPU-locked状态/CPU-unlocked状态。
5.1任务环境状态和无任务环境状态:在系统被执行,无论在任务环境状态或者无任务环境状态下,任务和无任务环境状态之间的不同之处在下面的表1中:
Item Task Context State Non-Task Context State Available service calls Service calls that can be called from the task context Service calls that can be called from the non-task context Task scheduling Refer to Does not occur
以下的处理被执行且在无任务环境中:Interrupt handler;CPU exception handler;Time event handler(cyclic handler,alarm handler,overrun handler);调用chg_ims服务函数去改变interrupt mask的值(除了0以外)的地方。
5.2分派不可以的状态和分派可以的状态(Dispatch-disable State/Dispatch-enable State)系统无论是放置在不可以分派的状态下还是可以分派的状态下。在不可以分派的状态下,任务调度是不允许的,在任务处于WAITING的状态下, 调用服务函数是没有用的。
在任务执行期间,用这个dis-dsp服务调用函数可以将系统状态变为分派不可以的状态,用这个ena_dsp服务函数将要返回系统的状态到分派可以的状态,用这个sns_dsp服务函数,可以检查系统状态是在分派不可以的状态或者是分派可以的状态。
总结:在dispatch-disable和dispatch-enable的过程中是独占cpu的使用时间,这段时间,任务不可以调度。
5.3CPU-locked状态和CPU-unlocked状态
系统无论放置在CPU-Locked状态或者CPU-Ulocked状态下,在cpu-locked的状态下,中断和任务调度是不允许的。注意,无论如 何,如果在配置中,中断的mask级别比那个专用的任务级(CFG_KNLMASKLVE)高,这样是允许的,在这个状态下,在任务处于WAITING状 态下调用服务函数是无用的。
在任务执行期间,用loc_cpu或者iloc_cpu函数可以将系统的状态变为CPU-Locked状态,用unl_cpu或者iunl_cpu函数可 以将系统的状态返回到CPU-Onlocked状态,另外用sns_loc函数可以检查系统状态是CPU-Locked状态或者不是。
6.对象(objects)
对象是被服务函数操作的任务和信号量,对象也会被标识为ID号或者object号,在配置中最大的号能被指定给几乎所有的object。
7任务(Task)
在实时多任务处理,用户按照设置的任务准备一个应用程序,这个程序能够独立地,平行地被执行。
利用服务函数,可以使一个任务与其他任务之间通信,利用外围设备或mcu,服务函数可以被用作是kernel处理事件异步的发生。
7.1任务的状态和转变(Task State and Trunsition)
在用户的系统里,任务可以处于一下七种状态:
7.1.1不存在的状态(NON-EXISTENT State):一个任务还没有在Kernel注册,是一个虚拟的状态。
7.1.2睡眠状态(DORMANT State):一个任务虽然在Kernel注册,但是还没被初始化或者已经被终止。
7.1.3就绪状态(READY State):一个执行的任务在队列中等待CPU的资源分配,因为有其它更高优先级的任务正在执行。
7.1.4运行状态(RUNNING State):这个任务当前正在运行,随着这个高优先级的,在运行状态,Kernel也放置一个就绪(READ)的任务。
7.1.5等待状态(WAITING State):当一个任务不能长时间的继续执行,调用服务函数tslp_tsk(),会使自己睡眠,当调用服务函数wup_tsk()的时候,这个任务就会从WAITING(sleep)状态被唤醒,即这个任务转换为就绪(READ)状态。
7.1.6挂起状态(SUSPENDED State):另一个任务利用服务调用函数sus_tsk()可以使一个任务挂起。
7.1.7等待-挂起状态(WAITING-SUSPENDED State):这个状态是WAITING状态和SUSPENDED状态的合并状态。
附:任务状态的转换图:
7.2任务创建(Task Creation)
任务创建的意思是任务从不存在的状态编程睡眠状态,(Non-existent->Dormant)用哪一种方式创建任务,这个方法就会改变堆栈的使用类型。
参见:任务创建图表(表一)
7.3任务开始(Task Initiation)
一个任务的开始时将任务的睡眠状态编程就绪状态,(Dormant->Ready)
7.3.1一个任务的开始可以用以下两种方法:
@1调用服务函数:act_tsk(),sta_tsk()
@2当一个任务被创建的时候,用特定的TA_ACT作为任务的属性。
7.3.2在任务开始的时候,kernel执行以下的过程:
@1初始化这个任务的base priority和current priority。
@2清除任务wake-up要求的数量。
@3清除任务suspension要求的嵌套的数量。
@4清除挂起(pended)的任务异常来源。
@5设置任务异常处理为不可以的状态。
@6设置任务event flag为0.
说明:以下的参数被传递给任务
@1当TA_ACT作为创建任务的属性的时候和这个任务有act_tsk()开始的时候,这个人在任务创建制定的扩展信息会被传递个任务。
@2当这个任务是由sta_tsk()开始的时候,这个通过sta_tsk()指定的任务开始Code(stacd)会被传递给任务。
7.4任务调度(Task Scheduling)
@1时序调度(Scheduling):任务的时序安排的意思是kernel确定执行的任务执行次序,也就是说,这个次序是有cpu分配给任务,就是READY.kernel选择一个Ready的任务,并且将它置为RUNNING状态,如果没有就绪(READY)的任务,kernel进入空闲状态,取消中断masking并且进入一个无线循环中,等待由中断唤醒的任务,当有许多的任务处于就绪(READY)状态,那么执行的次序就是由cpu分配的wait queue或者ready queue决定的。
为了每一个任务的优先级,(优先级相同的情况下)这有一个ready queeu,每一个queeue操作时按FCFS(First-come,first-served),数值越低,优先级就越高。
@2反转调度(Round-Robin Scheduling)
kernel也支持Round-Robin Scheduling,在cpu分配的相同级别优先级的任务地方,在一个特殊期间,可以通过反转ready queue。用rot_red()函数操作。通过rot_req()函数,在特殊的循环里,执行的次序在一个特殊的期间(具有优先级相同的任务)是可以选择的。
参见:反转任务优先级
@3限制调度(limitation to scheduling)
当系统进入由dis_dsp函数实现的dispatch-disable状态,这个时候任务是不可调度的。
当系统进入由ena_dsp()函数实现的dispatch-enable状态,这个时候任务是可以调度的。
当系统进入由loc_cpu()函数实现的cpu-locked这个时候的任务的调度和所有的中断(除了kernel管理的中断)都是不可以调度的。
当系统进入由unl_cpu()函数实现的cpu-unlocked这个时候的任务调度和中断都是可以的。
附:反转任务优先级
附:任务创建图表(表一)
The method of creating task Kinds of stack which the task created uses static stack Dynamic stack cre_tsk,acre_tsk Service calls √ vscr_tsk Service calls √ By Configruator √ √
7.5任务的终止和删除(Task Ternination and Deletion)
任务终止的意思是一个任务完成之后,进入睡眠状态或者不存在的状态
ext_tsk():从调用的任务中正常退出,是其从运行状态变为睡眠状态。
exd_tsk():使调用的任务正常退出,并将其删除,这个函数将任务从运行状态编程不存在的状态。
ter_tsk():强制终止tskid指定的任务,使其从READY_WAITING,WAITING_SUSPENDED,SUSPENDED状态
变为DORMANT状态。
当一个任务被终止和又被重新开始或者当开始要求queues的数值(act_tsk()服务调用时指定的)除了0,任务就会从最初始的状态开始。
当一个任务不能长久的被用或者当重新分配这个任务ID给其它的任务时,这个exd_tsk()服务调用会被使用,并且将任务不存在的状态,这个ID能够马上被分配给其它的任务,一个任务必须在它执行完了之前释放它的资源,注意,当一个任务被终止和删除,那个Mutex会被unlocked。
当一个任务被终止的时候,kernel执行以下过程:
@1解开被当前任务锁上的互斥。
@2清除上限处理时间(the upper limit processor time)
当一个任务被删除的时候,kernel执行以下过程:
@1释放任务堆栈区域。
7.6任务堆栈(Task Stack)
有三种方式占用堆栈
@1静态堆栈(Static Stack)当系统被配置的时候,静态的堆栈就会通过配置被定义为每一个任务用一个单一的堆栈为多个任务利用,即允许更多的任务去一个共享堆栈是可以使用静态堆栈。
@2动态堆栈(Dynamic Stack)当一个任务被创建,是kernel分配堆栈区域给这个任务,这个堆栈是从动态堆栈区域分配的,一个共享堆栈(使用动态堆栈)不能被多个任务利用。
@3应用程序占用堆栈(Stack Occupied by application only in HI7000H)在任务创建的时候,应用程序占用的堆栈是特殊的地址,共享堆栈功能(用动态堆栈)不可以为多个任务利用。
说明:配置文件指定了一个最大的任务ID(CFG_STSTKID),随着描述最大号的任务使用静态堆栈,这个最大任务ID(CFG_MAXT_SKID)在系统里。
任务ID在1和CFG_STSTKID之间使用静态堆栈,然而,任务ID在CFG_STSTKID+1和CFG_MAXTSKID之间使用动态堆栈或者由应用程序占用,如果CFG_STSTKID被指定为0,那么久无静态的堆栈被使用,如果CFG_STSTKID和CFG_MAXTSKID被指定同样的值,那么所有的任务都会使用顶台堆栈。
7.7共享堆栈功能(Shard Stack Function)
多任务可以共享一个静态堆栈,这样减少了总堆栈空间。
共享堆栈和静态堆栈的分配时有配置文件定义的。然而,在共享一个堆栈的任务组里的任务,是仅仅有一个在每一次被执行的时候。当多个任务开始和共享一个堆栈的时候,首先开始的任务首先使用这个堆栈,剩下的任务进入共享堆栈wait状态,在共享堆栈等待状态的任务一先进先出(FIFO)队列来管理,不管他们的优先级,任务被送到共享堆栈(shared-stack)wait queue。为了他们的开始。
当任务的状态为DORMANT的时候,共享堆栈就会从这个任务中释放,当有多个任务正在等待这个共享堆栈,在等待队列头的任务将会使用这个堆栈和进入READY状态。
附:对共享堆栈功能和转换图(图一)
7.8任务执行模式(Task Execution Mode)
在一些情况中,一个任务可以强制终止一个在还没释放它所有使用的资源之前的任务.(ter_tsk)另外,在一些情况下,一个任务可以被强制地终止(sus_tsk),用vchg_tmd函数可以mask(屏蔽)ter_tsk或者sus_tsk.
7.9排它控制(Exclusive Control)
在一些情况中,在一个任务执行期间,这个任务也许需要排除其它程序。例如,当任务A和中断处理程序B都需要对一个全局变量进行查询和修改,这个时候,查询和修改必须是排它的.即独占。可以排它的控制程序可以是一个中断handler或者是指定的任务。
参见:排他控制表(表一)
7.10任务事件标志位(Task Event Flags )
任务事件标志位是任务的一种模式,一个任务可以等待一个指令.设置的bit为当前任务,也就是说,它可以等待一个指令事件的发生。
参见:Task event flag用例(图一)
8.任务异常处理(Task Exception processing )
当一个任务在执行期间,发生一个异常,那么就会执行异常处理,任务异常处理的执行与任务的处理时异步的,是异步处理,与通常所说的"signal"功能相似.可以在配置的时候定义。
参见:任务异常处理用例(图二)kernel interrupt mask level
NoneMask interrupts by issuing (chg_ims)service callwhen the chg_ims service call is issued from the
task context state,the execution becomes the
non-task context state
Equal to or lower than thekernel interupt mask level
NoneEnter disable-dispatch state by issuing dis_dsp service callNoneNoneExclusive Control by semaphoreNoneThe kernel schedules tasks;however in tasks ussing the same seamphore,the number of tasks entering the READYstate.simultaneously
is limited to the semphore in initial count value
Exclusive Control by mutexNoneThe kernel schedules tasks;however tasks ussingthe same mutex cannot enter the READY state simultaneously.In addition,In tasks using the same mutex,the task priority inversion will not occur
Task event flag用例(图一)
描述:粗线表示执行过程,随着时间关系,Task event flag 的操作
1.任务a调用rclr_tfl(),清除所有的在它任务事件标志位
2.任务a调用vwai_tfl(),等待一个事件
3.任务b调用vset_tfl()(set pattern = 1)给任务a,因为这个设置模式被包含在任务a等待的模式,因此任务a的WAITTING状态取消,并且任务a事件标志位被清零
4.中断handle c调用irset_tlf(),(set pattern = 7)去设置任务a的事件标志位,在这种情况下,然而,随着一个vset_tfl()指定的模式,任务a不等待事件,因此这个任务事件标志位被逻辑或运算(ORed)终止
任务异常处理用例(图二)
描述:字母为操作顺序
a.任务a允许一个任务异常
b.一个异常(异常因子factor = 00000101 )被要求从任务a中,经由这个ras_tex()服务调用,在任务a执行期间
c.当任务a被预定执行的时候,任务的异常处理程序就会在任务a的主要程序被执行之前便开始了,在任务异常处理期间,任务进入任务异常处理不可以的状态,并且任务异常源被清除
d.从任务异常处理程序返回后,任务a的主要程序会被恢复
9.同步和通讯(Synchronization and Communication )
为了能够使任务之间同步和通讯,有以下几个方式:
a.Semaphores(信号量)排他或者独占控制资源
b.Event flags(事件标志位)等待several事件和同步任务操作
c.Data queues(数据队列)传递数据(Passes 1-word data)
d.MailBox(邮箱)传递数据(Passes data address)
e.Mutex(互斥)排他或独占控制一个Single一员(单一)
9.1信号量(Semaphore)
是任务执行被要求的资源元素,这些元素包含任务与硬件之间的内容共享。例如I/O,一个信号量是一个对像,通过表示实物和资源个数提供排他控制和同步功能,在这种情况下,任务必须被创建,为了分开一个任务空间,这个任务被排他访问,通过调用wai_sem()和sig_sem()。通常可以被利用的资源个数在初始化的时候被定义。
参见:Example of using Semaphore用例(图一)
描述:粗线是表示执行过程,虚线表示任务可以独占排他方位资源的区域
a.任务a通过cre_sem()创建一个信号量,开始时信号量个数是2(semaphore = 2)
b.任务a通过wai_sem得到一个信号量,消耗了信号量:个数为1(semaphore = 1)任务a继续执行
c.任务b调用wai_sem()
d.任务c调用wai_sem(),但是不能得到一个信号量,因为信号量的个数已经是0了,并且任务进入WAITING状态
e.任务a调用sig_sem()释放一个信号量,这个释放的信号量被任务c占有,那么任务c从WAITING状态释放进入READY状态
f.任务b地啊用sig_sem()释放一个信号量,因为没有任务在等待信号量,所以信号量的计数被指定为1
9.2事件标志位(Event flag)
一个event flag是一组按位组合的数去相应某个事件.一个事件相应一个位,任务可以等待一个event flag中设定的一个指定的位,也就是说,任务可以等直到这个指定的事件发生
参见:Example of using an Event flag用例(图二)
描述:粗线是表示执行过程,以下是描述event flag的操作与时间的关系
a.任务a通过cre_flg()创建一个event falg.TA_CLR属性(当WAITING状态释放,清除event flag为0),被指定并且开始时各个为指定的值都是0
b.任务a通过wai_flg()(waiting pattern = 3,AND wait)去等待一个事件
c.任务b通过set_flg()(set pattern = 7)因为任务a正在等待被设置,所有的位.任务a从WAITING状态释放,另外,因为被指定TA_CLR这个属性,这个event flag被清0
d.中断handler C通过iset_flg()(set pattern = 1)设置event flag,在这种情况下,这没有任务等待事件,并且event flag是(ORed)与操作和这个通过iset_flg()指定的pattern.