侵权投诉
订阅
纠错
加入自媒体

μC/OS—II的嵌入式串口通信模块设计

2011-01-12 16:02
冷血の爱
关注

  在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但μC/OS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式Linux)那样提供给用户一些API函数接口。在μC/OS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成。串口通信是单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代表性的中断驱动外设。本文以单片机中的串口为例,介绍μC/OS—II下编写中断服务程序以及外设驅动程序的一般思路。

  1 μC/OS-II的中断处理及51系列单片机中断系统分析

  μC/OS-II中断服务程序(ISR)一般用汇编语言编写。以下是中断服务程序的步骤。

  保存全部CPU寄存器;调用OSIntEnter()或OSIntNesting(全局变量)直接加1;

  执行用户代码做中断服务;

  调用0SIntExit();

  恢复所有CPU寄存器;

  执行中断返回指令。

  μC/OS-II提供两个ISR与内核接口函数;OSIntEnter()和OSIntExit()。OSIntEnter()通知μC/OS—II核,中断服务程序开始了。事实上,此函数做的工作是把一个全局变量OSIntNesting加1,此中断嵌套计数器可以确保所有中断处理完成后再做任务调度。另一个接口函数OSIntExit()则通知内核,中断服务已结束。根据相应情况,退回被中断点(可能是一个任务或者是被嵌套的中断服务程序)或由内核作任务调度。

  用户编写的ISR必须被安装到某一位置,以便中断发生后,CPU根据相应的中断号运行准确的服务程序。许多实时操作系统都提供了安装和卸载中断服务程序的API接口函数,但μC/OS—II内核没有提供类似的接口函数,需要用户在对CPU的移植中自己实现。这些接口函数与具体的硬件环境有关,接下来以51单片机下的中断处理对此详细说明。

  51单片机的中断基本过程如下:CPU在每个机器周期的S5P2时刻采样中断标志,而在下一指令周期将对采样的中断进行查询。如果有中断请求,则按照优先级高低的原则进行处理。响应中断时,先置相应的优先级激活触发器于相应位,封锁同级或低级中断,然后根据中断源类别,在硬件控制下,将中断地址压入堆栈,并转向相应的中断向量入口单元。通常在入口单元处放一跳转指令,转向执行中断服务程序.当执行中断返回指令RETI时,把响应中断时所置位的优先级激活触发器清零后,从堆栈中弹

  出被保护的断点地址,装入程序计数器PC,CPU返回原来被中断处继续执行程序。

  在移植的过程中,采用Keil C51作为编译环境。KeilC5l集成C编译和汇编器。中断子程序用汇编语言编写,放到移植μC/0S—II后的OS_CPU_A.ASM汇编文件中。下面是以串行口中断为例的移植中断服务子程序代码。

  CSEGAT0023H ;串口中断响应入口地址

  LJMPSerialISR;转移到串口中断子程序入口地址

  RSEG?PR?SeriallSR?OS_CPU_A

  SerialISR:

  USINGO

  CLR EA ;先关中断,以防中断嵌套

  PUSHALL ;已定义的压栈宏,用于将

  ;CPU寄存器的值压入堆栈

  LCALL_?OSIntEnter ;监视中断嵌套

  LCALL_?Serial ;串口中断服务程序

  LCALL_?OSintExlt

  SETBEA

  POPALL;已定义的出栈宏,将CPU寄存器的值出栈

  RETI

1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号