首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
CAN通信卡的Linux设备驱动程序设计实现
来源:本站整理  作者:佚名  2009-05-13 13:30:42




2.1 初始化加载和卸载部分 

    如果设备驱动程序以模块方式加入内核,则一定会包括两个模块init_module和clear_module。init_module模块用来加载设备,系统初始化时调用;clear_module模块用来卸载设备,取消设备时调用。

    设备驱动程序是系统内核的一部分。在任何程序使用设备驱动程序之前,设备驱动程序应该向系统进行登记,以便系统在适当的时候调用。Linux系统里,通过调用register_chrdev函数向系统注册字符型设备驱动程序。register_chrdev定义为: 

    int register_chrdev(unsigned int major, const char *name, struct file_operations *fops); 

    其中,major是为设备驱动程序向系统申请的主设备号,如果为0则系统为此驱动程序动态分配一个主设备号;name是设备名;fops是对各个系统调用的入口点的说明。 

    CAN通信卡使用中断与系统交换数据,CAN设备驱动程序需要使用内存来缓存接收到的数据和发送的数据,中断和内存等资源是由Linux系统统一管理的,设备驱动程序在初始化时,需要申请资源。在资源不用的时候,应该释放它们,以利于资源的共享。在Linux系统里,对中断的处理是属于系统核心的部分,设备驱动程序通过调用request_irq()函数来申请中断,通过free_irq()函数来释放中断。作为系统核心的一部分,设备驱动程序在申请和释放内存时不是调用malloc()函数和free()函数,而代之以调用kmalloc函数和kfree()函数。

    在init_module模块中,先检查是否存在CAN通信卡,如果不存在则退出设备驱动程序的加载;如果存在,使用request_irq()函数为CAN通信卡申请系统中空闲的中断,使用kmalloc()为设备驱动程序申请输入输出缓存队列,如果这些资源申请不成功,则释放已经申请到的系统资源,然后退出设备驱动程序的加载,如果申请成功,使用register_chrdev()函数将CAN通信卡驱动程序注册到Linux系统中,加载完成。

    在cleanup_module模块中先使用free_irq()函数释放init_module模块中申请到的中断,然后使用kfree()函数释放init_module模块中申请到的内存空间,最后使用unregister_chrdev()函数释放init_module模块中注册的设备驱动程序,卸载完成。

2.2  CAN通信卡设备驱动程序的中断处理部分

    Linux中断处理程序可以分为上半部和下半部。上半部即一般的中断服务程序,由硬件中断触发,它一般运行在关中断的方式下,应当尽可能短小,处理尽可能快;而下半部是单独的一段处理程序,一般将其挂入立即队列中以便快速执行。立即队列中的任务在退出系统调用或调度器获得运行时,将最优先地被执行。下半部运行在一个安全的环境,即开中断和任务串行化,可以处理一些较花时间的任务。

    这样,驱动程序上半部在处理完实时性很强的任务后,用queue_task()函数将下半部处理函数挂入立即队列,并用mark_bh()函数来激活立即队列,则下半部可以最优先地被执行。

    当有接收中断时,CAN通信卡设备驱动程序的中断处理程序上半部首先获取驱动程序接收缓存中的空闲块,将CAN通信卡上的接收缓冲器中数据复制到驱动程序的接收缓存中,释放CAN通信卡接收缓冲器,然后将下半部处理函数挂入立即队列,最后激活立即队列。

    当有发送中断时,CAN通信卡设备驱动程序的中断处理程序上半部首先获取发送缓冲队列中的数据,将需要发送的数据写入CAN控制器的发送缓冲器,最后请求发送。

    CAN通信卡设备驱动程序的中断处理程序下半部使用Hilon A协议对要传送到CAN网络上的数据打包,并对从CAN网络上接收到的数据进行解包和组帧。这样中断处理程序的上半部只需要从CAN通信卡的缓冲器中将数据复制到驱动程序的缓冲区,系统开销很小,但很费CPU时间;系统开销较大的打包、解包和组帧处理则放在中断处理程序的下半部,使用系统非中断时间调度,可以使系统响应中断更快,通信更稳定。

2.3 缓冲区管理

上一页  [1] [2] [3] [4] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:137,168.00000 毫秒