0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Keil C51软件中51单片机的中断服务和外设驱动程序的开发

电子设计 来源:电子工程网 作者:伍文辉 2020-09-24 09:47 次阅读

嵌入式应用中,使用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汇编文件中。下面是以串行口中断为例的移植中断服务子程序代码

在Keil C51软件中51单片机的中断服务和外设驱动程序的开发

2 串口驱动程序

笔者已在5l单片机上成功移植了μC/0S-II内核,移植过程在此不再讨论。这里重点分析μC/0S—II内核下串口驱动程序编写。

由于串行设备存在外设处理速度和CPU速度不匹配的问题,所以需要一个缓冲区.向串口发送数据时,只要把数据写到缓冲区中,然后由串口逐个取出往外发。从串口接收数据时,往往等收到若干个字节后才需要CPU进行处理,所以这些预收的数据可以先存于缓冲区中。实际上,单片机的异步串口中只有两个相互独立、地址相同的接收、发送缓冲寄存器SBUF。在实际应用中,需要从内存中开辟两个缓冲区,分别为接收缓冲区和发送缓冲区。这里把缓冲区定义为环形队列的数据结构。

μC/OS-II内核提供了信号量作为通信和同步的机制,引入数据接收信号量、数据发送信号量分别对缓冲区两端的操作进行同步。串口的操作模式如下:用户任务想写,但缓冲区满时,在信号量上睡眠,让CPU运行别的任务,待ISR从缓冲区读走数据后唤醒此睡眠的任务;同样,用户任务想读,但缓冲区空时,也可以在信号量上睡眠,待外部设备有数据来了再唤醒。由于μC/OS-II的信号量提供了超时等待机制,串口当然也具有超时读写能力。

数据接收信号量初始化为0,表示在环形缓冲区中无数据。

接收中断到来后,ISR从UART的接收缓冲器SBUF中读入接收的字节(②),放入接收缓冲区(③),然后通过接收信号量唤醒用户任务端的读操作(④、①)。在整个过程中,可以查询记录缓冲区中当前字节数的变量值,此变量表明接收缓冲区是否已满。UART收到数据并触发了接收中断,但如果此时缓冲区是满的,那么放弃收到的字符。缓冲区的大小应合理设置,降低数据丢失的可能性,又要避免存储空间的浪费。

发送信号量初始值设为发送缓冲区的大小,表示缓冲区已空,并且关闭发送中断。发送数据时,用户任务在信号量上等待(①)。如果发送缓冲区未满,用户任务向发送缓冲区中写入数据(②)。如果写入的是发送缓冲区中的第一个字节,则允许发送中断(②)。然后,发送ISR从发送缓冲区中取出最早写入的字节输出至UART(④),这个操作又触发了下一次的发送中断,如此循环直到发送缓冲区中最后一个字节被取走,重新关闭发送中断。在ISR向UART输出的同时,给信号量发信号(⑤),发送任务据此信号量计数值来了解发送缓冲区中是否有空间。

3 串口通信模块的设计

每个串行端口有两个环状队列缓冲区,同时有两个信号量:一个用来指示接收字节,另一个用来指示发送字节。每个环状缓冲区有以下四个要素:

◇存储数据(INT8U数组);

◇包含环状缓冲区字节数的计数器;

◇环状缓冲区中指向将被放置的下一字节的指针;

◇环状缓冲区中指向被取出的下一字节的指针。

SerialGetehar()用来获取接收到的数据,如果缓冲区已空时将任务挂起,接收到字节时,任务将被唤醒,同时从串行口接收字节。SerialPutRxChar()用来将接收的字节放到缓冲区中,如果接收缓冲区已满,则该字节被丢弃。当字节插入到缓冲区中,SerialPutRxChar()通知数据接收信号量,使之将数据己到的消息传达给所有等待的任务。为防止挂起应用任务,可以通过调用SceiallsEmPty()去发现环状队列中是否有字节。

当需要发送数据给串行端口时,SerialPurChar()等待信号量在初始化发送信号量时应该初始为缓冲区的大小。因此,当缓冲区中没有更多空间时,SerialPutChar()就挂起任务,只要UART再次发送字节,挂起任务就将恢复。SerialGctChar()被中断服务程序调用,如果发送缓冲区至少还有一个字节,Seri-a1GetChar()就返回一个从缓冲区发送的字节。如果缓冲区己空,则SerialGetChar()返回Null,这将使调用停止进一步的发送中断,一直到有数据发送为止。

4 异步串行通信的接口函数

应用任务可以通过如下的几个函数来控制和访问UART:SerialCfgPort()、SerialGetChar()、SerialInit()、SerialIsEmpty()、SerialIsFull()和SerialPutChar()。

SerialCfgPort()用于建立串行端口的特征,在为指定端口调用其他服务前,必须先调用该函数,包括确定波特率、比特数、奇偶校验和停止位等。

SerialGetChar()使应用程序从接收数据的环状缓冲区中取出数据。

SerialInit()用于初始化整个串口软件模块,且必须在该模块提供的其他任何服务前调用。SeriallInit()将环状缓冲区计数器的字节数清零,并初始化每个环状缓冲区的IN和OUT指针,指向数据存储区的开始处。数据接收信号量初始化为0,表示在环状缓冲区无数据。用传送缓冲区大小初始化数据传送信号量,表示缓冲区已空。

SerialIsEmpty()允许应用程序确定是否有字节从串口接收进来。本函数允许在无数据时避免将任务挂起。

SerialIsFull()允许应用程序确定传送环状缓冲区的状态,本函数可以在缓冲区已满时避免将任务挂起。

SerialPutChar()允许应用程序向一个串行端口发送数据。

结 语

该串口通信模块充分利用了实时内核的任务调度功能和信号量机制,系统软件模块化,可读性增强,便于修改和移植,其设计思路和方法可以很好的应用在多种情况下的测控系统中,系统的扩展方便,具有一定的借鉴作用。该串口通信模块已作为某铁路供水远程控制终端的一部分,运行稳定,提高了整个系统的运行效率和实时性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6030

    文章

    44482

    浏览量

    631707
  • 寄存器
    +关注

    关注

    31

    文章

    5282

    浏览量

    119760
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10794

    浏览量

    210698
收藏 人收藏

    评论

    相关推荐

    Keil C51单片机/arm开发工具 V8.02

    Keil C51单片机/arm开发工具 V8.02 :使用方法:双击c51v802.exe直接安装直到结束,安装路径最好选用默认的
    发表于 08-06 08:59 58次下载

    Keil C51使用详解

    Keil C51使用详解Keil C51 是美国Keil Software 公司出品的51 系列
    发表于 03-09 14:48 85次下载

    Keil C51使用详解教程

    Keil C51使用详解教程 第一章 Keil C51开发系统基本知识... 6第一节 系统概述... 6第二节
    发表于 03-29 14:06 280次下载

    Keil C51单片机开发心得简介

    Keil C51单片机开发心得简介   用KeilC51
    发表于 04-19 10:25 3531次阅读
    <b class='flag-5'>Keil</b> <b class='flag-5'>C51</b><b class='flag-5'>单片机</b><b class='flag-5'>开发</b>心得简介

    C51单片机相关的LCD驱动程序源代码

    C51单片机相关的LCD驱动程序源代码,可供参考调试
    发表于 02-22 18:14 19次下载

    单片机开发软件Keil C51使用步骤详细介绍

    单片机开发软件Keil C51使用步骤详细介绍
    发表于 12-19 15:40 7次下载

    Keil C51教程之Keil C51入门使用教程详细图解免费下载

    keil uvision2 C51软件是目前功能最强大的单片机c语言集成开发环境。 下面我们通
    发表于 09-17 08:00 32次下载
    <b class='flag-5'>Keil</b> <b class='flag-5'>C51</b>教程之<b class='flag-5'>Keil</b> <b class='flag-5'>C51</b>入门使用教程详细图解免费下载

    C51单片机开发工具Keil.UV4应用程序免费下载

    本文档的主要内容详细介绍的是C51单片机开发工具Keil.UV4 Keil.C51.V9.01应用程序
    发表于 10-31 08:00 42次下载

    Keil C51的链接驱动程序应用程序免费下载

    本文档的主要内容详细介绍的是Keil C51的链接驱动程序应用程序免费下载。
    发表于 04-04 16:40 5次下载
    <b class='flag-5'>Keil</b> <b class='flag-5'>C51</b>的链接<b class='flag-5'>驱动程序</b>应用<b class='flag-5'>程序</b>免费下载

    Keil C51单片机开发入门(第一个程序

    Keil C51单片机开发入门(第一个程序
    发表于 11-13 15:21 11次下载
    <b class='flag-5'>Keil</b> <b class='flag-5'>C51</b>与<b class='flag-5'>单片机</b><b class='flag-5'>开发</b>入门(第一个<b class='flag-5'>程序</b>)

    【转载】配置Keil C51配置开发 STC51单片机过程

    内容1. Keil C51 下载2. 配置开发STC51单片机配置 Keil IDE与TEASO
    发表于 11-13 16:51 21次下载
    【转载】配置<b class='flag-5'>Keil</b> <b class='flag-5'>C51</b>配置<b class='flag-5'>开发</b> STC<b class='flag-5'>51</b><b class='flag-5'>单片机</b>过程

    单片机C51和stem32程序编译与仿真操作

    建立工程,并选好器件仿真二. MDK开发环境下stm32程序编译1. keil5 开发软件里创建工程文件2. 对
    发表于 11-19 10:36 2次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>C51</b>和stem32<b class='flag-5'>程序</b>编译与仿真操作

    Keil C51软件的使用

    Keil C51集成开发环境是基于80C51内核的微处理器软件开发平台,用户可以集成
    发表于 11-21 14:21 16次下载
    <b class='flag-5'>Keil</b> <b class='flag-5'>C51</b><b class='flag-5'>软件</b>的使用

    Keil C51与STC-ISP安装

    就两个步骤,程序代码的编写与程序的烧录(将单片机程序写入开发板的ROM),分别在以下两款
    发表于 11-21 16:06 4次下载
    <b class='flag-5'>Keil</b> <b class='flag-5'>C51</b>与STC-ISP安装

    单片机软件安装Keil C51

    。三、pojie右键单击,以管理员身份运行Keil,打开File→License Management,复制CID,打开crack注册,……四、添加STC库打开STC-ISP将STC系列单片机的数据库添加到
    发表于 11-23 16:51 24次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>软件</b>安装<b class='flag-5'>Keil</b> <b class='flag-5'>C51</b>