BRCM eCos下的编译及问题
王鑫宇 2015.7.15
一、引
我們一般編譯ecos如下:
(1)Make PROFILE=16MB oldconfig
(2)Make
OK了,產(chǎn)能了個(gè)ecos_lzma.trx 升級(jí)就行了。
比較奇它是如何產(chǎn)生的,產(chǎn)能的過程,組成的部分。如同Linux下,生成升級(jí)文件 ,只需要產(chǎn)生 vmlinuxz-lzma , target.squashfs 再用 BRCM的 trx工具一綁,過程還是很清楚的。
但eCos就摸不到頭腦了,因?yàn)檎麄€(gè)eCos就是一個(gè)大的可執(zhí)行文件。
最近感覺一直腦袋痛的小問題,(其實(shí)不算問題了),就是make clean 一次好像很ok, 在make 一次,就打印好多東西,誰也說不清。(見下面的附圖吧)
一直想跟一個(gè)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 這幾個(gè)目錄的編譯文件(.o .d),隨便把
src/router/shared/bcmconfig.h 這個(gè)也rm了,這幾個(gè)目錄都在src下面
?
before_oldconfig: 檢查你給的PROFILE文件在bsp目錄下是否存在,你要是寫錯(cuò)了,就給你一句:“You should run make PROFILE=8MB_AP/8MB_AP_B0/16MB/A5V1/A5V2”
熟悉吧。
然后把config_$(PROFILE) 這個(gè)文件 cp 為 bsp目錄下的.config
?
在這里多說幾句,區(qū)分8M 、16M這個(gè).config,除了wifi功能、應(yīng)用程序外,它也起要的作用。CONFIG_ECC="ecc-bcm947xx-router-tiny" 這個(gè)變量,這個(gè)文件在bsp/arch/mips/下面,感覺很這里的雖然看不懂,但是很牛逼。
?
Koldconfig:最終在bsp目錄下執(zhí)行
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會(huì)根據(jù)bsp目錄下的.config生成include/kautoconf.h (很貼心的命令)
?
接下來執(zhí)行 oldconfig本身就以下幾個(gè)命令:
????chmod u+rx scripts/lxdialog/lxdialog
????bash scripts/Menuconfig config/config.in save
????cp include/autoconf.h $(SRCBASE)/router/shared/bcmconfig.h
又是Menuconfig 產(chǎn)生include/autoconf.h,然后又cp為bcmconfig.h
在這里多說幾句,如果我們想增加一個(gè)功能配置進(jìn) .config 和系統(tǒng)中,如CONFIG_IPSEC,
1.把這個(gè)模塊加入在.config中
2.把關(guān)于這個(gè)的配置加入到config/config.in中,它是一個(gè)模板,為Menuconfig腳本使用
????comment 'IPSEC'
???bool ' ?Support IPSEC' CONFIG_IPSEC
3.編譯時(shí),會(huì)產(chǎn)生一個(gè)宏,__CONFIG_IPSEC__(由Menuconfig),生成在include/autoconf.h中。
此方法應(yīng)該使用在能夠模塊的代碼。
?
Oldconfig分析完成了,但它不是這樣的工作的,如果你再來一次
Make PROFILE=16MB oldconfig
你會(huì)發(fā)現(xiàn),這才是你要想的結(jié)果。
?
暫且擱置此問題。
?
2.第二步,make了
all: epivers version $(BSPDIR)/.config bsp $(obj-prelibs) $(obj-postlibs) ecos.trx ecos_lzma.trx cptftp
?
如上,就這幾步了,我們一個(gè)一個(gè)來。
(1)epivers??為了epivers.h,此文件都是SDK版本的宏定義
(2)version??和上面那個(gè)感覺差不多。
(3)Bsp?這是一個(gè)小高潮,$(MAKE) -C $(BSPDIR) 我們跟進(jìn)去 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即為此目錄下的遞歸編譯,
所以,當(dāng)你改動(dòng)到時(shí)BSP目錄下的文件時(shí),不用clean,它會(huì)幫你重新編譯鏈接。
Driver下面包括了無線、有線的驅(qū)動(dòng)。
?
(4)obj-prelibs?= $(filter bcmcrypto nas eapd wlconf utils, $(obj-y)) 這個(gè)太直接了。在這里,obj-y是已經(jīng)定制好的,所有要編譯的目錄
(5)obj-postlibs := $(filter-out $(obj-prelibs), $(obj-y)) 這個(gè)也太直接了
(6)余下幾個(gè)就是鏡像生成了,直接點(diǎn),
ecos.gz: ecos.bin ecos.map
gzip -c9 ecos.bin > ecos.gz
?
ecos.lz: ecos.bin ecos.map
lzma e ecos.bin ecos.lz
這兩個(gè)都依賴于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 這個(gè)包括了所有要編譯的目錄,以及bsp.o
TRX_LIBS = $(BSPDIR)/kernel/ecos_install/lib/libtarget.a 這也是個(gè)高潮了,kernel就是它了。
?
三、繼續(xù)
?
$(BSPDIR)/kernel/ecos_install/lib/target.ld 這是個(gè)鏈接腳本,它在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 了,應(yīng)該是BRCM寫好了的。
?
很多情況下缺少target.ld這個(gè)文件 ,就是你kernel沒編譯通過的原因。
?
產(chǎn)生ecos, 再生成壓縮文件就不是問題了,有木有發(fā)現(xiàn):libtarget.a 它是怎么來的啊,說了這么多費(fèi)話,就是沒提它呢?
?
世界那么大,就是少不了它:libtarget.a 神一樣存在的kernel,你在哪里啊,我一直在尋找,直到我發(fā)現(xiàn)我一直在錯(cuò)過,是多么不懂得珍惜。
?
在編譯目錄下的Makefile中include $(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak
?
大膽放肆的存在:
Ecos kernel的路徑:src/ecos/ecos-3.0/packages 與ecos官網(wǎng)上的一樣。
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都會(huì)去執(zhí)著的尋找ecos.mak,它將成為編譯的FB(第一個(gè)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 \
?
又是一個(gè)高潮,ecosconfig產(chǎn)生了世界,make -C $(BSPDIR)/kernel/ecos_build 它產(chǎn)能萬物。
它的目標(biāo)只有一個(gè):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:$@ : $^"
?
反復(fù)錘煉、拷打,這是不對(duì)的,何必這樣緊緊相逼。
這就是什么在make PROFILE=16MB oldconfig ,會(huì)這么久。
這就是為什么會(huì)出現(xiàn)一次“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,
?
第一次執(zhí)行了,完全沒有什么太大的異常,很痛快。
?
再執(zhí)行一次,會(huì)發(fā)現(xiàn)不再痛快了,
include $(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak
80 $(BSPDIR)/kernel/ecos_install/include/pkgconf/ecos.mak: kernel
?81 ????echo "wwwwwwwwwwxxxxxecos.makxxxxxxxxxxyyyyyyyyyyyyyy:$@ : $^"
?
這一句會(huì)再次去編譯kernel,原因很明顯了。
還有一點(diǎn):如果你編譯下有一個(gè)目錄名與你的Makefile中的target一樣,target的時(shí)間戳即為同名目錄的時(shí)間戳。
?
原來一切的生死劫是它: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...
?
這個(gè)ecos.mak原來是echo出的啊,
?
附 解決方案:
保密或自己想
附 make 兩次clean的結(jié)果:
?
BRCM ecos編譯好后,第一次 make clean:
第二次clean(它在Build eCos kernel library)
?
總結(jié)
以上是生活随笔為你收集整理的BRCM eCos下的编译及问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ecos无线驱动掉线问题解决方案分析
- 下一篇: CentOS8更换源后失败问题