linux学习笔记(四)

查看已加载的模块:

lsmod 或者 cat /proc/modules

2.6.30内核中,regs-gpio.h和hardware.h分别定义在<mach/regs-gpio.h>和<mach/hardware.h>中,这和之前较老的版本不一样。

在2.6.30内核中,class_device_create()和class_device_destroy()分别被定义为device_create()和device_destroy,这也和之前的老版本不一样.

另外:map.h和regs-timer.h为置也不一样,此类为题用find搜索一下就可以解决~

//===============================================================

 


error: invalid storage class for function '__inittest'

一般情况下这种误都是因为少些了一个“}”,仔细检查一下代码就可以发现了~  

warning: ISO C90 forbids mixed declarations and code
这个警告网上给的原因是:变量定义之前任何一条非变量定义的语句(注意:语句是会带分号的)都会引起这个警告!将非变量的定义移到变量定义之后 即可。

而我这里把上面那个error搞定后,这个连带错误也就没有了~

 


//===============================================================

今天整了大半天终于把流水灯搞出来了。也算没白忙活,现在把遇到的问题记录一下,其实最大的原因是自己的粗心,但在debug的过程中也学到了很多东 西,也许这就是塞翁失马焉知非福的道理吧。

先是insmod模块成功加载,但是执行 #leds 1 0 时led灯却没有任何反应,然后回去看代码,既然能够加载,那么驱动部分应该是没有问题的,问题可能出在控制程序部分。在leds.c中部分代码如下:

if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
on < 0 || on > 1 || led_no < 1 || led_no > 4) {
           fprintf(stderr, "Usage: leds led_no 0|1/n");//=============(1)
           exit(1);
}


fd = open("/dev/EmbedSky-leds", 0);//======================(2)


if (fd < 0) {
         perror("open device leds");
          exit(1);
}
ioctl(fd, on, (led_no-1));//=================================(3)
close(fd);
return 0;
在原先我写的代码中是没写(2)的(粗心……),所以在在命令输错时(如写成#leds 8 0,总共只有4个led),会报错:Usage:leds led_no 0|1 。这说明程序是执行到了(1)处的,在命令输入正确(如#leds 2     0)时,没有报错,但led也没有任何反应,原因当然是没有添加(2)了,文件没有打开,所以fd一直是初始化值0,而不指向任何设备,加上之后输入命令#leds led_no 0|1 就正常了。

leds完成的功能是控制单个灯的亮灭,所以在内核中还添加了一个叫led-player的简单应用程序,其实是一个典型的管道应用的例子: LED 服务器 开机进入系统后, 将会自动运行运行一个 LED 服务程序(/etc/rc.d/init.d/leds),leds的内容如下:

#!/bin/sh

base=led-player

# See how we were called.
case "$1" in
  start)
        /sbin/$base &
        ;;
  stop)
    pid=`/bin/pidof $base`
    if [ -n "$pid" ]; then
        kill -9 $pid
    fi
        ;;
esac

exit 0

它其实 是调用了 led-player 的一个脚本,led-player 开始运行后,将会在/tmp 目录下创建一个 led-control 管道文件,向该管道发送不同的参数可以改变 led 的闪烁模式: #echo 0 0.2 > /tmp/led-control 运行该命令后,4 个用户 led 将会以每个间隔 0.2 秒的时间运行跑马灯。 #echo 1 0.2 >/tmp/led-control 运行该命令后,4 个用户 led 将会以间隔 0.2 秒的时间运行累加器。 #/etc/rc.d/init.d/leds stop 运行该命令后,4 个用户 led 将会停止闪动。 #/etc/rc.d/init.d/leds start 运行该命令后,4 个用户 led 将会重新开始闪动。 (2)单独控制 LED /bin/leds 是一个可以控制单个 led 的实用程序,要使用 leds 必须先停止 led-player,如 下命令: #/etc/rc.d/init.d/leds stop 该命令将停止 led-player 对 led 的操纵。led 的使用方法如下: [root@fa /]# led Usage: leds led_no 0|1 led_no 是要操作的 led(可为 0,1,2,3),0 和 1 分别代表关闭和点亮。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值