向uClinux中添加應用程序及自動運行(參考uClinux-dist/REAMDME)

首先在/uclinux-dist/usr中建立一個目錄:hello,再在這個目錄上添加自己的應用程序hello.c
(參考uClinux-dist/REAMDME)
1>在config/config.help中最後一行添加
CONFIG_PROP_HELLO_HELLO
  THIS IS MY PROGRAM   

2>在config/config.in中添加

mainmenu_option next_comment
comment 'User Application'
bool 'Hello' CONFIG_USER_HELLO
comment "User Application"
endmenu

###################################################################

3>在user/makefile中添加一行:
dir_$(CONFIG_USER_HELLO_HELLO)                  += hello

4>在user/hello/目錄下添加一個makefile文件:
EXEC = hello
OBJS = hello.o

all: $(EXEC)
//在這裏要注意,每行開頭不能以空格開頭,而要以TAB鍵開始
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

romfs:
$(ROMFSINST) /bin/$(EXEC)

clean:
-rm -f $(EXEC) *.elf *.gdb *.o

 注意這裏的Makefile在轉行對齊時一定要用Tab鍵,否則編譯的時候會出錯,我剛入門時就被這個地方絆了很久。

如果在uClinux中讓自己的應用程序在內核啓動的時候自動運行   <script src="http://blog.csdn.net/count.aspx?ID=1775182&Type=Rank" type="text/javascript"></script>  CSDN Blog推出文章指數概念,文章指數是對Blog文章綜合評分後推算出的,綜合評分項分別是該文章的點擊量,回覆次數,被網摘收錄數量,文章長度和文章類型;滿分100,每月更新一次。

這是一個很老的話題了--不過網上還是很難找到一個完整的操作步驟,所以打算寫一下送給象我一樣的菜鳥.
 
仍然以已經編譯成功的例子--hello(具體內容可以參閱前面的文章)來說明這個過程.也就是假設程序已經編譯好了!(hello的編譯過程可以參看http://www.itsn.cn/bbs/dispbbs.asp?boardID=2&ID=1&page=1中第7個問題)
在網上搜索了一些相關內容,都提到了如果想實現程序自啓動,需要修改一個etc/rc文件的內容.這個文件大家都不陌生,就是一個負責啓動或運行級別變化的腳本文件.但uClinux-dist目錄下並沒有etc這個目錄,所以定位rc文件的位置成了關鍵.
最開始我找到了uClinux-dist/romfs/etc/rc這個文件,並在文件的最後添加了一行:
/bin/hello --也就是編譯好的可執行文件
保存,重新編譯uClinux,並不需要從頭開始編譯
只需執行下面的4步就可以了.
make user_only
make romfs
make image
make
之後下載uClinux的鏡象到ITSN的開發板中,重新啓動.
但是結果讓我很失望,程序並沒有自動運行起來,分析一下原因,我錯誤的以爲是由於沒有重新編譯內核的原因,所以我重新編譯了一次(重頭開始),步驟如下:
make mrproper
make menuconfig
make clean
make lib_only
make user_only
make romfs
make image
make
這些過程都是按照ITSN上的說明來做的.
可是結果還是一樣讓人失望.
 
冷靜下來仔細分析,編譯的時候執行了make romfs,也就是說romfs目錄中的內容應該是根據其他文件的內容生成的,並用於下載到開發板中的鏡象文件的源代碼,這樣說來,它的內容是不能直接修改的,爲了驗證我的想法,我又打開了這個rc文件,果然,剛纔的改動已經自動消失了.
 
我又開始在uclinux-dist目錄下搜索可能的rc文件,發現了uClinux- dist/vendors/Samsung/44B0/rc這個文件(vendors目錄下保存的是所有廠商和產品的備選),由於在設置內核的時候使用的就是44B0這個選項,猜想大概就是它了,增加一行:
/bin/hello
保存並編譯,也是隻執行了後4步.
重新啓動,竟然ok了!
超級終端上顯示出"hello andy"

===================================

/*
*file:led1.c
*description:make the led flash 10 times,
*    the ITSN_44b0 board is used for this program
*use this command to compile:  arm-elf-gcc -elf2flt -o led1 led1.c
*Date:2007/10/13
*Author:[email protected]
*/
#include <stdio.h>
#define PCONC (*(volatile unsigned *)0x01D20010)
#define PDATC (*(volatile unsigned *)0x01D20014)
main()
{     int i = 0;
    PCONC&=0XF05FF55;
        for(i=10;i>0;i--)
    {
        printf("led light/n");
        PDATC &= ~(0x1<<1);
        sleep(1);
        printf("led unlight/n");
        PDATC |=0x1<<1;    
        sleep(1);    
    }
     exit(0);
}

一、快速添加
1
複製可執行文件到文件系統 romfs目錄是生成的文件系統目錄,在執行make romfs命令時生

成,如果已經執行過make romfs命令,用戶可將生成的可執行文件led複製到romfs/bin目錄

,不必重複該命令。需要注意的是如果用戶執行了make clean命令,romfs下的全部內容將

被清除。
2
執行make image
執行make

例如將程序led1添加進uclinux
二、標準添加方法(待續)
三、讓程序開機自動運行(已測試通過)
向uClinux- dist/vendors/Samsung/44B0/rc添加
/bin/led1

而不是在uClinux- dist/romfs/etc/rc中添加

實驗發現:編譯後uClinux- dist/romfs/etc/rc將被uClinux-

dist/vendors/Samsung/44B0/rc覆蓋(make romfs 時)

執行
make user_only
make romfs
make image
make
 =======================================

========================================

========================================

文中所用的路徑爲uclinux 安裝的相對路徑, 比如: /uClinux-Samsung)編譯uclinux 並運行成功後, 下一步的工作就是寫個最經典、最簡單的程序“ hello, world” 。
在uclinux下, 當然要比在普通的OS下麻煩些。( 我用的是ANYWHERE-Ⅱ 開發板, 不同的開發板的過程應相似)我基本是按照 Documentation/Adding-User-Apps-HOWTO 的步驟進行, 有部分修改。
1、在user 目錄下創建新目錄 user/sample, 用來存放源代碼。寫“ hello.c” 文件。( “ hello.c” 文件如何寫,不用我說了吧。)
2、編輯文件 user/Makefile,
增加下面這行 dir_$(CONFIG_USER_SAMPLE_HELLO) += sample
具體增加到哪裏, 你打開文件就會發現相似的語句, 按照字母順序, 放到合適的位置。
$(CONFIG_USER_SAMPLE_HELLO)是一個變量,如果在配置用戶應用程序時選擇此程序那麼它的值將是y,反之爲n。在下一步中有更詳細的介紹。這一行的意思是如果配置此程序,則將第一步新建的目錄(即sample)添加到dir_y變量中,稍後進入dir_y變量裏的各個目錄進行編譯。
3、編輯文件 config/Configure.help,
增加下行
CONFIG_USER_SAMPLE_HELLO
A example C program. This Program print "hello, world" on screen.
注意: 第2行以2個空格開頭, 總長度小於70 個字符。
4、編輯文件 config/config.in
在 ‘ Games’ 後添加新的部分
##################################################
mainmenu_option next_comment
comment 'Sample'
bool 'hello' CONFIG_USER_SAMPLE_HELLO
endmenu
( 注意這裏的單引號字符不對, 不要直接COPY這裏的字符, 最好自己手工輸入, 或參考文件中已有的行修改。)
第一句表示下面將是一個菜單,
第二句表示菜單名稱是 Sample,
第三句是一個選項,名字是hello,由變量CONFIG_USER_MYAPP保存這個選現的值,y或n。
第四句表示菜單結束。

以上各步完成後,在用make menuconfig配置用戶程序時即可見到最後有個 Sample,將焦點調到此選項上,回車就進入了哪個菜單,只有一項hello,按空格選中,按兩次ESC保存配置退出即可。
若想在系統啓動時運行此程序,則需要編輯vendors/Samsung/44B0/rc,在最後一行添加此程序編譯後的名字即可(如hello)。此文件編譯後會被放在目標系統的/etc目錄下。此rc文件實際上是一個shell腳本,在系統啓動後會自動執行。因爲myapp編譯後會放在目標系統 /bin目錄下,此目錄已包含在系統路徑中,所以在rc文件中寫入hello系統會找到它並運行。

##################################################
5、創建合適的 user/sample/Makefile 文件
HELLO = hello
HELLOOBJS = hello.o

all: $(HELLO)

$(HELLO): $(HELLOOBJS)
$(CC) $(LDFLAGS) -o $@ $(HELLOOBJS) $(LDLIBS)

romfs:
["$(CONFIG_USER_SAMPLE_HELLO)" != y] || cp hello $(ROMFSDIR)/bin/.

clean:
-rm -f $(HELLO) *.elf *.gdb *.o
6、重新編譯生成image.rom。注意在運行make config 或make menuconfig時選擇生成"hello" 。
是否Makefile 文件中修改如下:
romfs:
["$(CONFIG_USER_SAMPLE_HELLO)" == y] || cp hello $(ROMFSDIR)/bin/.
是否能默認選擇“ hello” , 我還未試。
7、燒寫image.rom, 運行 >hello 即可看到輸出“ hello, world"
8、完畢。
注意:GCC前必須要用[Tab],否則會出現錯誤:missing separator. Stop.

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