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 分別代表關閉和點亮。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章