资源描述:
《uos——ⅱ的嵌入式串口通信模块设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、µ//)*""的嵌入式串口通信模块设计□河南农业大学姚传安在嵌入式应用中,使用RTOS的主要原因是为了提恢复所有CPU寄存器;高系统的可靠性,其次是提高开发效率、缩短开发周期。执行中断返回指令。/OSII是一个免费的、源代码公开的占先式实时多任/OSII提供两个ISR与内核接口函数:OSIntEn-µCµC务内核,使用对象是嵌入式系统,对源代码适当裁减,很容ter()和OSIntExit()。OSIntEnter()通知µC/OSII内易移植到8~32位不同框架的微处理器上。但/OS核,中断服务程序开始了。事实上,此
2、函数做的工作是把µCII仅是一个实时内核,它不像其他实时操作系统(如嵌入一个全局变量OSIntNesting加1,此中断嵌套计数器可以式Linux)那样提供给用户一些API函数接口。在/OS确保所有中断处理完成后再做任务调度。另一个接口函µCII实时内核下,对外设的访问接口没有统一完善,有很数OSIntExit()则通知内核,中断服务已结束。根据相应多工作需要用户自己去完成。串口通信是单片机测控系情况,退回被中断点(可能是一个任务或者是被嵌套的中统的重要组成部分,异步串行口是一个比较简单又很具代断服务程序)或由内核作
3、任务调度。表性的中断驱动外设。本文以单片机中的串口为例,介绍用户编写的ISR必须被安装到某一位置,以便中断发/OSII下编写中断服务程序以及外设驱动程序的一生后,CPU根据相应的中断号运行准确的服务程序。许µC般思路。多实时操作系统都提供了安装和卸载中断服务程序的API接口函数,但µC/OSII内核没有提供类似的接口函1!C/OSII的中断处理及51系列单片机数,需要用户在对CPU的移植中自己实现。这些接口函中断系统分析数与具体的硬件环境有关,接下来以51单片机下的中断/OSII中断服务程序(ISR)一般用汇编语言编
4、处理对此详细说明。µC写。以下是中断服务程序的步骤。5l单片机的中断基本过程如下:CPU在每个机器周保存全部CPU寄存器;期的S5P2时刻采样中断标志,而在下一指令周期将对采调用OSIntEnter()或OSIntNesting(全局变量)直接样的中断进行查询。如果有中断请求,则按照优先级高低加1;的原则进行处理。响应中断时,先置相应的优先级激活触执行用户代码做中断服务;发器于相应位,封锁同级或低级中断,然后根据中断源类调用OSIntExit();别,在硬件控制下,将中断地址压入堆栈,并转向相应的中列的消息存放位置将
5、会重叠前一条消息(uC/OSII中不统SmallRT0S51原理与应用》一书的作者陈明计先生就存在此问题)。也就是说,首先进入队列的那条消息被覆此问题通过E_mail进行过讨论。他指出:“V1.12.1的版盖掉了,而谁也不知道它曾经存在过。本确实有此问题,但在V1.20的版本中不会(尽管代码相同样的问题也会发生在互斥型信号量的操作中,感兴似)”。只是笔者在看过V1.20版本后觉得,只有当任务趣的读者可以参看相关代码分析。IDX优先级较高时,才有可能不发生此类错误,否则就很难保证了。不知广大爱好者有何见解,希望能与您共
6、同探讨,结语请发E_mial到nt_chen2163.net或投稿到本刊。需说明一点,以上分析仅仅针对SmallRTOS51陈皓:硕士研究生,主要研究方向为嵌入式系统与数字信号处理。(收稿日期:2005-03-07)(V1.12.1)。在本文发表前,本人曾与《嵌入式实时操作系722005.7断向量入口单元。通常在入口单元处放一跳转指令,转向提供了超时等待机制,串口当然也具有超时读写能力。执行中断服务程序。当执行中断返回指令RETI时,把响图1是带缓冲区和信号量的串口接收示意图。数据应中断时所置位的优先级激活触发器清零
7、后,从堆栈中弹接收信号量初始化为0,表示在环形缓冲区中无数据。出被保护的断点地址,装入程序计数器PC,CPU返回原来被中断处继续执行程序。在移植的过程中,采用KeilC51作为编译环境。KeilC51集成C编译和汇编器。中断子程序用汇编语言编写,放到移植/OSII后的OS_CPU_A.ASM汇编文件µC中。下面是以串行口中断为例的移植中断服务子程序代码。CSEGAT0023H;串口中断响应入口地址图1带环形缓冲区和超时信号量的串口接收示意图LJMPSerialISR;转移到串口中断子程序入口地址RSEG?PR?Ser
8、ialISR?OS_CPU_A接收中断到来后,ISR从UART的接收缓冲器SBUFSerialISR:中读入接收的字节(②),放入接收缓冲区(③),然后通过USING0接收信号量唤醒用户任务端的读操作(④、①)。在整个过CLREA;先关中断,以防中断嵌套程中,可以查询记录缓冲区中当前字节数的变量值,此变PUSHALL;已定义的压栈宏,用于将量表