170 likes | 414 Views
Makefile Introduction. Cuke.wang SWI HQ 01/10/07. 第一部分:总的介绍 第二部分:详细的过程分析. 过程. MTK 平台具体的代码表示. 1) Make 命令 Make *** gprs(gsm) new
E N D
Makefile Introduction Cuke.wang SWI HQ 01/10/07
第一部分:总的介绍 第二部分:详细的过程分析
MTK平台具体的代码表示 • 1) Make 命令 Make *** gprs(gsm) new • 2) 编译 Comp.mak armcc -apcs /interwork -c -cpu ARM7EJ-S -littleend -O2 -zo -fa -DMAX_PHB_PHONE_ENTRY=300-Ij2me/jal/include -o ./build/D169E/gsm/MT6217o/custom/custom_emi.obj custom/system/D168_BB/custom_emi.c • 3) 链接 Gsm2.mak armlink -map -info sizes,totals -symbols -xref -remove -scatter custom\system\D168_BB\scatD169E.txt -output .\build\D169E\D169E_PCB01_gsm_MT6217_BN.elf -symdefs .\build\D169E\D169E_PCB01_gsm_MT6217_BN.sym -list .\build\D169E\D169E_PCB01_gsm_MT6217_BN.lis -libpath c:\progra~1\arm\adsv1_2\lib .\build\D169E\gsm\MT6217o\lib\init.lib(bootarm.obj) …
Makefile文件 • make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序 • 一、Makefile的规则 target ... : prerequisites ... command
make是如何工作的 • 在默认的方式下,也就是我们只输入make命令。那么, • 1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。 • 2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。 • 3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。 • 4、如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程) • 5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。
第二部分:1、命令的解释 • 使用Perl语言 • if (($action eq "remake") || ($action eq "update") || ($action eq "new")|| ($action eq "bm_new")) { if ($action eq "bm_new") { system("echo BM_NEW=TRUE >> ${makeFolder}~buildinfo.tmp"); $result = system("${makeCmd} -f${makeFolder}${myMF} -k -r -R CUSTOMER=$custom PROJECT=$project new"); } tools\make.exe -fmake\gsm2.mak -r -R CUSTOMER=mtk PROJECT=gprs new
2、编 译 • 1) 格式:Compiler [ search paths] [output-format] [target-option] [source] 在MTK:$(CMPLR) $(VIA) tmp0.txt tmp0.txt 的生成: remake n tmp0.txt $(CINTWORK) $(CFLAGS) $(CDEFS) $(CINCDIRS) $(MD) -o $(COMPOBJS_DIR)/$@ $<自动生成 • 2
3、链接 1)格式:armlink [-output] [-elf] MTK: $(BIN_FILE): ($(LINK) $(VIA) make\~libs.tmp > $(LOG) ) 2)重要的选项: Scatter: 定义映像文件的地址映射 目前在项目中常使用NOR FLASH 128Mb+pSRAM 32Mb 定义了加载时域和运行时域 在H330:四个加载时域,所以烧写代码分为四个 在D169E:一个加载时域。
Scatter文件分析 • ROM 0x08000000 { } 在程序中,Flash的片选脚是ECS0,而SRAM的片选脚是ECS1 • LANG_PACK_ROM 0x8AF0000 { } (+RW) ?? • CUSTPACK_ROM 0x8B90000 { } • JUMP_TABLE 0x08DFFE00 0x200 { } 对应于四个加载时域的文件
ROM • ROM2 +0x0 0x400000 { .ANY (+RO-CODE) } //C语言的lib memcopy • ROM3 +0x0 • { .ANY (+RO-DATA) } • EXTSRAM_LARGEPOOL_NORMAL 0x00000140 { j2me_custom_resource.obj (JAVA_ALIGN_ZI, LARGEPOOL_ZI) • med_main.obj (LARGEPOOL_ZI) • ScrMemMgr.obj (LARGEPOOL_ZI) } • EXTSRAM +0x00 • { • * (+RW, +ZI) }
.lis分析 • 对应于Scatter文件的运行时域的文件 • 存贮位置:外部ROM 1) Const system_jump_table 0x08dffe00 Data 416 custom_jump_tbl.obj(.constdata) 2) Arm Thum 指令 • 外部RAM 1)全局变量 (+RW) flash_id 0x000d04fc Data 2 custom_emi.obj(.bss) 2)静态变量 (+ZI) System_Mem_Pool 0x00129404 Data 286720 custom_config.obj(.bss) • 内部RAM • 内部ROM
vpath • vpath %.s $(subst \,/,$(SRCPATH)) • vpath %.c $(subst \,/,$(SRCPATH)) • vpath %.cpp $(subst \,/,$(SRCPATH)) • vpath %.h $(subst \,/,$(INCDIRS)) • vpath %.dat $(subst \,/,$(INCDIRS)) • vpath %.obj $(COMPOBJS_DIR)
Make2.pl • if (($action eq "remake") || ($action eq "update") || • ($action eq "new")|| ($action eq "bm_new")) { • if ($action eq "bm_new") { • system("echo BM_NEW=TRUE >> ${makeFolder}~buildinfo.tmp"); • $result = system("${makeCmd} -f${makeFolder}${myMF} -k -r -R CUSTOMER=$custom PROJECT=$project new"); • } • tools\make.exe -fmake\gsm2.mak -r -R CUSTOMER=mtk PROJECT=gprs new
{ • if ($#arguments != -1) { • system("echo DO_CLEAN_MODULE=TRUE > ${makeFolder}~cleanmod.tmp"); • system("echo CLEAN_MODS=@arguments >> ${makeFolder}~cleanmod.tmp"); • system("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOMER=$custom PROJECT=$project cleanmod"); • } else { • system("echo DO_CLEAN_MODULE=FALSE > ${makeFolder}~cleanmod.tmp"); • system("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOMER=$custom PROJECT=$project cleanall"); • } • }
XXX_PCBXX_gprs_MT62XXX_S01.lis • 该文件由ARMlink根据Scatter文件生成 构成: Global Symbols NeedExitFunc 0x000ce1b0 Data 1 FactoryModeSrc.obj(.data)