3、Linux实现温湿度传感器驱动程序
在单片机控制的传感器设备中,单片机通常是单线程操作。在测量温度和湿度时,单片机需要等待测试结果返回,这阻碍了其他测试和操作的同步执行。
在嵌入式Linux在系统中,驱动程序将测试任务发送到任务队列并交出CPU控制权,然后进行其他实时任务操作,然后进入任务队列完成传感器测量,以提高系统执行的效率和实时性。
3.1 Linux加载温湿度传感器设备
使用温湿度传感器Linux内核的Miscdevice当驱动程序初始化时,数据结构将设备注册为内核。
Miscdevice主设备号为10,设备及设备接口函数定义如下。
内核注册函数将在驱动程序加载设备时调用。Linux2.4和2.几乎所有的内核Linux驱动程序依赖于以下函数加载模块。
驱动程序初始化完成后,可以调用上层应用程序sht10_fops中的sht10_read读取温湿度的函数。
3.2 Linux操作温湿度传感器设备
在读取数据之前,首先在驱动程序中打开四个字节的数据空间,以存储温度和湿度测量值。将全球变量数据缓冲区定义为unsignedcharbuf[4]。
读取SHT在10温湿度数据之前,端口需要初始化SHT10复位操作,然后将任务发送到任务队列并堵塞线程。当任务返回时,唤醒线程,并将读取的数据传输到上层应用程序进行进一步处理。程序流程图和实现函数如图2所示。
图2驱动程序流程图。
上述函数中start_trans;write_byte;read_data;read_byte分别利用PXA310引脚模拟时序完成启动传输和写字节,读取数据和字节。
内核tasklet_schedule()指定的调度执行tasklet,在获得运行机会之前,只调度一次,如果在运行过程中进行调度,则在完成后再次运行。
wait_for_compleTIon()这个函数是一个不可打断的等待,如果有代码调用它,并且没有完成任务,结果将是一个不可杀死的过程。copy_to_user()将核心空间数据传输到上层用户空间,进一步处理上层测试程序。
3.3 Linux温湿度传感器设备堵塞操作
由于温湿度传感器测量需要一定的时间,为了提高系统的运行效率和实时性,在驱动程序中堵塞线程,交出核心控制,并在操作完成后唤醒线程,以提高系统的利用率。complete()在函数中唤醒等待的读取线程。任务队列实现函数如下所示。
Tasklet当系统负载不重时,可以调用或立即执行测量操作,但永远不会晚于下一个CPUclock.
Tasklet总是在中断期间运行,并在调度他CPU上运行。与单片机系统相比,在单线程线程条件下sht10_read()中调两次 measure_sht10()来等待测量完成,测量效率依赖2次测量消耗的时间;但在Linux使用驱动程序Tasklet方式操作,两个测量过程不会影响其他线程,当其他实时事件需要及时处理时(如网络、视频),能更有效地提高驱动运行效率,减少对其它实时处理的影响。