欢迎来到天天文库
浏览记录
ID:37713275
大小:29.63 KB
页数:7页
时间:2019-05-29
《ucosii中的中断》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、UC/OS-II中断相关的问题要弄清楚以下函数的意义:OSTimeTick()在OS_CORE.C中,为时钟管理函数。OSTickISR()在OS_CPU_A.S中以汇编的形式编写。任何计算机系统都应该有一系统时钟,UCOS系统的系统时钟是通过硬件定时器产生中断来实现的,这个中断会产生一个时钟中断服务程序,时钟中断服务程序也叫做节拍服务。各个任务运行都需要一个周期性的信号指示,即每一个任务允许运行的时间片是多少,必须规定好。这个时间片就是系统时钟节拍UCOS系统响应中断的过程:系统正在运行任务,此时有中断发生,且系统收到了中断请求(系统如何收到中断请求,中断以何种方式告知
2、操作系统?)。如果处理器处于中断允许状态,系统就中止当前任务的运行,而按照中断向量去执行相应的中断服务程序;中断服务自程序结束前,会进行一次任务调度。这样中断结束后,系统将会根据情况返回到被中止的任务继续运行,或者转到另外一个具有更高优先级的就绪任务上运行。全局变量OSIntNesting有两个用途:第一是用来记录中断嵌套的层数,中断嵌套也就是说当第一个中断发生而没有结束的时候,又发生了第二个更重要的中断,依次类推,此时OSIntNesting就用来表示嵌套的层数,也就是有多少个中断在发生或者等待处理,也就是说每当有中断发生时,就将OSIntNesting加1,有中断结束
3、的时候,就将OSIntNesting减1;第二是作为调度器是否可进行调度的标志,以保证调度器不会在中断服务程序中进行任务调度,也就是当OSIntNesting大于0的时候,将调度器加锁,OSIntNesting等于0的时候,调度器解锁。(这样理解调度器的加锁和解锁,是否正确?中断服务自程序结束前,会进行一次任务调度。这个时候调度器不是锁上的吗?如何调度呢?)UCOS用两个函数OSIntEnter(void)和OSIntExit(void)来处理变量SIntNesting。voidOSIntEnter(void){if(OSRunning==TRUE){if(OSIntNe
4、sting<255u){OSIntNesting++;/*IncrementISRnestinglevel*/}}};这个函数的作用就是把SIntNesting加一,来记录嵌套层数,并为调度器加锁。它经常运行在中断服务程序保护用户被中断任务的端点数据之后,运行用户中断服务代码之前,通常叫做进入中断服务函数。消息量函数分析OS_EVENT*OSSemCreate(INT16Ucnt)消息量函数分析OS_EVENT*OSSemCreate(INT16Ucnt)OS_EVENT*OSSemCreate(INT16Ucnt);该函数返回的数据类型为指针,指针指向的数据类型为OS_
5、EVENT(事件的数据类型为结构体)。也就是函数返回一个地址,地址里存的是新创建的结构体类型所占据的内存的首地址。OS_EVENT*pevent;pevent=OSEventFreeList;if(OSEventFreeList!=(OS_EVENT*)0){/*SeeifpooloffreeECBpoolwasempty*/OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;};首先创建一个指向OS_EVENT结构体类型的指针pevent;系统初始化时会创建一个空事件控制块链表,而创建的空事件控制块的数目由常数O
6、SEventMax来决定。OSEventFreeList就指向这个空事件控制块链表的第一个,所以上面的程序里把OSEventFreeList赋给了pevent,也就是让pevent指向第一个空事件控制块,然后又让OSEventFreeList指向了空事件控制链表中的第二个。也就是从空事件链表中摘出了第一个给事件使用。if(pevent!=(OS_EVENT*)0){/*Getaneventcontrolblock*/pevent->OSEventType=OS_EVENT_TYPE_SEM;pevent->OSEventCnt=cnt;/*Setsemaphorevalu
7、e*/pevent->OSEventPtr=(void*)0;/*UnlinkfromECBfreelist*/#ifOS_EVENT_NAME_SIZE>1pevent->OSEventName[0]='?';/*Unknownname*/pevent->OSEventName[1]=OS_ASCII_NUL;#endif;以上就是对新创建的空任务控制块的各个量进行初始化。OS_EventWaitListInit(pevent);;通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化。该函
此文档下载收益归作者所有