搜索
bottom↓
回复: 0

第五天 UC/OS-II的学习

[复制链接]

出0入0汤圆

发表于 2012-3-5 21:49:43 | 显示全部楼层 |阅读模式
第五天
1-4 怎么处理ISR的。
1.        UC/OS中,中断服务子程序要用汇编语言来写。但是如果C语言编译器支持在线汇编的话,可以用C语言写。
2.        OSIntNesting 是中断嵌套层数的意思。在开中断之前要先清中断。它在OSIntEnter()中就是++;
3.        OSIntExit()是脱离中断函数。 将OSIntNesting--,当嵌套层数减为0时,所有中断就完成了。此时判断有无较高优先级的进入就绪态。然后选择恢复那个寄存器的值。然后执行被中断了的任务。代码5.3.1 是中断脱离函数。
void OSIntExit (void)
{
   OS_ENTER_CRITICAL();
   if ((--OSIntNesting | OSLockNesting) == 0)
{
     OSIntExitY    = OSUnMapTbl[OSRdyGrp];
        OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
    if (OSPrioHighRdy != OSPrioCur)
{        
            OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
            OSCtxSwCtr++;                       
            OSIntCtxSw(); //任务切换。它的代码在OS_CPU_A.C中。不是OSCtxSw() ;               
        }
    }
    OS_EXIT_CRITICAL();
}
4.        用户中断服务中做的事情尽量少,通知某任务去做的手段可以使:OSMboxPost()、OSQPost()、OSQPostFront()、OSSemPost().

图5.4.1 (原文件名:图片2.png)

图5.4.1 中断的响应过程
5.        时钟节拍
5.1 UC/OS需要用户提供周期性的信号源,用于实现时间延时和确认延时。节拍率应该在10—100HZ之间。
5.2 用户必须在多任务系统启动以后 再启动时钟节拍源计时。
5.3 时钟节拍服务是通过在ISR中调用OSTimeTick()实现的。
6.  CPU总是执行就绪表中优先级最高的任务,任务有没有在就绪表中就得依靠OSTimeTick()了。OSTimeTick()很大的工作是给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1,当某任务的任务控制块中的时间延时项OSTCBDly减到了零,这个任务就进入了就绪态。而被任务挂起的喊声OSTaskSuspend()挂起的任务则不会进入就绪态。下面是OSTimeTick()的代码。
void OSTimeTick (void) REENTRANT
{
    OS_TCB DT_XDATA * ptcb;
OSTimeTickHook();                                      
ptcb = OSTCBList;                                    
    while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {                     OS_ENTER_CRITICAL();
        if (ptcb->OSTCBDly != 0) {                        
            if (--ptcb->OSTCBDly == 0) {                  
                if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {   
                    OSRdyGrp               |= ptcb->OSTCBBitY;
                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                } else {                                       
                    ptcb->OSTCBDly = 1;                        
                }                                             
            }
        }
        ptcb = ptcb->OSTCBNext;                           
        OS_EXIT_CRITICAL();
    }
OS_ENTER_CRITICAL();                                   
    OSTime++;
    OS_EXIT_CRITICAL();
}
7.        OStimeTick ()的执行时间直接与应用程序中建立了多少个任务成正比。
8.        OSTime是累计从开机以来的时间。


燕山大学  电气工程学院  09级检测技术与仪器

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 01:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表