作者:刘智国,张海春
1 S3C2410硬件平台简介
S3C2410是韩国三星公司生产的新一代高性能微处理器,它是基于ARM920T内核的16/32位RISC处理器.主要应用于嵌入式系统中。
S3C2410拥有强大的数据处理能力.又有着低成本.低功耗等优点.在各种手持及移动设备上的应用越来越广泛,基于其平台的程序功能也越来越复杂。于是,在其平台上架构多线程的操作系统已成为越来越多系统设计者的诉求,本文介绍多线程在S3C2410上的具体实现过程。
2 系统结构分析
串行端口的本质功能足作为CPU和串行设备问的编码转换器,一般微机内都配有通信适配器,使计算机能够与其他具有RS232C串口的计算机或设备进行通信。本系统主要目的是实现宿主机与目标机之间的近距离串行通信,采用的宿主机是Intel X86架构的Red Hat Linux9.03环境PC机,而目标机是ARM架构的开发板。
本系统中目标机开发板的内核采用的是三星的S3C2410,该开发板采用核心板加底板的模式.核心板接口采用DIMM200标准连接器.工作非常可靠,可稳定运行在203 MHz的时钟频率下。其外设非常丰富.功能强大.完全可以满足设计需要。串口线采用常用的RS 232C型接口模式。能实现计算机与开发板间的数据传输与控制。
3 系统硬件结构原理
串行通信可以在DOS或Windows环境下进行。可以用汇编或高级语言编写通信程序,本文介绍如何在Linux操作系统下来实现串口间的通信。
在串口通信的实现过程中。要保证数据传输的可靠性和稳定性.其硬件设计是必不可少的,本文中选用S3C2410芯片作为核心器件。S3C2410芯片是SAMSUNG公司16/32位的RISC处理器。采用ARM920T内核,内部具有2个独立的UART控制器以及分开的16 kB的指令Cache和16 kB数据Cache,每个控制器支持的最高波特率可达到230.4 kb/s。S3C2410芯片的这些特点,为实现在“nux操作系统下计算机与开发板问的串口通信提供了可靠的保证。基于S3C2410的嵌入式串口通信的硬件结构原理如图1所示。
图1 系统硬件结构原理图
宿主机计算机系统中,在Linux操作系统下编写好串口通信的程序.通过JTAG接口模块下载至目标机即开发板中,在相应的软件控制命令下.通过串行接口线即町实现宿主机与目标机问数据的发送和接收。目标机中电源模块提供了开发板系统工作所需的正常电压。各种数据信息町以通过液晶显示模块及时显示出来.还可以通过键盘控制模块来实现对日标机操作的控制,外扩存储器模块町以由FLASH或SDRAM构成,当然作为一个完整的系统.还必须配有其他外围电路,以保证系统的正常工作。
4 软件实现
串口通信软件的设计是系统成功运行的关键,如何保证通信的效率、可靠性、实时性以及节约系统的资源足设计者关心的问题,因此通信协议的定义、软件外发的结构设计、程序开发工具的选择在系统设计中极其重要。PC端串口通信程序的开发是基于Windows环境面向对象的设计方法,开发环境选用vc++,实现的方法有多种,对此作介绍的文献也较多。在此不详述。对于单片机端的串口通信程序,有文献介绍基于汇编语言的程序框架,但基于分层结构的C语苦实现却少有介绍。下面将具体介绍在Keil C51中,分层结构框架下串口全双工通信程序的设计与实现。
4.1 通信协议口波特率
基于串I=1的通信模式有间步通信和异步通信两种,这取采用的是异步串行通信。在通信过程中,单片机应处理以下问题:(1)识别命令。PC机将命令传送给单片机,单片机能够识别不同的命令而且根据不同的命令内容完成不同的操作。(2)识别数据。单片机能识别附加在命令后的数据。传送数据的最大位数由设置的缓冲区大小决定。(3)出错处理。包括识别无效命令和处理通信错误。当啦片机接收到系统没有定义过的命令.或者收到的命令不符合预先定义的格式时。它应该做出响应.向系统报错并能进行错误处理,错误类型编号应事先定义。(4)正确应答。当单片机系统接收到一条没有通信错误且符合通信协议的信息时,应根据所接收的命令进行相应操作,并把操作结果返回PC机.如发一个“OK”信息以示确认。
PC机应处理的问题:(1)采集单片机发送的数据,如某设备模块的状态信息;(2)接收单片机的正常响应和错误响应信息,若足错误响应信息,应根据错误类型,以处理。由于控制的设备模块可能有多个,通过对设备模块统一编址,给不同的设备设置唯一的16位地址加以区分。这样在PC机和单片机进行数据传送时,双方能够识别数据的来源及需控制的对象。如表1所乐为通信协议格式示例.由PC机传输命令协议和单片机响应协议组成。
表1 通信协议示例
4.2 单片机通信软件的分层设计
单片机系统的软件开发环境为Keil C51。与汇编语言相比.C语言在结构性、可读性、可维护性上有明显的优势.更利于程序移植和扩展。串口通信程序采用分层结构。即将程序按层次分为物理层、驱动层,应用层,分层设计有以下优点:(1)与主机通信的串口程序支持接收和发送并发处理(主动发送和被动查询设备并存),利于提高通信效率及数据处珲的实时性。(2)当单片
三层程序的主要功能及C语言实现如下所述:
(1)驱动层:也称抽象层,在该层定义串口基本操作结构。基于此结构实现不同方式下的串口设计,包括中断方式下的串口实现和I/O口模拟方式下的串口实现。虽然两种方式的底层实现有所区别。但足驱动层屏蔽不同串口操作的物理细节,简化应用层对串口的操作。串口的结构定义如下:
typedef struct Serial
{ void (* pfSetBaudRate)(unsigned long baud_rate); //设置串口波特率
void (*pfOpen)(void); //串口打开
void (*pfClose)(void); //串口关闭
unsigned (*pfGetChar)(unsigned char *c); //从接收缓存中取一个数
void (*pfPutChar)(unsigned char c); //发送一个字节
void (*pfPutStr)(unsigned char *tmp_str, unsigned char tmp_len); //发送一串数
}Cserial;
(2)物理层:在该层针对不同的串口实体.完成不同的物理操作.如单片机串口初始化、I/O模拟串口方式下的定时器初始化、I/O中断初始化等。其作用是给不同的串口操作模式提供支撑。针对标准全双工串口和模拟串口两类不同的物理实现方式.设计不同的串口实体(包含内部执行每类串口的底层操作及相关基本的外部初始化等操作),不同的实现方式,绑定不同的操作函数指针.指针指向不同的操作。两种串口实体封装成统一的串口基础类,使程序具有更强的通用性和扩展性。在物理层采用循环FIFO双缓冲队列对接收和发送的数据进行缓存、读取,缓冲区循环FIFO操作方式与中断方式下接收和发送数据的结合使用,保证了数据处理的可靠性、实时性。,由于篇幅所限.下面只给出了缓冲区结构和相关指针的声明程序示例代码:
typedef struct Fifo
{ unsigned char *m_buf;//定义缓冲区首地址
unsigned int m_bufsize;//定义缓冲区大小
unsigned int m_wp; //写入数据
unsigned int m_rp; //读出数据
)CFifo;
unsigned char(fFifoPush)(CFifo *me, unsigned char c);//数据入队
unsigned char(fFifoPop)(CFifo *me);//数据出队
void fFifolnit(CFifo *me, unsigned char * tmp_buf,unsigned int tmp_size);//初始化
(3)应用层:完成对单片机系统初始化。包括串口驱动结构实体的初始化。然后按统一的串口驱动层接口对串口操作而不关心其物理实现方式,如波特率设置、串口开关、收发数据等,循环接收、处理串口的命令和数据.处理单片机的I/O 口操作等。以下为主应用程序基本架构.本尔例为系统接收串口数据后。直接返回主机。
extern CSerial xdata mSerial; //在物理层,已声明该串口实体
void main(void)
{ EA=0;//禁止中断
Uart_Init(); //串口初始化
mSerial.pfSetBaudRate(9600);//设置波特率为9600bps
mSerial.pfOpen(); //打开串口
//⋯其它初始化程序,
EA=l: //开放中断
while(1){
if(mSefial.pfGetchar(&i))mSerial.pfPutchar(i)
}
//⋯其它循环检测、处理程序
}
5 小结
本文作者创新点足详细地说明了基于S3C2410的嵌入式系统串口全双工通信软件分层设计的实现,描述了单片机与PC机仝双工串口通信的通信协议,以及存keil C51下的程序实现。应用征明.该方法可以极大地提高程序的封装性和模块化程度.增强了串口传送数据时系统收发、处理数据的并发性和实时性.同时也提高了编程效率。该方法已成功应用于安防监控系统、I/O检测模块、安全模块等系统.运行结果良好。对于其它基于串口通信的智能设备控制.具有参考意义。