版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VC下时钟的获得嵌入式实时操作系统uC/OS-II这本书已经安排了大量篇幅来专门讲解uC/OS-II的移植:第13章移植uC/OS-II,第14章uC/OS-II在80 x86上的移植,第15章uC/OS-II在带有硬件浮点运算单元的80 x86上的移植。所以本文只是重点讲解移植到VC下和其他处理器上的不同地方,更详细的介绍读者可以参考嵌入式实时操作系统uC/OS-II这本书。和所有其他的移植一样,本文所做的移植也只需要修改uC/OS-II处理器相关代码,一共包括3个文件:OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C。考虑到VC可以嵌入汇编代码,并不需要专门的汇编代码文件,
2、所以OS_CPU_A.ASM是多余的,最终只有OS_CPU.H和OS_CPU_C.C两个文件。所以这两个文件成了移植的关键,首先要解决的问题就是时钟“滴答”的获得。移植到BC下的uC/OS-II是通过修改DOS下的硬件时钟中断来得到时钟滴答的,VC下时钟滴答从哪里来呢?这是移植uC/OS-II到VC下第一个要考虑的问题。在windows的保护模式下不能像DOS下面那么容易,直接通过一个函数调用就能够修改中断。windows下要修改中断涉及到驱动程序,这样就加大了移植的困难度与复杂度,但好处是只有真正硬件时钟的“滴答”才能够保证uC/OS-II的实时性。另外一种解决方法是采用windows下的软
3、件定时器,通过定时器来产生模拟时钟“滴答”。考虑到本移植只是为了教学和学习,并没有应用到对实时性要求高的产品,所以最终决定采用软件定时器来模拟时钟中断。Windows下软件定时器种类很多,下面分别简要介绍一下这些定时器:l.SetTimer()函数有windows下编程经验的最先想到的应该是SetTimer这个API函数,但本文采用的移植程序是基于控制台的,也就是说最开始建立VC工程的时候选择的是创建win32consoleapplication,控制台下的程序是没有消息循环的,所以要使用SetTimer函数则必须再创建一个线程来专门处理消息循环,这样一来事情就复杂了,而且这个函数定时精度非常
4、不高。所以这种方法不是特别合适。timeSetEvent()函数这个函数很简单,不需要消息循环,定时精度为ms级,主要应用在多媒体定时方面,能够在非常精确的时间间隔内完成一个事件、函数或过程的调用。函数原型:MMRESULTtimeSetEvent(UINTuDelay,UINTuResolution,LPTIMECALLBACKlpTimeProc,WORDdwUser,UINTfuEvent),可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc回调函数中,从而完成所需处理的事件。调用这个函数后会增加一个线程,时间一到则在这个线程中调用回调函数,对
5、于主线程来说,非常类似外部中断调用,我们需要的正是这样的效果,所以本文最终选择这个函数来产生时钟“滴答”。QueryPerformanceFrequency()和QueryPerformanceCounter()函数这两个函数可以实现更高精度的定时,误差不超过1微秒,进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率,然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。可见,这两个函数主要是应用在计算时间方面,并没有设置回调函
6、数机制,如果我们要使用这个函数的话,则需要首先创建一个线程,然后在这个线程中计算时间调用我们要定时处理的函数,等于需要手动实现定时函数回调机制,远比timeSetEvent()函数来得复杂。当然还有更多的定时器函数,这里不一一介绍,读者可以自行参考相关书籍。本文选择的是timeSetEvent函数,调用这个函数后uC/OS-II就已经开始它的脉搏了。模拟时钟中断的产生中断指的是中止当前的事务,处理别的更要紧的事情。我们通过软件定时器来模拟产生uC/OS-II的时钟中断,但timeSetEvent()函数调用定时回调函数是和主线程同时被windows操作系统调度的,并没有起到中断的作用。所以在调
7、用定时回调函数的时候必须停止主线程的运行,退出回调函数则恢复主线程的运行,自然这些事情可以都放在定时回调函数,也就是uC/OS-II的时钟中断处理函数中完成。Windows下要挂起一个线程的运行,首先要得到这个线程的句柄,然后调用SuspendThread(hangdler)和ResumeThread(handler)就可以挂起和继续执行线程。如图1所示。时钟中断处理函数,此程运行函数挂起主线程图1模拟中断在我们的程序中刚开始只有一个线程,调用timeSetEvent则产生了定时器线程,定时器线程会按我们预定的时间周期调用uC/OS-II的中断处理函数OSTickISR,如果uC/OS-II没
8、有屏蔽中断,OSTickISR则挂起主线程,然后才做它改做的事情:调度任务执行。在main函数的的OSInit()前,我们加入了一个VCInit()函数,主要初始化VC环境,包括获得主线程的句柄,设置上下文环境标志位,特别要注意的是,句柄的获得是要通过伪句柄转换的,如程序清单L1所示程序清单初始化环境在此加入我们的函数初始化安装的任务切换向量作为起始任务创建用户起始任务(为了/方便讨论,这里以;开始多任务调度/增加的全局变量:主线程句柄增加的全局变量:主线程切换上下文得到当前进程句柄得到当前线程伪句柄伪句柄转换得到线程真句柄时钟中断处理子程序OSTicklSR将在调用timeSetEvent后
9、,被定时器线程周期调用,其代码如程序清单L2所示亍口、士亠程序清单时2钟节拍通过一个全局变量表示是否屏/蔽/中断如果当前中断被屏蔽则返回/中止主线程的运行,模拟中断产生但没有保存寄存器得到主线程上下文,为切换任务做准备保存当前内部定时OSIntExit();由/于/不能使用中断返回指令,所以此函数是要返回的模拟中断返回,主线程得以继续执行开关中断我们通过设置一个全局变量来解决,代码如下:#defineOS_ENTER_CRITICAL()FlagEn=0/禁止定时器调度#defineOS_EXIT_CRITICAL()FlagEn=1/容许定时器调度因此在中断处理程序中首先判断当前是否容许中断
10、,如果容许才挂起主线程,模拟中断产生,完成进一步的工作。3任务切换任务切换,其实做的是任务的上下文切换,在其他上非常容易分辨出任务的上下文,一般就是上的相应寄存器,那么在下呢?从简单考虑,我们选择了不带浮点运算的上下文环境,因此任务的上下文和在上移植的上下文很相近,不同点只是段寄存器不用保存,因为在下任务其实只是在同一个线程中切换,而且在保护模式下段寄存器的概念已变,其值在同一个线程中是不会变的。任务切换压栈时如图2所示模拟pushad模拟pushfd保存任务切换地址任务参数地址低端地址高端地址子程序是从当前的esp4处取得的传入参数,所以要空出4个字节图2任务切换压栈后状态手动任务切换代码如程序清单所示,主要涉及中嵌入汇编的编写,请读者自行分析程序清单手动任务切换voidOSCtxSw(void)asmleaeax,nextstart;任务切换回来后从nextstart开始pusheaxpushfd;标志寄存器的值pushad;保存EAX-EDImovebx,OSTCBCurmovebx,esp;把堆栈入口的地址保存到当前TCB结构中OSTaskSwHook();OSTCBCur=OSTCBHighRdy;OSPrioCur=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苏教版四年级数学上册期中检测卷附答案(二)
- 无锡江阴AI课堂实践
- 饲料-维生素的营养作用考核试题及答案
- 2026教科书插图面试题及答案
- “学规程、学规范、遵规程、抓质量、保安全”主题活动考试复习题
- 数学七年级上册压轴解答题专题练习
- 跨境支付+智能无人系统:全球化运营的资金流转效率与汇率风险管理
- 暑期托管班心得体会
- 口腔护士证试题及答案大全
- 搬运法考试题及答案
- 《2026年》银行中层岗位竞聘高频面试题包含详细解答
- 雨课堂学堂在线学堂云《情报检索-信息时代的元素养》单元测试考核答案
- 拆迁信访应急预案
- 2025广东中山市三乡镇人民政府招聘聘用人员(屠宰检疫员)9人备考题库及答案解析
- 化验室气瓶安全知识培训课件
- 口腔神经阻滞麻醉
- 月子中心消防管理制度
- 2025-2030中国财务公司行业深度分析及发展前景与发展战略研究报告
- 脯氨酸恒格列净片-药品临床应用解读
- 煤矿智能化开采技术实习报告范文
- 血栓患者护理
评论
0/150
提交评论