基于μC/OS-II的CAN总线驱动程序设计

发布者:温暖心绪最新更新时间:2010-10-20 来源: 微计算机信息 关键字:μC/OS-II  CAN总线  数据采集  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

  引言

  应用实时多任务操作系统(RTOS)作为嵌入式设计的基础和开发平台将成为嵌入式应用设计的主流。μC/OS-II是一种源码公开、可移植性、可固化、可裁剪、占先式的实时多任务操作系统,目前已经得到广泛的应用。

  在为电力系统接地选线装置开发的数据采集监测系统的设计中,笔者设计了集散式的数据采集结构,灵活的组态适应了目前国内多数中低压输配电网的数据采集需求。在此硬件平台上,笔者将实时操作系统μC/OS-II移植到TMS320LF2407A型号的DSP上,实现了多任务的并行执行,系统的可靠性和实时性得到大幅提升;设计了CAN总线驱动程序,使得下位采集处理模块与上位的主控制器具备了可靠快速的通信功能和协调功能。

  1.集散式的数据采集系统设计

  系统的整体结构如图1所示:

图1集散式选线系统整体结构

  图中反映出目前变电站常见的网络结构。一般的基于集中式数据采集方式在应用上存在一定的缺点,比如针对不同变电站实际情况配置不够灵活等。而基于集散式的数据采集系统却具有系统适应能力强,组态方便,可靠性高等优点。因此,根据变电站网络的这种结构,本装置设计采用集散式数据采集的方式,即在每条支路上均挂接一个独立的智能数据采集及处理模块负责实时采集和数据预处理;主控制器与各智能采集处理模块通过CAN现场总线进行通讯,从而不仅实现主控的功能,还具备灵活的集散扩充性能。

  2.CAN总线接口的设计

  在各种现场总线网络中,最早为汽车电子设备互连而开发的CAN总线由于其简单灵活的配置以及强大的实时控制和检错纠错能力而在诸多自动化领域中得到了广泛的使用。
美国TI公司DSP产品线中的2000系列是专为工业控制应用设计的数字信号处理器,具有强大的数字信号处理能力,还集成了丰富的外设和I/O,成为现代电机控制、电力系统自动化等应用中很好选择。在这款DSP处理器上,自带了兼容CAN2.0B标准的CAN总线控制器,因此只需外接一片CAN总线收发芯片即可使模块具有完整的CAN总线通信能力,在此使用支持1Mbps的PCA82C250收发器芯片,接口设计见图2。

图2采集模块CAN总线接口

  3.μC/OS-II在2407上的移植

  绝大部分μC/OS-II的源码是用移植性很强的ANSIC写的,只有和微处理器硬件相关的那部分是用汇编语言写的。而TI公司提供的编译器CodeComposerStudio(C2000)V2.20支持C语言和汇编语言开发,笔者在此编译器的基础上完成了μC/OS-II的移植。移植工作主要集中在三个文件的修改工作:修改头文件OS_CPU.H相关的内容,包括:数据类型定义、堆栈增长方向、中断相关的一些宏定义等;OS_CPU_C.C中编写任务堆栈初始化函数及系统HOOK函;OS_CPU_A.ASM中编写四个汇编语言函数:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw()和OsTickISR()。
具体移植过程由于不是本文重点,恕笔者不再详述。

  4.基于缓冲队列支持下的CAN总线驱动程序设计

  驱动程序是连接底层的硬件和上层的API函数的纽带,有了驱动程序模块,就可以把操作系统的API函数和底层的硬件分开来。任何一个硬件的改变、删除或者添加,只需要随之改变、删除或者添加提供给操作系统的相应的驱动程序就可以了,并不会影响到API函数的功能,更不会影响到用户的应用程序。同时,为了保证在实时多任务操作系统中,对硬件访问的唯一性,系统的驱动程序要受控于相应的操作系统的多任务之间的同步机制。

  (1)μC/OS-II的通信机制

  μC/OS-II在处理任务之间的通信和同步的时候,主要通过以下几种方式:信号量(Semaphore),邮箱(Mailbox),消息队列(Queue)和互斥信号量(Mutex)。具体的通过事件控制块(ECB)来实现。μC/OS-II中定义的数据结构OS_EVENT能够维护任务间通信和同步的所有信息,该数据结构不仅包含了事件本身的定义,如信号量的计数器、指向邮箱的指针、指向消息队列的指针数组、互斥量中能否获得资源的Flag和正在使用该互斥量的任务,还定义了等待该事件的所有任务列表。事件发生后,等待的优先级最高的任务进入就绪态。

  (2)缓冲队列的设计和通信任务的配合

  在微机系统中,一般串行设备或者其他字符型设备都存在外设处理速度和CPU速度不匹配的问题,所以需要建立相应的缓冲区。向CAN口发送数据时,只要把数据写到缓冲区,然后由CAN控制器逐个取出往外发送。从CAN口接收数据时,往往等收到若干个字节后才需要CPU进行处理,所以这些预收的数据可以先存在缓冲区。缓冲区可以设置收到若干个字节后再中断CPU,这样就避免了因为CPU的频繁中断而降低系统的实时性。

   在对缓冲区读写的过程中,经常会遇到想发送数据的时候,缓冲区已满;想去读的时候,接受缓冲却是空的。对于用户程序端,采用传统的查询工作方式,频繁的读取使得程序效率大为降低。如果引入读、写两个信号量分别对缓冲区两端的操作进行同步,问题自然解决:用户任务想写但缓冲区满时,在信号量上休眠,让CPU运行别的任务,待ISR从缓冲区读走数据后唤醒这个休眠的任务;类似的,用户任务想读但缓冲区空时,也可以在信号量上休眠,待外部设备有数据来了再唤醒。其中,μC/OS-II的信号量提供了超时等待机制,CAN端口本身也有超时读写能力。

  接受和发送的数据缓冲区数据结构定义如下:

typedefstruct{
INT16UBufRxCtr;//接受缓冲中的字符的数目
OS_EVENTBufRxSem;//接受信号量
INT8UBufRxInPtr;//接收缓冲中下一个字符的写入位置
INT8UBufRxOutPtr;//接收缓冲中下一个待读出字符的位置
INT8UBufRx[CAN_BUF_SIZE];//接收环形缓冲区的大小
INT16UBufTxCtr;//发送缓冲中字符的数目
OS_EVENTBufTxSem;//发送信号量
INT8UBufTxInPtr;//发送缓冲中下一个字符的写入位置
INT8UBufTxOutPtr;//发送缓冲中下一个待读出字符的位置
INT8UBufTx[CAN_BUF_SIZE];//发送环形缓冲区的大小
}CAN_BUF;

  其他接口函数如下:

  VoidCanInitHW();//设置CAN控制器端口中断向量
VoidCANSendMsg();//向CAN控制器端口发送数据
VoidCANReceiveMsg();//从CAN控制器端口接受数据

图3基于缓冲队列的CAN通信过程

  基于缓冲队列支持下的CAN通信任务通信过程如图3所示。
在该通信任务中,采用查询方式发送,中断方式接收,任何时候只要没有关中断,中断任务的优先级高于其他任何任务。可以说,该任务是“基于中断响应”的。这样处理的好处是能够最大的保证了通信的实时性,同时也使得系统资源的利用率大大提高(相比于收发都采用查询的方式)。任务间的通信和同步通过邮箱和信号量机制进行。

  当用户应用程序(或任务)要求进行远程CAN通信的时候,应用程序(或任务)先要获得BufTxSem并向发送缓冲区BufTx装入报文,写入缓冲区结束后释放信号量BufTxSem,通过邮箱通知CAN通信任务处理报文并完成报文的发送。

  当总线发来报文时,接受节点的CAN控制器会产生一个接收中断,当前运行任务被挂起,CAN通信任务被激活并抢占运行,获取信号量BufRxSem,然后从总线上读取报文并写入缓冲区,写入结束后释放信号量BufRxSem,并通过邮箱通知相应的用户应用程序(或任务);应用程序(或任务)通过获得信号量BufRxSem从缓冲区内读取相应的报文信息。

  (3)μC/OS-II的中断任务的处理

  在μC/OS-II中,中断服务程序一般用汇编语言来写。以下是中断服务程序的示意代码:

VoidUserISR(void){
  保存全部CPU寄存器;
  调用OSIntEnter或OSIntNesTIng直接加1;
  执行用户代码做中断服务;
  调用OSIntExit;
  恢复所有CPU寄存器;
执行中断返回指令;
}

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

关键字:μC/OS-II  CAN总线  数据采集  驱动程序 引用地址:基于μC/OS-II的CAN总线驱动程序设计

上一篇:针对标志及建筑物装饰照明的智能LED控制及接口
下一篇:基于WinCE5.0的嵌入式设备休眠唤醒技术研究

推荐阅读最新更新时间:2024-05-02 21:10

基于PCI总线的雷达视频高速数据采集接口设计
引 言 PCI总线(Peripheral Component Interconnect)是Intel公司推出的一种高性能32/64位局部总线,最大数据传输速率为132~264MB/s,是目前使用较为广泛的一种总线。在高速信号的实时处理中,利用PCI总线将采集数据直接传送到微机系统内存,可有效解决数据的实时传输和存储,为信号的实时处理提供方便。利用PCI总线进行高速数据采集,可以简化电路设计,而且这种高速数据采集接口模块可以在多次设计中重复使用,缩短产品的研发周期。在此通过对专用接口芯片PCI9054的性能分析,特别是对单周期读、写和存储器映射传输操作的时序进行了分析,提出了一种新的包括PCI9054单周期读、写和存储器映射传输
[工业控制]
基于PCI总线的雷达视频高速<font color='red'>数据采集</font>接口设计
详解基于CAN总线的汽车仪表系统设计—核心电路模块设计
电源电压调整电路设计 电源的选择是关系到系统稳定运行的重要因素之-,也是该仪表能成功应用的重要-步。汽车停止和启动时的电源来源于汽车上的蓄电池,而汽车蓄电池是+24v(轿车为12v电系,卡车和重型货车为24v电系),启动运行时发电机与蓄电池采用并联的方式对电器件供电,电压波动范围为16V-32V。在仪表内部电路中,液晶屏背光,蜂鸣器,各功能指示灯(发光二极管)为12V,MCU(H128)单片机的芯片内部使用3v电压、刀0端口和外部供电电压为sv,EZPRoM等其他电气元件为SV,所以可靠的电源转换也是本仪表能成功应用的关键技术。由于汽车工作时负载变化大,电压波动范围大,而本系统所用器件大多是SV和+12V供电的,其驱动电流都比较小,
[嵌入式]
两种采用CAN总线进行通信的系统比较
    CAN总线是一种有效支持分布式控制或实时控制的串行通信网络,它可实现全分布式多机系统,且无主、从之分;具有传输速度快、自动解决总线竞争、实时性好、可靠性高、纠错能力强等特点,目前已成为一种国际总线标准。由于can总线具有诸多优点,它的应用范围遍及从高速网络到低成本的多线路网络。在自动化电子领域的汽车发动机控制部件、传感器、抗滑系统、工业自动化、建筑物环境控制、机床、电梯控制、医疗设备等领域得到了较为广泛的应用。   sja1000是一种独立的can控制器,主要用于移动目标和一般工业环境中的区域网络控制。它是philips半导体公司pca82c200can控制器(basiccan)的替代产品,而且它增加了一种新的操作模式
[嵌入式]
一种基于CAN总线的DSP程序加载技术
摘要:为灵活方便地调试磁悬浮列车上众多基于DSP芯片的控制系统,介绍了一种基于CAN总线的DSP程序加载技术。该技术使对DSP芯片程序的加载可以脱离仿真器而直接受控于列车的主控机。该技术可靠性高、使用灵活方便,具有很强的实用性。 关键词:CAN总线 单片机 DSP HPI ISA 磁悬浮列车上有很多基于DSP芯片的模块和系统。目前, DSP芯片程序的加载与运行都主要依赖于仿真器,而DSP仿真器价格高、体积大,这使得磁悬浮列车系统的调试很不灵活方便;且这些基于DSP芯片的系统一旦脱离仿真器就只能运行事前载入的单一的程序,也使系统的灵活性受到了很大的限制。 本文研究了DSP芯片程序加载的基本原理,并根据这些原理,基于CAN总线,实现了
[嵌入式]
基于LPC2294的CAN总线主节点设计方案
1 总体设计   主节点采用ARM7内核的LPC2294 微控制器 ,使用RTL8019AS作为以太网控制器,软件上采用具有网络功能强、性能稳定、移植性好的μCLi nux作为操作系统。基于CAN总线的运动控制系统,主要由1个主节点(主控制器节点)、若干个从节点(电机控制节点)以及1台计算机构成,主节点与从节点之间通过CAN总线进行通信,主节点与计算机之间则通过以太网进行通信,如图1所示。 图1 运动系统控制结构   主节点主要功能包括:1)通过CAN总线发送电机控制信息给从节点,并接收各从节点的反馈信息:2)通过以太网与计算机监控端进行通信,以实现远程监控。   1.1 整体硬件设计   主节点整体硬件结构如图
[单片机]
基于LPC2294的<font color='red'>CAN总线</font>主节点设计方案
示波器CAN总线数据解码方法
采用 示波器 侦测串口总线的通信是比较常用的一种解码技术。以Pico示波器为例,Pico示波器具有串行解码的功能,能够对CAN、FlexRay、 I2C、I2S、SPI、LIN或UART等串行总线进行解码。Pico示波器比较适合做串行解码,因为它们的深度存储器可以让软件采集较长时间、不间断的数据,尤其是6000系列能够在几秒内采集数千个数据帧存入到512M的样本存储器。下面将介绍如何用一个款Pico示波器进行CAN总线数据解码。 一、CAN总线解码概述 1、 CAN总线概念 数据通信 时,物理线路上传输的信号是由一系列高低电平组成的,这些高低电平携带了我们所需要的信息,在数据接收端,我们需要将这些物理电平按照原始的编码规则进
[嵌入式]
液晶显示器lcd1602驱动程序
#include lcd1602_driver.h #include msp430g2553.h #include typedef.h #ifndef _LCD_1602_ #define _LCD_1602_ //lcd1602的io #define LCD1602_WR_DATA_PORT P2OUT //数据输出端口 #define LCD1602_RD_DATA_PORT P2IN //数据输入端口 #define LCD_EN_SET { P1DIR |= BIT5 ; P1OUT |= BIT5; } //lcd使能设置 #define LCD_EN_CLR { P1DIR |= BIT5; P1OUT &= ~
[单片机]
车载以太网挑战CAN总线
随着汽车智能化的发展,车载以太网成为先进汽车电子架构必不可缺的一部分,在中心节点,车载以太网已经占据绝对优势地位,但在边缘节点,CAN、CAN-FD和FlexRay等总线依然占据主要地位,特别是CAN。这使得汽车电子架构难以达到真正的Zonal级别,只能停留在域控制器级别。要想软件定义汽车或者说服务导向架构,Zonal架构都是必须要做到的。 图片来源:互联网 典型的Zonal架构,就是服务器的概念,通过车载以太网骨干网,超级计算核(即服务器或高性能计算即HPC)处理所有节点的计算需求。汽车变成类似于PC的架构,软硬件彻底分离,硬件统一,绝大部分工作都是软件,依靠LINUX等操作系统与自适应AUTOSAR,硬件对程序员
[汽车电子]
车载以太网挑战<font color='red'>CAN总线</font>
小广播
热门活动
换一批
更多
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved