日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BRCM eCos下的编译及问题

發布時間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BRCM eCos下的编译及问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

王鑫宇 2015.7.15

一、引

我們一般編譯ecos如下:

(1)Make PROFILE=16MB oldconfig

(2)Make

OK了,產能了個ecos_lzma.trx 升級就行了。

比較奇它是如何產生的,產能的過程,組成的部分。如同Linux下,生成升級文件 ,只需要產生 vmlinuxz-lzma , target.squashfs 再用 BRCM的 trx工具一綁,過程還是很清楚的。

但eCos就摸不到頭腦了,因為整個eCos就是一個大的可執行文件。

最近感覺一直腦袋痛的小問題,(其實不算問題了),就是make clean 一次好像很ok, 在make 一次,就打印好多東西,誰也說不清。(見下面的附圖吧)

一直想跟一個makefile,但一直沒去跟。總覺得有問題,又說不清,渾渾噩噩的,日。

二、編譯過程分析

Come on, Flow me.

1.?下好代碼, Make PROFILE=16MB oldconfig

居然編譯了好久,不正常但又說不清

oldconfig: vclean before_oldconfig koldconfig

????chmod u+rx scripts/lxdialog/lxdialog

????bash scripts/Menuconfig config/config.in save

cp include/autoconf.h $(SRCBASE)/router/shared/bcmconfig.h

?

Vclean:清除了bcmcrypto ?et router shared wl wps 這幾個目錄的編譯文件(.o .d),隨便把

src/router/shared/bcmconfig.h 這個也rm了,這幾個目錄都在src下面

?

before_oldconfig: 檢查你給的PROFILE文件在bsp目錄下是否存在,你要是寫錯了,就給你一句:“You should run make PROFILE=8MB_AP/8MB_AP_B0/16MB/A5V1/A5V2”

熟悉吧。

然后把config_$(PROFILE) 這個文件 cp 為 bsp目錄下的.config

?

在這里多說幾句,區分8M 、16M這個.config,除了wifi功能、應用程序外,它也起要的作用。CONFIG_ECC="ecc-bcm947xx-router-tiny" 這個變量,這個文件在bsp/arch/mips/下面,感覺很這里的雖然看不懂,但是很牛逼。

?

Koldconfig:最終在bsp目錄下執行

oldconfig:

????bash $(BSPDIR)/scripts/Menuconfig $(BSPDIR)/arch/$(ARCH)/config.in save

????if [ -e $(SRCBASE)/wl/config/diffupdate.sh ] ; then \

????????chmod u+rx $(SRCBASE)/wl/config/diffupdate.sh ; \

????fi

其中Menuconfig會根據bsp目錄下的.config生成include/kautoconf.h (很貼心的命令)

?

接下來執行 oldconfig本身就以下幾個命令:

????chmod u+rx scripts/lxdialog/lxdialog

????bash scripts/Menuconfig config/config.in save

????cp include/autoconf.h $(SRCBASE)/router/shared/bcmconfig.h

又是Menuconfig 產生include/autoconf.h,然后又cp為bcmconfig.h

在這里多說幾句,如果我們想增加一個功能配置進 .config 和系統中,如CONFIG_IPSEC,

1.把這個模塊加入在.config中

2.把關于這個的配置加入到config/config.in中,它是一個模板,為Menuconfig腳本使用

????comment 'IPSEC'

???bool ' ?Support IPSEC' CONFIG_IPSEC

3.編譯時,會產生一個宏,__CONFIG_IPSEC__(由Menuconfig),生成在include/autoconf.h中。

此方法應該使用在能夠模塊的代碼。

?

Oldconfig分析完成了,但它不是這樣的工作的,如果你再來一次

Make PROFILE=16MB oldconfig

你會發現,這才是你要想的結果。

?

暫且擱置此問題。

?

2.第二步,make了

all: epivers version $(BSPDIR)/.config bsp $(obj-prelibs) $(obj-postlibs) ecos.trx ecos_lzma.trx cptftp

?

如上,就這幾步了,我們一個一個來。

(1)epivers??為了epivers.h,此文件都是SDK版本的宏定義

(2)version??和上面那個感覺差不多。

(3)Bsp?這是一個小高潮,$(MAKE) -C $(BSPDIR) 我們跟進去 bsp/makefile

all: epivers $(MODULE)

?$(MODULE) 就是bsp.o

$(MODULE): subdirs $(SUB_OBJS)

$(XLD) -r $(ENDIAN) -o $@ $(SUB_OBJS)

其中:SUB_OBJS = $(join $(SUBDIRS), $(patsubst %, /obj-%.o, $(notdir $(SUBDIRS))))

為init/obj-init.o drivers/obj-drivers.o shared/obj-shared.o net/obj-net.o arch/mips/brcm-boards/bcm947xx/obj-bcm947xx.o即為此目錄下的遞歸編譯,

所以,當你改動到時BSP目錄下的文件時,不用clean,它會幫你重新編譯鏈接。

Driver下面包括了無線、有線的驅動。

?

(4)obj-prelibs?= $(filter bcmcrypto nas eapd wlconf utils, $(obj-y)) 這個太直接了。在這里,obj-y是已經定制好的,所有要編譯的目錄

(5)obj-postlibs := $(filter-out $(obj-prelibs), $(obj-y)) 這個也太直接了

(6)余下幾個就是鏡像生成了,直接點,

ecos.gz: ecos.bin ecos.map

gzip -c9 ecos.bin > ecos.gz

?

ecos.lz: ecos.bin ecos.map

lzma e ecos.bin ecos.lz

這兩個都依賴于ecos.bin ecos.map,其生成定義在rule.mak中

%.bin: %

????$(XOC) -O binary $(@:.bin=) $@

就是

ecos: version bsp $(TRX_LIBS) $(TRX_OBJS) $(BSPDIR)/kernel/ecos_install/lib/target.ld

$(XCC) $(LDFLAGS) $(ECOS_GLOBAL_LDFLAGS) -o $@ $(TRX_OBJS) $(TRX_LIBS)

就這里了,TRX_OBJS += $(BSPDIR)/obj-bsp.o 這個包括了所有要編譯的目錄,以及bsp.o

TRX_LIBS = $(BSPDIR)/kernel/ecos_install/lib/libtarget.a 這也是個高潮了,kernel就是它了。

?

三、繼續

?

$(BSPDIR)/kernel/ecos_install/lib/target.ld 這是個鏈接腳本,它在kernel/ecos_build/hal/mips/bcm47xx/v3_0/makefile 中定制了生成,

$(PREFIX)/lib/target.ld: $(wildcard $(REPOSITORY)/$(PACKAGE)/src/mips_bcm47xx.ld)

????$(CC) -E -P -Wp,-MD,target.tmp -DEXTRAS=1 -xc $(INCLUDE_PATH) $(CFLAGS) -o $@ $<

????@echo $@ ": \\" > $(notdir $@).deps

????@tail -n +2 target.tmp >> $(notdir $@).deps

????@echo >> $(notdir $@).deps

@rm target.tmp

基本上是mips_bcm47xx.ld 了,應該是BRCM寫好了的。

?

很多情況下缺少target.ld這個文件 ,就是你kernel沒編譯通過的原因。

?

產生ecos, 再生成壓縮文件就不是問題了,有木有發現:libtarget.a 它是怎么來的啊,說了這么多費話,就是沒提它呢?

?

世界那么大,就是少不了它:libtarget.a 神一樣存在的kernel,你在哪里啊,我一直在尋找,直到我發現我一直在錯過,是多么不懂得珍惜。

?

在編譯目錄下的Makefile中include $(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak

?

大膽放肆的存在:

Ecos kernel的路徑:src/ecos/ecos-3.0/packages 與ecos官網上的一樣。

BRCM把編譯的文件放在:src/ecos/bsp/kernel目錄下

在一開始它就不存在,而

$(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak: .config $(BSPDIR)/.config

????echo "RRRRRRRRRRRRRRRRRRouter ---------------"

????if [ ! -e $(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak ] ; then \

????????make -C $(BSPDIR) kernel ; \

????fi

而無論你make神馬,make都會去執著的尋找ecos.mak,它將成為編譯的FB(第一個target),不離不棄。

make -C $(BSPDIR) kernel ?在bsp目錄下的Makefile中

?83 kernel: .config

?84 ????echo "QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ kernelllllllllllll"

?85 ????@echo "Build eCos kernel library"

?86 ????if [ ! -d $(BSPDIR)/kernel ] ; then \

?87 ????????mkdir -p $(BSPDIR)/kernel ; \

?88 ????fi

?89 ????if [ ! -e $(BSPDIR)/kernel/ecos.ecc ] ; then \

?90 ????????cp -f $(BSPDIR)/arch/$(ARCH)/$(CONFIG_ECC) $(BSPDIR)/kernel/ecos.ecc ; \

?91 ????fi

?92 ????if [ ! -d $(BSPDIR)/kernel/ecos_install ] ; then \

?93 ????????cp -f $(BSPDIR)/kernel/ecos.ecc $(BSPDIR)/kernel/ecos_work.ecc ; \

?94 ????????mkdir -p $(BSPDIR)/kernel/ecos_build ; \

?95 ????????cd $(BSPDIR)/kernel/ecos_build ; \

?96 ????????$(ECOS_TOOLS)/ecosconfig --config=$(BSPDIR)/kernel/ecos_work.ecc --prefix=$(BSPDIR)/kernel/ecos_install tree ; \

?97 ????????make -C $(BSPDIR)/kernel/ecos_build ; \

?98 ????????rm -f $(BSPDIR)/kernel/ecos_work.ecc ; \

?99 ????fi \

?

又是一個高潮,ecosconfig產生了世界,make -C $(BSPDIR)/kernel/ecos_build 它產能萬物。

它的目標只有一個:libtarget.a

于是乎完整了。

但是,在bsp目錄下,同樣有

include $(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak

80 $(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak: kernel

?81 ????echo "wwwwwwwwwwxxxxxecos.makxxxxxxxxxxyyyyyyyyyyyyyy:$@ : $^"

?

反復錘煉、拷打,這是不對的,何必這樣緊緊相逼。

這就是什么在make PROFILE=16MB oldconfig ,會這么久。

這就是為什么會出現一次“make[1]: “kernel”是最新的”。

?

至于make clean,再次分析

clean: router-clean bsp-clean

就2步,第一步太直接了,

第二步如下

bsp-clean:

????$(MAKE) -C $(BSPDIR) clean

#roy+++,2010/09/28 ?

????$(RM) -fr $(BSPDIR)/kernel

$(RM) -fr $(BSPDIR)/include/netinet

我們殘忍的rm了kernel,

?

第一次執行了,完全沒有什么太大的異常,很痛快。

?

再執行一次,會發現不再痛快了,

include $(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak

80 $(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak: kernel

?81 ????echo "wwwwwwwwwwxxxxxecos.makxxxxxxxxxxyyyyyyyyyyyyyy:$@ : $^"

?

這一句會再次去編譯kernel,原因很明顯了。

還有一點:如果你編譯下有一個目錄名與你的Makefile中的target一樣,target的時間戳即為同名目錄的時間戳。

?

原來一切的生死劫是它:ecos.mak, 而不是花千骨。

?

eCos編譯分解:

(1)?make kernel -------> libtarget.ld

(2)?make bsp -------> bsp.o

(3)?Make all ????????----------> ecos_lzma.trx

?

?

?

四、附

附ecos.mak的來源:

?

bsp/kernel/ecos_build/makefile中

?

build: headers $(PREFIX)/include/pkgconf/ecos.mak

?

$(PREFIX)/include/pkgconf/ecos.mak: makefile

@echo 'ECOS_GLOBAL_CFLAGS = -mips32...

?

這個ecos.mak原來是echo出的啊,

?

附 解決方案:

保密或自己想

附 make 兩次clean的結果:

?

BRCM ecos編譯好后,第一次 make clean:

第二次clean(它在Build eCos kernel library)

?

總結

以上是生活随笔為你收集整理的BRCM eCos下的编译及问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。