其实从大三的时候就接触过一些嵌入式linux的东西,只不过当时基础不扎实,周围的师兄和老师也没有能弄明白的,苦苦弄了一年之后还是决定先暂时放弃。后来扎实的学过了stm32和软件编程后,基本的设计思路已经清晰了,所以打算开始学习实践一下三年前未完成的夙愿。
今天先从最简单的led程序说起,简单的弄明白了,复杂的也不会有多难了,闲话少说,开始整理思路。我选用的开发平台是mini2440开发板,在友善之臂的配套开发板中,有其内核源码和简单的几个例子,今天就从他们给出了led例子说起(hello例子太白痴了,实在是不想浪费时间整理这东西了)。
先打开led.c文件,代码比较简单,直接贴出来了:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
int main(int argc, char **argv)
{
int on;
int led_no;
int fd;
if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
on < 0 || on > 1 || led_no < 0 || led_no > 3) {
fprintf(stderr, "Usage: leds led_no 0|1\n");
exit(1);
}
fd = open("/dev/leds0", 0);
if (fd < 0) {
fd = open("/dev/leds", 0);
}
if (fd < 0) {
perror("open device leds");
exit(1);
}
ioctl(fd, on, led_no);
close(fd);
return 0;
}
先解释以下这几个头文件,别看简单,对于初学者来说,不弄明白还是心理有阴影的,呵呵。
stdio.h 意思就是说带缓冲的标准输入输出,所以用到标准输入输出函数时,就要调用这个头文件。
stdlib.h 即standard library标准库头文件,头文件里包含了C、C++语言的最常用的系统函数。
unistd.h 是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型,例如read函数、write函数和getpid函数。
ioctl.h ioctl()是I/O操作的杂货箱,很多事情都要依靠它来完成。除了摄像头,视频采集卡之类的与video相关的操作其实也都与此类似。ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:
int ioctl(int fd, ind cmd, …);
其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。
好了,下面我一点点深入去分析,
int on; //定义led的状态,0或者1;
int led_no; //定义控制哪个LED,0-3,一共四个
int fd; //led设备文件描述符的变量