95992828九五至尊2

0中断驱动程序分析,0实时性分析

二月 6th, 2019  |  882828九五至尊手机版

     Windows Embedded CE
6.0是微软集团脚下流行的嵌入式操作系统之一,协理各样系列布局的MCU(ARM、MIPS、SH4和x86)。在很多的嵌入式操作系统中,它以投机特殊的优势脱颖而出,在全路嵌入式操作系统的市场份额中据为己有很大比例。比较其他嵌入式操作系统,Windows
Embedded CE 6.0主要有以下特点:

  • 图形用户界面,与桌面操作系统的图形用户界面基本一致,便于用户接受;
  • 互连网连接的支撑,蕴涵PAN、LAN、WAN、BlueTooth和WIFI;
  • 多媒体的协理,如DirectDraw、DirectShow、Directory3D及各种音频视频的编解码
  • 多语言的支撑,可以在定制系统时精选一种或三种语言;
  • 多进度的支撑,理论上支撑32K个经过,满意各样应用必要;
  • 组件化的开发格局有效裁减了成品的研发周期;
  • 据悉VS2005的并轨开发条件,让开发更方便。

Windows Embedded CE 6.0的中止处理进程主要分为两有的:

      以上这一个都是大家挑选Windows Embedded CE
6.0的缘故,但在很多嵌入式系统的行使场面,系统的实时性至关主要。而全套种类的实时性在很大程度上取决于它所利用的操作系统。那么Windows
Embedded CE 6.0的实时性到底怎样,能或不能满意大家的应用需要,或者说Windows
Embedded CE
6.0是还是不是是一个实时操作系统?本文将按照实际拔取,介绍一种在对象硬件平台上测试Windows
Embedded CE 6.0实时性的艺术。

  •  中断服务例程(ISR):处于根本中的低级处理程序,中断暴发时首先被调用。
  • 暂停服务线程(IST):处于驱动或者使用中的中断处理线程,由系统调度,落成一大半的中止处理工作。

      在议论Windows Embedded CE
6.0的实时性从前,先简单介绍一下实时操作系统的定义。实时操作系统除了具备相似操作系统的基本要素外,还非得能即时规范地响应所有不可预感的表面触发,尽管在系统处于巅峰负荷情况时。那是一个更加苛刻的必要。按照实际拔取的景观分裂,实时操作系统一般分为以下两种。

ISR的完结在OAL(OEM适配层)中,它只处理最低级的间歇响应,经常是得到IRQ和SYSINTR并安装MCU内部的暂停控制寄存器。中断处理的根本部分在驱动或者应用的中止处理线程中。中断处理线程与其他一般线程一样,使用同一个线程优先级管理系列。ISR和IST之间通过事件目的开展共同。IST中开创一个事件目的,并行使函数WaitForSingleObject()等待该事件被触发。ISR中通报内核触发相应的轩然大波目标。Windows
Embedded CE 6.0的间歇处理的历程如下图所示。

  • 年富力强时操作系统:准时准确地响应所有的表面触发,两回失利将促成灾祸性的后果。那类操作系统在航空航天和工业控制领域使用广泛。
  • 软实时操作系统:在不满意响应时限时,系统特性退化,但不会招致灾殃性后果。那类操作系统在互换系统中时时有利用。

882828九五至尊手机版 1

    
那里要求留意,实时操作系统并不是一个“快速”系统,实时系统有限定的响应时间,而毫无响应越快越好。事实上,响应时间足以是飞秒级的也得以是秒级的,甚至是分钟级的。只要在系统确定的时限内不易响应所有的表面触发,大家就可以认为它是一个实时操作系统,哪怕这么些期限是一钟头。举个例子,顾客打电话给肯德基叫外卖,肯德基在确定的30分钟内将顾客点的胡志明市送达,那这一个历程就可以认为是实时性的,时限为30分钟。

                  
   Windows Embedded CE 6.0的中止处理进度

     从2000年揭晓的WinCE3.0起先,Windows Embedded
CE就是一个实时操作系统。随着新本子的无休止推出,Windows Embedded
CE的实时性也不止狠抓。毋庸置疑,Windows Embedded CE
6.0也是一个实时操作系统。

  在其他的一对嵌入式操作系统中,在介绍中断处理时平日会提到一个暂停向量表的定义,如uC/OS。当刹车暴发时它会进来IRQ的处理程序,并按照IRQ的值跳转到事先分配好的刹车向量表相应的刹车处理函数中。但在WinCE中实际上并不设有刹车向量表的定义,而唯有一个充足向量表,对应于MCU的两种运行形式。WinCE的中止处理相应于八个越发IRQHandler和FIQHandler,寻常大家采纳的是IRQHandler。当外部中断发生时,系统举办IRQHandler(),IRQHandler()中调用OEMInterruptHandler()获取IRQ对应的SYSINTR,然后依照SYSINTR调用函数OEMNotifyIntrOccurs()触发与SYSINTR关联的风云,最终由IST已毕第一的中止处理工作。那种中断处理体制在一定水平上影响了系统的实时性,但进步了IST的八面见光。有关WinCE系统实时性分析,将在其余一篇中描述。

一般而言,对于实时操作系统来说,外部触发一般是指外部中断触发。所以,外部中断的响应时间(中断延迟)是衡量其实时性的一个最紧要标准。上面将从这一角度分析Windows
Embedded CE 6.0的实时性。

     上面结合DEVICEEMULATOR的PWRBUTTON驱动进行解析。该驱动也是一个流驱动,所以可以用驱动调试助手进行动态加载和卸载,但必要对代码举行相应的修改,否则会出难点。

Windows Embedded CE 6.0的刹车处理进程首要分为两局地:

   
首先看PBT_Init()函数,代码如下:

  • 停顿服务例程(ISR):处于根本中的低级处理程序,中断暴发时首先被调用。
  • 停顿服务线程(IST):处于驱动或者利用中的中断处理线程,由系统调度,达成一大半的暂停处理工作。

882828九五至尊手机版 2882828九五至尊手机版 3Code
882828九五至尊手机版 4DWORD
882828九五至尊手机版 5PBT_Init(DWORD dwContext)
882828九五至尊手机版 6882828九五至尊手机版 7882828九五至尊手机版 8{
882828九五至尊手机版 9    DWORD   IDPowerButtonThread;
882828九五至尊手机版 10    DWORD   IDResetButtonThread;
882828九五至尊手机版 11    HMODULE hmCore;
882828九五至尊手机版 12
882828九五至尊手机版 13    //
882828九五至尊手机版 14    // 从CORE Library中获得电源管理器”SetSystemPowerState”的函数指针/
882828九五至尊手机版 15    pfnSetSystemPowerState = NULL;
882828九五至尊手机版 16
882828九五至尊手机版 17    hmCore = (HMODULE) LoadLibrary(_T(“coredll.dll”));
882828九五至尊手机版 18
882828九五至尊手机版 19    if(hmCore != NULL)
882828九五至尊手机版 20882828九五至尊手机版 21    882828九五至尊手机版 22{
882828九五至尊手机版 23        pfnSetSystemPowerState = (PFN_SetSystemPowerState) GetProcAddress(hmCore, _T(“SetSystemPowerState”));
882828九五至尊手机版 24
882828九五至尊手机版 25        if(pfnSetSystemPowerState == NULL)
882828九五至尊手机版 26882828九五至尊手机版 27        882828九五至尊手机版 28{
882828九五至尊手机版 29882828九五至尊手机版,            FreeLibrary(hmCore);
882828九五至尊手机版 30        }
882828九五至尊手机版 31    }
882828九五至尊手机版 32
882828九五至尊手机版 33    //初阶化相关的虚拟内存地址
882828九五至尊手机版 34    InitializeAddresses();
882828九五至尊手机版 35
882828九五至尊手机版 36    // 创建POWER Button的IST和RESET Button的IST
882828九五至尊手机版 37    ResetButtonIntrThreadHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) ResetButtonIntrThread, 0, 0, &IDResetButtonThread);
882828九五至尊手机版 38    if (ResetButtonIntrThreadHandle == 0)
882828九五至尊手机版 39882828九五至尊手机版 40    882828九五至尊手机版 41{
882828九五至尊手机版 42        RETAILMSG(1, (TEXT(“PBT: CreateThread() Fail\r\n”)));
882828九五至尊手机版 43    }
882828九五至尊手机版 44    PowerButtonIntrThreadHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) PowerButtonIntrThread, 0, 0, &IDPowerButtonThread);
882828九五至尊手机版 45    if (PowerButtonIntrThreadHandle == 0)
882828九五至尊手机版 46882828九五至尊手机版 47    882828九五至尊手机版 48{
882828九五至尊手机版 49        RETAILMSG(1, (TEXT(“PBT: CreateThread() Fail\r\n”)));
882828九五至尊手机版 50    }
882828九五至尊手机版 51
882828九五至尊手机版 52    return (dwContext);
882828九五至尊手机版 53}

    
ISR的达成在OAL(OEM适配层)中,它只处理最低级的中止响应,平日是安装MCU内部的刹车控制寄存器。中断处理的主要部分在使得或者采纳的暂停处理线程中。中断处理线程与其余线程一样,使用同一个线程优先级管理系列。ISR和IST之间通过事件目的开展同步。IST中开创一个事件目的,并运用函数WaitForSingleObject()等待该事件被触发。ISR中通报内核触发相应的事件目标。Windows
Embedded CE 6.0的中止处理的进程如下图所示。

      RESET Button的IST和POWER Button的IST基本一致,所以那里只分析POWER
Button的IST,代码如下。      

882828九五至尊手机版 54

882828九五至尊手机版 55882828九五至尊手机版 56Code
882828九五至尊手机版 57static DWORD
882828九五至尊手机版 58PowerButtonIntrThread(PVOID pArg)
882828九五至尊手机版 59882828九五至尊手机版 60882828九五至尊手机版 61{
882828九五至尊手机版 62    //初阶化中断寄存器,使能相应的中断
882828九五至尊手机版 63    EnablePowerButtonInterrupt();
882828九五至尊手机版 64
882828九五至尊手机版 65    //创立一个风浪
882828九五至尊手机版 66    PwrButtonIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
882828九五至尊手机版 67
882828九五至尊手机版 68    //
882828九五至尊手机版 69    // 按照IRQ获取一个SYSINTR
882828九五至尊手机版 70    //
882828九五至尊手机版 71    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &PwrButtonIrq, sizeof PwrButtonIrq, &PwrButtonSysIntr, sizeof PwrButtonSysIntr, NULL))
882828九五至尊手机版 72882828九五至尊手机版 73    882828九五至尊手机版 74{
882828九五至尊手机版 75        RETAILMSG(1, (TEXT(“PBT: Error! Failed to request sysintr value for power button interrupt.\r\n”)));
882828九五至尊手机版 76        return(0);
882828九五至尊手机版 77    }
882828九五至尊手机版 78    
882828九五至尊手机版 79    //关联SYSINTR和事先创制的风云
882828九五至尊手机版 80    if (!(InterruptInitialize(PwrButtonSysIntr, PwrButtonIntrEvent, 0, 0)))
882828九五至尊手机版 81882828九五至尊手机版 82    882828九五至尊手机版 83{
882828九五至尊手机版 84        RETAILMSG(1, (TEXT(“ERROR: PwrButton: Interrupt initialize failed.\r\n”)));
882828九五至尊手机版 85    }
882828九五至尊手机版 86
882828九五至尊手机版 87    //POWER Button按下的处理程序
882828九五至尊手机版 88    for (;;)
882828九五至尊手机版 89882828九五至尊手机版 90    882828九五至尊手机版 91{
882828九五至尊手机版 92        WaitForSingleObject(PwrButtonIntrEvent, INFINITE);
882828九五至尊手机版 93        
882828九五至尊手机版 94        if (PowerButtonIsPushed()) //确认按键确实被按下,消除抖动
882828九五至尊手机版 95882828九五至尊手机版 96        882828九五至尊手机版 97{
882828九五至尊手机版 98            Sleep(200);         //延迟200ms,排除长按的气象
882828九五至尊手机版 99            if (!PowerButtonIsPushed())    //按键被有效释放
882828九五至尊手机版 100882828九五至尊手机版 101            882828九五至尊手机版 102{
882828九五至尊手机版 103                //
882828九五至尊手机版 104                //关闭系统 
882828九五至尊手机版 105                //
882828九五至尊手机版 106                if(pfnSetSystemPowerState != NULL)
882828九五至尊手机版 107882828九五至尊手机版 108                882828九五至尊手机版 109{
882828九五至尊手机版 110                    RETAILMSG(1,(TEXT(“PBT: Signalling power manager to suspend882828九五至尊手机版 111\r\n”)));
882828九五至尊手机版 112                    pfnSetSystemPowerState(NULL, POWER_STATE_SUSPEND, POWER_FORCE);
882828九五至尊手机版 113882828九五至尊手机版 114                } else 882828九五至尊手机版 115{
882828九五至尊手机版 116                    RETAILMSG(1,(TEXT(“PBT: Suspending by calling PowerOffSystem882828九五至尊手机版 117\r\n”)));
882828九五至尊手机版 118                    PowerOffSystem();
882828九五至尊手机版 119                }
882828九五至尊手机版 120                //
882828九五至尊手机版 121                //截止近期线程的时间片
882828九五至尊手机版 122                Sleep(0);
882828九五至尊手机版 123            }
882828九五至尊手机版 124            else
882828九五至尊手机版 125                RETAILMSG(1,(TEXT(“PBT: Button held too long (ignored)\r\n”)));
882828九五至尊手机版 126        }
882828九五至尊手机版 127        else
882828九五至尊手机版 128            RETAILMSG(1,(TEXT(“PBT: Feeble button press or noise triggered it (ignored)\r\n”)));
882828九五至尊手机版 129
882828九五至尊手机版 130        InterruptDone(PwrButtonSysIntr);
882828九五至尊手机版 131    }
882828九五至尊手机版 132}

                  图-1 Windows Embedded CE 6.0的间歇处理进度

    以上代码结构清晰,不再赘言。但如此编译出来的驱动是不可能因而驱动调试助手动态加载的,必须举办对应的改动才行。主要缘由是一向不善始善终,分配的系统逻辑中断没有自由,系统逻辑中断与事件的涉及也没有撤销。实验现象是,能经过驱动调试助手加载卸载,但停顿并无法正常办事了。上边介绍一下缓解这几个题材的法子。

    
可以见见,从表面中断爆发到IST运行,中间经历了多少个环节,每一个环节都有时光支出,有些日子是着力确定的,有些时间随系统的动静不一样而各异。但所有中断延迟主要可分为ISR延迟和IST延迟两局部,如图-2所示,t1为ISR延迟,t2为IST延迟。中断延迟的年华是衡量Windows
mbedded CE
6.0实时性的一个首要目的。那么哪些在大家系统的硬件平台上测得这么些中断延迟的具体值,从而进一步分析Windows
Embedded CE 6.0的实时品质或不能满足项目的实际选取须求。

  首先定义一个大局变量g_bThreadExit初步化为FALSE。IST修改后的代码如下:

882828九五至尊手机版 133

882828九五至尊手机版 134882828九五至尊手机版 135Code
882828九五至尊手机版 136static DWORD
882828九五至尊手机版 137PowerButtonIntrThread(PVOID pArg)
882828九五至尊手机版 138882828九五至尊手机版 139882828九五至尊手机版 140{
882828九五至尊手机版 141//开端化中断寄存器,使能相应的暂停
882828九五至尊手机版 142    EnablePowerButtonInterrupt();
882828九五至尊手机版 143
882828九五至尊手机版 144    //创立一个事件
882828九五至尊手机版 145    PwrButtonIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
882828九五至尊手机版 146
882828九五至尊手机版 147    //
882828九五至尊手机版 148    // 根据IRQ获取一个SYSINTR
882828九五至尊手机版 149    //
882828九五至尊手机版 150    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &PwrButtonIrq, sizeof PwrButtonIrq, &PwrButtonSysIntr, sizeof PwrButtonSysIntr, NULL))
882828九五至尊手机版 151882828九五至尊手机版 152    882828九五至尊手机版 153{
882828九五至尊手机版 154        RETAILMSG(1, (TEXT(“PBT: Error! Failed to request sysintr value for power button interrupt.\r\n”)));
882828九五至尊手机版 155        return(0);
882828九五至尊手机版 156    }
882828九五至尊手机版 157    
882828九五至尊手机版 158    //关联SYSINTR和事先创立的风云
882828九五至尊手机版 159    if (!(InterruptInitialize(PwrButtonSysIntr, PwrButtonIntrEvent, 0, 0)))
882828九五至尊手机版 160882828九五至尊手机版 161    882828九五至尊手机版 162{
882828九五至尊手机版 163        RETAILMSG(1, (TEXT(“ERROR: PwrButton: Interrupt initialize failed.\r\n”)));
882828九五至尊手机版 164    }
882828九五至尊手机版 165    
882828九五至尊手机版 166    // POWER Button按下的处理程序
882828九五至尊手机版 167    for (;;)
882828九五至尊手机版 168882828九五至尊手机版 169    882828九五至尊手机版 170{
882828九五至尊手机版 171        WaitForSingleObject(PwrButtonIntrEvent, INFINITE);
882828九五至尊手机版 172                
882828九五至尊手机版 173        if(g_bThreadExit)
882828九五至尊手机版 174882828九五至尊手机版 175        882828九五至尊手机版 176{
882828九五至尊手机版 177            break;    
882828九五至尊手机版 178        }
882828九五至尊手机版 179
882828九五至尊手机版 180        if (PowerButtonIsPushed())     //确认按键确实被按下,消除抖动
882828九五至尊手机版 181882828九五至尊手机版 182        882828九五至尊手机版 183{
882828九五至尊手机版 184            Sleep(200);         //延迟ms,排除长按的情形
882828九五至尊手机版 185            if (!PowerButtonIsPushed())    //按键被有效释放
882828九五至尊手机版 186882828九五至尊手机版 187            882828九五至尊手机版 188{
882828九五至尊手机版 189                //
882828九五至尊手机版 190                //关闭系统
882828九五至尊手机版 191                //
882828九五至尊手机版 192                if(pfnSetSystemPowerState != NULL)
882828九五至尊手机版 193882828九五至尊手机版 194                882828九五至尊手机版 195{
882828九五至尊手机版 196                    RETAILMSG(1,(TEXT(“PBT: Signalling power manager to suspend882828九五至尊手机版 197\r\n”)));
882828九五至尊手机版 198                    pfnSetSystemPowerState(NULL, POWER_STATE_SUSPEND, POWER_FORCE);
882828九五至尊手机版 199882828九五至尊手机版 200                } else 882828九五至尊手机版 201{
882828九五至尊手机版 202                    RETAILMSG(1,(TEXT(“PBT: Suspending by calling PowerOffSystem882828九五至尊手机版 203\r\n”)));
882828九五至尊手机版 204                    PowerOffSystem();
882828九五至尊手机版 205                }
882828九五至尊手机版 206                //
882828九五至尊手机版 207                //为止近年来线程的时间片
882828九五至尊手机版 208                //
882828九五至尊手机版 209                Sleep(0);
882828九五至尊手机版 210            }
882828九五至尊手机版 211            else
882828九五至尊手机版 212                RETAILMSG(1,(TEXT(“PBT: Button held too long (ignored)\r\n”)));
882828九五至尊手机版 213        }
882828九五至尊手机版 214        else
882828九五至尊手机版 215            RETAILMSG(1,(TEXT(“PBT: Feeble button press or noise triggered it (ignored)\r\n”)));
882828九五至尊手机版 216
882828九五至尊手机版 217        InterruptDone(PwrButtonSysIntr);
882828九五至尊手机版 218    }
882828九五至尊手机版 219    
882828九五至尊手机版 220    //撤除IRQ与SYSINTR之间的关联
882828九五至尊手机版 221    KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&PwrButtonSysIntr, sizeof(UINT32),NULL,0, NULL);
882828九五至尊手机版 222    
882828九五至尊手机版 223    //取消伊夫nt与PwrButtonSysIntr之间的涉嫌
882828九五至尊手机版 224    InterruptDisable(PwrButtonSysIntr);
882828九五至尊手机版 225
882828九五至尊手机版 226    CloseHandle(PwrButtonIntrEvent);
882828九五至尊手机版 227    
882828九五至尊手机版 228    RETAILMSG(1, (TEXT(“PowerButtonIntrThread Exit.\r\n”)));
882828九五至尊手机版 229    return 0;
882828九五至尊手机版 230}

        图-2 Windows Embedded CE 6.0的刹车延迟模型

  PBT_Deinit()修改后的代码如下:

     
那是刹车延迟的一个简便模型,t1是ISR延迟,t2是IST延迟,t1+t2即为中断延迟,大家须求测量和总计的就是那五个值。

882828九五至尊手机版 231882828九五至尊手机版 232Code
882828九五至尊手机版 233BOOL
882828九五至尊手机版 234PBT_Deinit(DWORD dwContext)
882828九五至尊手机版 235882828九五至尊手机版 236882828九五至尊手机版 237{
882828九五至尊手机版 238    RETAILMSG(1, (TEXT(“PBT: PBT_Deinit()\r\n”)));
882828九五至尊手机版 239    //设置退出线程的申明
882828九五至尊手机版 240g_bThreadExit = TRUE;
882828九五至尊手机版 241    //模拟一个停顿事件
882828九五至尊手机版 242SetInterruptEvent(PwrButtonSysIntr);
882828九五至尊手机版 243    //延迟500ms,确保IST退出
882828九五至尊手机版 244Sleep(500);
882828九五至尊手机版 245
882828九五至尊手机版 246    return (TRUE);
882828九五至尊手机版 247}

Windows Embedded CE
6.0提供了有些工具软件,用来测量中断延迟,如ILTiming.exe。它必要OAL的代码辅助,并且在定制系统时设置相应的编译属性,具体用法可参照Platform
Builder
6.0的拉扯。那里介绍一种借助硬件的测量方法,能在示波器上直观的观望中断延迟。

  经过以上修改,该中断驱动程序就足以由此驱动调试帮手动态加载和卸载,并能正常工作了。其它,在模拟器中出于尚未外部中断按键,可以透过创制一个特定称谓的事件与中断关联,并在其余一个施用或者驱动中装置该事件以模拟一个外部中断按键的触发,那种办法也可以在其实平巴尔的摩尔根据要求利用。示例代码如下:

据悉前文所述的刹车处理进程以及图-2所示的刹车延迟模型,可经过控制MCU的一个GPIO输出引脚来赞助测量t1和t2。具体方法如下:

882828九五至尊手机版 248882828九五至尊手机版 249Code
882828九五至尊手机版 250//打开与中断关联的风云
882828九五至尊手机版 251gIntrEvent = CreateEvent(NULL, FALSE, FALSE, _T(“PBTINTR”));
882828九五至尊手机版 252//设置该事件,模拟一个刹车的接触
882828九五至尊手机版 253SetEvent(gIntrEvent);
882828九五至尊手机版 254IST中开创与中断关联的轩然大波代码修改如下:
882828九五至尊手机版 255PwrButtonIntrEvent = CreateEvent(NULL, FALSE, FALSE, _T(“PBTINTR”));
882828九五至尊手机版 256

  1. 在OAL的OALIntrInit()函数中,设置某一GPIO为输出口,并使其出口高电平;

  2. 在ISR的OEMInterruptHandler()函数中,将该GPIO设置为低电平;

  3. 在IST的WaitForSingleObject()函数之后,将该GPIO设置为高电平;

  4. 当外部中断触发时,GPIO会先被ISR拉低,再被IST拉高;

  5. t1是表面中断下跌沿触发之后,GPIO保持高电平的日子;

  6. t2是GPIO保持低电平的时光;

  7. t1+t2≈中断延迟时间

  总的来说,WinCE中断处理进程结构清晰,方便开发人员灵活设计IST。在行使驱动调试帮手调试有关中断的驱动程序时,必要持久,否则相会世抛锚不可能健康干活的图景。

      实际利用的靶子平台运用的MCU是S3C2410,其设置GPIO的要紧代码如下。

//初步化GPIO,并安装为高

//设置GPE11为输出口

value = INREG32(&pOalPortRegs->GPECON);

OUTREG32(&pOalPortRegs->GPECON, (value & ~(3 << 22))|(1
<< 22));

//设置GPE11的IO状态为高

value = INREG32(&pOalPortRegs->GPEDAT);

OUTREG32(&pOalPortRegs->GPEDAT, (value |(1 << 11)));

在ISR中安装GPIO为低的代码如下。

//将GPE11置低

mask = INREG32(&g_pPortRegs->GPEDAT);

OUTREG32(&g_pPortRegs->GPEDAT, (mask & ~(1<<11)));

使得中的IST代码如下。

DWORD WINAPI IntrThreadProc(LPVOID ptr)

{

     while(bRun)

     {

           WaitForSingleObject(gIntrEvent, INFINITE);

           //将GPE11置高

          g_pIOPregs->GPEDAT |= (0x1 << 11);

          //RETAILMSG(1,(TEXT(“\r\nThread Run.”)));

          //Sleep(1000);

          InterruptDone(gSysIntr);

       }

       return 0;

}

     
已毕上述代码后,重新编译,并将操作系统下载到目标平台上。使用双通路的示波器测量中断触发引脚和GPIO的出口引脚,其中CH1测量GPIO的输出引脚,CH2测量外部中断引脚。

      在使用下跌沿触发中断时,中断信号和GPIO的出口信号如图-3所示。

882828九五至尊手机版 257

                              图-3 下跌沿触发时的骨子里波形

     
从上图可以看到,t1基本得以忽略不计,t2约为1.8ms,t1+t2不到2ms,表达此时的间歇延迟小于2ms。

在选择高电平中断,且IST中有出口调试信息时的波浪如图-4所示。

882828九五至尊手机版 258

                    图-4 高电平触发,IST中有延时的骨子里波形

     
从上图可以见到,t2的时日约为1.8ms,五回中断的日子距离约为3.8ms。中断延迟小于2ms。

在使用高电平中断,且IST中绝非出口调试信息时的波形如图-5所示。

882828九五至尊手机版 259

                   图-5 高电平触发,IST中无延时的莫过于波先生形

     从上图可以看到,t2的流年大体为18μ秒,t1能够认为小于4μ秒,五遍中断之间的岁月间隔为22μ秒,且可以接连稳定的没错响应。那表明Windows
Embedded CE
6.0基石的间歇延迟可达18μ秒。当然,大家很难按照四次测量的值来判定它的最低响应时限为多少,但飞秒的多少级可以验证Windows
Embedded CE 6.0的实时性基本得以知足广大的各个应用。

     须求专注的是,应用系列的实时性并不完全由操作系统的实时性决定,系统的硬件结构、软件驱动和应用程序等都会潜移默化到一切系统的实时性。其它,Windows
Embedded CE
6.0纵然是实时操作系统,但它也提供了非实时的做事条件,借使定制系统时添加了非实时的相干组件,也会潜移默化系统的实时性。

Platform Builder 6.0提供的Remote Kernel
Tracker工具,可以帮忙我们观望系统线程的施行意况。图-6和图-7所示是行使高电平触发,有1秒Sleep的状态截图,第二个框表示线程执行到Sleep(1000),第四个框表示等待事件被触发,藏灰色的虚线表示线程处于阻塞的情景。

882828九五至尊手机版 260

              图-6 高电平触发,IST中有延时的图景,Sleep(1000)

882828九五至尊手机版 261

                   图-7 高电平触发,IST中有延时的情事,等待事件的触发

      以上通过测量中断延迟时间,验证了Windows Embedded CE
6.0的实时性。当然,实时操作系统的概念严谨,判断一个操作系统是不是为实时操作系统,还有其余部分因素,如系统的暂停管理机制、线程管理机制、同步对象的支撑、内存的治本等等。

     
实际支付进度中,怎么着提升系统的实时性呢?在硬件平台、操作系统确定的前提下,大家还足以做哪些工作?通过前边的剖析和骨子里测量,可以通晓ISR的暂停延迟时间很短,也很难再决定。IST的推迟受系统线程调度的熏陶,有越来越控制的或许。

      Windows Embedded CE
6.0行使基于优先级的岁月片轮转算法对线程举办调度。对远在就绪态队列的线程,先分给优先级最高的线程以时日片,当时间片用完后,无论线程是不是进行完结,都退回就绪态队列中,等待下三遍的时日片分配。

     
所以,一方面,大家可以通过坚实中断线程的先行级以赢得更加多的施行机会。Windows
Embedded CE
6.0的线程有256个优先级(0~255),0的优先级最高,255的优先级最低。线程默许的事先级为251。WinCE中用来设置线程优先级的函数有三个。

CeSetThreadPriority(HANDLE hThread,int
nPriority):可以设置0~255的富有优先级

SetThreadPriority(HANDLE hThread,int
nPriority):只好设置8个低于的优先级(248~255)

     
为了减弱中断处理延迟,应拔取CeSetThreadPriority()设置更高的线程优先级。函数SetThreadPriority()日常在应用程序中用来安装工作线程的优先级。

     
另一方面,大家得以修改线程的年华片大小(线程额度),线程额度只会潜移默化平等优先级的线程调度。系统默许的线程额度是100ms。线程额度被设为0意味着线程将一向施行,直到被堵塞或者被更高优先级的围堵。修改线程额度有二种办法,可以在OAL的OEMInit()函数中安装dwDefaultThreadQuantum,那将修改系统默许的线程额度。也得以选用安装线程额度的函数CeSetThreadQuantum(HANDLE
hThread,DWORD
dwTime)来修改某一一定线程的线程额度。为了有限协助系统的实时性,dwDefaultThreadQuantum应该设定为一个正好的值。对实时性必要较高的暂停处理线程,可以独自将它的线程额度设为0。

     
以上二种艺术是比较方便的处理方式,即使利用了那二种方法后,系统的实时性依然无法满意必要,那么需求考虑其余的解决办法,首要有以下多少个:

  • 将暂停处理的要害部分放到ISR中,那是一种辛苦而又惊险的做法,困难是因为ISR中能调用的系统函数有限,危险意味着处理不当会导致系统品质急剧下跌。
  • 精益求精外部中断的触发机制,从硬件起头,如扩展硬件缓冲区,收缩单位时间内的中断响应次数,在IST中拍卖硬件缓冲区的数额,那种措施能大幅度增强系统的实时性。
  • 利用更高主频的MCU,进步总线访问速度。

     
同理可得,完结一个实时系统,须求从硬件、操作系统、驱动和应用程序等各地方考虑,依据使用的需求选用恰当的硬件、操作系统,在软件设计时也亟需随时考虑到实时性的必要。

Your Comments

近期评论

    功能


    网站地图xml地图