3.0 中断管理

由于在任务调度中涉及到时间片这个概念,于是转而先学习下一章,中断管理和时间管理,一共俩小节。

 

1、前言

  ucos是实时多任务操作系统,系统的实时性主要体现在对中断的响应上;除了响应时间,ucos要求对中断服务程序(ISR)运行时间不能过长。在之前分析过的任务删除函数中,因为涉及到有关全局变量的操作,函数关掉了中断;而为了避免关中断的时间太长,于是在删除任务的过程中又开了一次中断。

  对于不同的硬件系统,ISR的编写时完全不同的,因为这涉及到对底层寄存器的操作,操作系统中提供的中断管理函数位于core.c中。

  事实上,任务的调度大多也依靠中断。ISR在发现了有更高优先级的就绪任务就会进行任务调度。当操作系统有其他的外中断时,如定时器中断,外中断,串口中断等,只要中断时打开的,而且正在运行的任务并没有关中断,就会响应中断,这时任务就被切换了。

  这一节只是涉及中断管理,暂不涉及中断设计。

 

2、ucos中断的实现

上图:

 

 

 

从图中看到有三个待学习的函数:OSIntEnter()、OSIntExit()、OSIntCtxSw()

 

3、OSIntEnter()函数

源码

1 void  OSIntEnter (void)
2 {
3     if (OSRunning == OS_TRUE) {
4         if (OSIntNesting < 255u) {
5             OSIntNesting++;                      /* Increment ISR nesting level                        */
6         }
7     }
8 }

代码中有一个全局变量OSIntNesting很是重要,表示ISR的嵌套层数,每进入一次中断则将其加1。

注意下,在与这个函数对应的OSIntExit()中也有类似处理OSIntNesting的代码,只不过是每退出一次中断则将其减1。

 

4、时钟中断中的任务切换函数OSIntExit()函数

     ucos中任务调度分两种:任务级任务调度和中断级任务调度。这儿先就着中断管理部分把中断级任务调度讲述了。

     ucos在每个时钟滴答进入时钟中断服务程序,如果有比目前运行的任务更高优先级的任务就绪,在需要时进行一次任务调度。这个任务调度函数表示OSIntExit()。

     在时钟中断的时候,紧接着OSTimeTick,操作系统调用OSIntExit()实现任务的切换。

源码

 1 void  OSIntExit (void)
 2 {
 3 #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
 4     OS_CPU_SR  cpu_sr = 0;
 5 #endif
 6 
 7 
 8 
 9     if (OSRunning == OS_TRUE) {
10         OS_ENTER_CRITICAL();
11         if (OSIntNesting > 0) {                            /* Prevent OSIntNesting from wrapping       */
12             OSIntNesting--;
13         }
14         if (OSIntNesting == 0) {                           /* Reschedule only if all ISRs complete ... */
15             if (OSLockNesting == 0) {                      /* ... and not locked.                      */
16                 OS_SchedNew();
17                 if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */
18                     OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
19 #if OS_TASK_PROFILE_EN > 0
20                     OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */
21 #endif
22                     OSCtxSwCtr++;                          /* Keep track of the number of ctx switches */
23                     OSIntCtxSw();                          /* Perform interrupt level ctx switch       */
24                 }
25             }
26         }
27         OS_EXIT_CRITICAL();
28     }
29 }

line 9,确定在多任务已经启动的时候才调度。

而后关中断。

line 14,当确定已无中断嵌套时(如果有嵌套,要先执行那个任务),并且调度器还未上锁,执行OS_SchedNew ()。(嵌套一下!)

**********************************************************************************************

OS_SchedNew ()源码

 1 //FIND HIGHEST PRIORITY TASK READY TO RUN
 2 
 3 static  void  OS_SchedNew (void)
 4 {
 5 #if OS_LOWEST_PRIO <= 63                         /* See if we support up to 64 tasks                   */
 6     INT8U   y;
 7 
 8 
 9     y             = OSUnMapTbl[OSRdyGrp];
10     OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
11 #else                                            /* We support up to 256 tasks                         */
12     INT8U   y;
13     INT16U *ptbl;
14 
15 
16     if ((OSRdyGrp & 0xFF) != 0) {
17         y = OSUnMapTbl[OSRdyGrp & 0xFF];
18     } else {
19         y = OSUnMapTbl[(OSRdyGrp >> 8) & 0xFF] + 8;
20     }
21     ptbl = &OSRdyTbl[y];
22     if ((*ptbl & 0xFF) != 0) {
23         OSPrioHighRdy = (INT8U)((y << 4) + OSUnMapTbl[(*ptbl & 0xFF)]);
24     } else {
25         OSPrioHighRdy = (INT8U)((y << 4) + OSUnMapTbl[(*ptbl >> 8) & 0xFF] + 8);
26     }
27 #endif
28 }

其函数功能是找到优先级最高的任务,具体实现便是修改全局变量中有关优先级的变量。

*****************************************************************************************************

line 17,如果最高优先级就绪任务不是当前运行任务的话(如果是,便没有调度的必要了),则进行调度。

这儿有一个新函数,叫做OSIntCtxSw()。

 

5、中断中任务切换函数OSIntCtxSw

OSIntCtxSw()才是真正在中断程序中进行实际的任务切换的地方。

源码

 1 //PERFORM A CONTEXT SWITCH (From an ISR)
 2 
 3 void OSIntCtxSw()
 4 {
 5     DWORD n = 0;
 6 
 7     if(!(SS_SP->Exit)) {
 8         n = SuspendThread(SS_SP->Handle);
 9     }
10 
11     OSTaskSwHook();
12 
13     OSTrace( OBJ_SW, PT_SW_INT, OSTCBHighRdy, 0, OSPrioCur,OSPrioHighRdy,0 );
14 
15     OSTCBCur = OSTCBHighRdy;
16     OSPrioCur = OSPrioHighRdy;
17     SS_SP = (OS_EMU_STK*) OSTCBHighRdy->OSTCBStkPtr;
18 
19     ResumeThread(SS_SP->Handle);
20 }

这个函数的具体实现,在不同平台是不一样的。这儿先不分解,等到学习移植的时候在看。

 

6、结束

至此,中断管理第一部分完结,下一节涉及时间管理。

 

 

posted on 2013-09-04 10:10 shivency 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/shivency/p/3198054.html

公文是政府与企事业单位处理公务和行政管理工作的重要工具,在各级行政单位中,`办公`的一个重要内容就是办理和制发文件,即`办文`,办文是每个行政管理单位大量日常的工作。借助新的网络信息技术对公文进行高效有序的电子化处理,是办公自动化建设的重要组成部分,也是关系到电子化办公系统建设全局的基础性工程。 但是,传统的电子化办公系统对于公文的管理仅限于政府和企事业单位内部,公文仅限在单位内部进行流转。并且对于公文的管理,侧重在收文办理、发文办理的登记、审核、拟办、运转等环节,而对于公文在上下级之间与同级别行政单位之间的传输则是目前办公系统的弱项所在。 正是为满足这一类需求,EnableDTS公文传输管理系统构建了一个对上、对下、对左右的纵向和横向交错的公文传输网络,实现一点对一点或一点对多点的公文传输功能,简化了繁杂的工作环节和程序,推动了行政指令的有效快速的传达。若和传统的电子化办公系统结合起来,可实现从公文的起草、审核、批示、分发及来文登记、归档、承办、传阅等一系列综合性的公文流转全程管理,这不仅是传统公文管理方式的变革,更会带来行政办公方式的转变。 在此基础上,EnableDTS实现了对公文数据库中的公文由标题、发文字号、发文单位、发布时间、公文分类等基本要素构建单一或复合查询条件,快速定位和查阅对应公文的各对应接受单位的签收情况,并结合办公电子邮件系统对尚未进行公文签收的单位发送催办电子邮件,从而避免由于各单位长时间未登录公文传输系统造成众多文件无人签收的情形发生。与电子邮件系统这样的结合方式,避免公文电子化链路中断,是真正无纸化公文传输的有力保障措施。 更与行政管理工作相配套,EnableDTS不仅实现对公文的传输和签收管理,对于其他类公文,比如综合资料、会议通知、报送文件、内部公告信息等也与公文签收体系一样,制定了规范的传输管理流程,实现了这些文件、数据、信息的网络化传输。这就使得EnableDTS系统是一个完整的行政管理辅助工具,更结合简洁清晰易于学习的系统操作界面,不仅提升行政工作绩效,更使得工作井然有序。 专注公文传输管理 如前所述,EnableDTS并不帮助您完成对于公文的起草、审核、批示等生成公文流程的管理任务,这一部分的工作是办公自动化系统或者协同工作管理系统所要完成的核心目标。作为一款卓越的公文传输管理系统,EnableDTS帮助您的是,在公文生成之后,高效地实现公文、数据、文件、信息在上下级和同级单位之间的签收和传递,以替代传统的纸质公文和数据文件的印刷、递送和传阅。不仅如此,EnableDTS带来的附加好处是,它帮助您集中并且安全地存储这些海量的数据和文件,并提供极其简便的手段快速定位和查找出您所需要的。并因为公文的签收和数据的报送都已经完全电子化,所以非常容易列出已经签收和报送的用户列表,对于尚未签收和报送的用户单位发送催办电子邮件等。 专注在公文传输管理,一方面是因为原有的`制文`系统已经相当成熟,并且很多单位已经使用多年,重复研发这部分功能不仅浪费,而且从改变用户原有操作习惯上看完全没有必要。另一方面是因为原有用户系统考虑更多的是`制文`和`发文`,而对于`签文`的管理恰是缺失或不足的环节。 所以,EnableDTS它不是一款复杂的办公系统套件,它提供最为精粹的公文与类公文传输管理功能,创建、记录和跟踪这些文件和数据的传送流程,而摒弃较为复杂并且大多数情况下并不符合工作实际的软件功能。EnableDTS并不一味提供功能的`大而全`,小巧、精干、实用、方便使用并且能快速应用是其最初的软件设计原则。 安装包内Install目录有安装程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值