嵌入式Linux的几个小问题

2019-07-12 14:56发布

  关于s3c6410的pwm帖子中的问题都是一些很基本的问题,是我在学习嵌入式Linux中遇到的一些问题,自己在网上搜到答案并且贴出来。   我学习嵌入式Linux时所使用的开发板是友善之臂出版的tiny6410开发板,主控为三星s3c6410。   1 linux驱动和应用程序关系?   驱动程序运行在内核空间,而应用程序运行于用户空间。一般情况下应用程序是不能直接访问硬件的,但最终程序的执行结果必然是要到硬件的,这时就需要驱动程序。
打个比方,你要将一段字符写进硬盘,你在应用程序中是以文件的抽象方式进行的,但是在这个层面上你很难理解到底为什么这个函数能够写呢,它是如何找到硬件的呢,又是如何写进去的呢,此时其实我们可爱的驱动程序就发挥了作用,把你的数据写到硬盘由它来做,给你“屏蔽”掉许多复杂的硬件操作,可以让您更专注于应用程序本身的设计。
其实总结一下,驱动程序扮演的是硬件和应用程序之间的桥梁作用,是操作系统的一部分。
 2 Linux应用程序是如何调用驱动程序的?   一般的驱动程序是不允许应用程序调用的,只有当驱动程序留出这种供外界访问的接口才行,这种接口一般包括read,write,open,ioctl等接口,如果驱动中预留出了这些接口,就可以在应用程序中调用,比如fd=open(设备,参数);或者fd=ioctl(设备,参数);,这样就会调用到这个设备驱动中的open或者ioctl函数。所以一般如果想再应用程序中调试某个驱动程序,常见的方法就是自己建立一个驱动模块,这个模块中预留出对外接口,比如ioctl。然后在你新建的这个驱动模块中完成ioctl函数,如下:
int device_ioctl(fd,argv) {
/* your function; */
}
static struct file_operations device = {
.ioctl = device_ioctl //预留外部接口
};
应用程序如下:
ioctl(device,argv);
上面这句就可以完成你的模块中ioctl中的功能。
 6410的PWM有四个,其中一个用于内部使用无输出接口,另外一个用于电源控制而不可使用,另外两个GPF14和GPF15可用,可以输出,但是一个用于lcd背景灯调节,一个用于camera,也可以引出后做其他使用。   有的单片机有内置的硬件pwm功能,它的输出可能只能在某几个管脚上选择;如果自己编写程序实现软件PWM,则没有限制,所有的引脚都可以作为PWM输出。   关于单片机内置的硬件pwm功能,就是单片机内部的一种资源,你不需要用程序编写PWM的实现过程,只需要配置好相应的寄存器,例如PWM的频率、占空比、端口等信息,再启用硬件PWM即可,此时单片机内部的硬件自动按你指定的参数实现PWM,其实现的过程与程序运行是并行的,不占用程序资源。