单片机程序如何与硬件交互通讯?

2021-03-30 17:29:34 hongling

单片机要与硬件交互,单片机程序需要与内核进行通信,并且在此之前,它必须通知内核有关内核的存在。这是通过“init”调用实现的,通过该调用单片机程序在内核中注册并分配了所需的内存。在系统关闭时,将使用“exit”调用取消注册单片机程序,这还会释放单片机程序占用的所有资源。用于定义“init”和“exit”功能的调用是:

module_init(init_function_name);
module_exit(exit_function_name);

我们可以编写自己的init和exit函数,同时编写分别由上述两个调用设备的单片机程序。最简单的init函数如下:

static int init_function_name(void)
{
printk(KERN_ALERT“ Hello”);
return 0;
}

同样,我们也可以编写退出函数。如您所见,为了获取内核日志,我们使用与C函数printf()类似的printk()函数,但需要一个可选的特殊日志级别字符串(此处为KERN_ALERT–日志级别1)来指示严重性类型错误消息。共有八个日志级别,默认值为KERN_WARNING(日志级别4)。

设备单片机程序中最重要的组件之一是文件操作(简称“fops”)结构。此结构指定为其编写单片机程序的设备的功能。它包含指向为设备支持的操作而编写的功能的指针。基本的fops结构可以描述如下:

static struct file_operations fops =
{
.read = my_read;
.write = my_write;
.open = my_open;
.release = my_release;
}

上面的定义是,每当设备必须读取某些内容时,都会调用my_read函数(由开发人员编写)。同样,指向其他功能的指针是针对它们提及的功能的相应名称。

如果要为其编写单片机程序的设备支持中断功能,则单片机程序必须在init函数中注册中断服务程序(ISR),只要在设备中收到中断,该函数就会被调用。这是通过使用需要中断处理程序的内核函数request_irq()来实现的,然后启用中断线以接收中断。另一方面,当单片机程序卸载时,内核函数free_irq()用于释放中断处理程序和中断行。我们将在以后的帖子中详细介绍它们。