新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式系统中实时时问的获取

嵌入式系统中实时时问的获取

作者:时间:2009-05-05来源:网络收藏

Linux中有三种类型的设备:字符设备、块设备和网络设备。字符设备是指发送和接收数据以字符的形式进行,无需缓冲直接存取,在对字符设备发出读写请求后,实际的硬件I/0随即发生;而块设备则是对数据缓冲区进行读写并可以随机访问,操作是以块为单位。而网络设备与字符设备、块设备有很大的不同,用于对网络设备的控制和管理。DSl302显然属于字符设备。
2.6版本的Linux内核和2.4版本存在很大的不同,在模块的开发和设计上也是如此。在这里使用的内核版本是Linux一2.6.13。首先,驱动程序作为一个模块可以动态加载进内核也可以动态的从内核中卸载掉,在加载和卸载的过程际伴随的是驱动程序向内核的注册与注销。在驱动程序的代码中会有两个函数分别在模块加载和卸载过程中调用DSl302_init()、DSl302_exit(),在其中再调用register_chrdev()、unregister_chrdev()用以向内核注册和注销一个设备驱动程序。在2.6内核版本中,用如下方法声明这两个函数给内核:
Module_init(DS1302_init):
Module_exit(DSl302_exit):
在DSl302_init()函数中除调用字符设备的注册函数外,还有一个重要任务,就是配置需要用到的三条I/0口线:PBO、PBl0、PBll。配置过程包括:B端口控制器时钟使能、通用I/O口使能、输出使能、上拉电阻使能、三个口线上的同步数据输出使能,另外通过置PIOB_CODR寄存器使三个引脚输出低电平。代码如下:

本文引用地址:http://www.eepw.com.cn/article/152515.htm


其中va_sys是一个结构体,包含了AT9lRM9200处理器内的全部寄存器,通过一条语句:AT91PS_SYS va_sys=(AT91PS SYS)AT91C_VA_BASE_SYS,把所有寄存器的最低地址赋给va_sys,这样结构体中的寄存器名称就和实际的地址对应起来了。注意:这里用到的地址都是经过映射过的虚拟地址,在实际运行中会通过处理器内部的MMU单元转换为实际的物理地址发往地址总线。上述代码中的AT91C_PI0_PBO等等是一些常数的宏定义用于寄存器赋值,比如:#define AT9lC_PIO_PBO(10),它们定义在AT91RM9200.h头文件中。
在驱动程序中,file_operations是一个重要的结构体,通过它把针对设备的具体操作注册给内核的统一接口。结构体中全是函数指针,DSl302驱动程序中用到的函数有:open、release、ioctl,用于设备的打开与释放、设备的读写以及设备的控制。对DSl302的读写都是在dsl302_ioctl()中调用相应的读写函数实现的。
下面具体分析一下驱动程序中向DSl302发送单个字


代码中用到的at91_set_gpi0_value()函数定义在内核的Gpio.c文件中,最终是对10控制器的PIO_SODR(置位输出数据寄存器)或PIO_CODR(清零输出数据寄存器)赋值以使相应引脚输出需要的电平。
经过测试,短时间内误差不明显,但时钟芯片存在积累误差并且易受环境影响,连续几天运行下来,误差有数秒之多。所以,需要通过某种方法定期使用标准时间向时钟芯片对时,以消除误差。下面要介绍的GPS接收机方案就可以做到这点。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭