版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文件适用djyosV0.4.1及以后版本。2、自动化程度高,任何下增加删除改名文件或子,只需修改该下的makefile文件即可,不但总控makefile在内的所有其他makefile都不用修改,就连连接.ld文件也自3、应用程序增减源程序文件和时,当前下的makefile需修改的部分也很少。可能要改的只有6行,实际上可能只有1行需要改。makefile的功makemakefile文件就是定义了一系列制作目标的规则。make的目的,就makefile中描写的规则的指引下,生成最终所需要的目标,什么是最终目标呢?最终目标是执行make命令时从命令行输入的:makerm- *.ldrm命令成功执行,clean目标就算完成了。make$(sub_make)-fmake_ld$(sub_make)-fmake_ld编译生成的文件说明 编译命令和目标说明boot_rom.bin文件,这个文件只包含启动代码,然后就进入死循环。当需要用硬件仿真器调试操作系统时,就应该先编译boot_rom.bin并烧录到0地址的norflash中。2makedebug编译产生产生用于调试的debug.elf文件,编译器的优化级别是0,且含gdwarf-2格式的调试信息,由调试软件比如realview2.2或gdb直接加载到内存中调试。3makerun_inram0norflashrun_inram.bin,由于经过会自动把代码copy到ram中,自动执行内存操作,然后跳转到ram中执行,si版本的djyos没有独立的bootloader,可近似理解为si版本内含bootloader的部分功能。本命令产生run_inflash.bin文件,与run_inram命令相似,唯一不同的是,本生成的可执行文件不把代码copyram中,而是直接在flash中运行,适合于在ram很少的单片机中使用。5makeclean何时应该使用make不会重编译。比如两次编译间,a.ca.ca.oa.o就不会被重新编译,但有时候,我们不希望这种“查新”机制起作用,就要用makeclean命令把目标文件删掉,强制重新编译。原理上讲,如果依赖关系做得好,头文件也成为.o文件的依赖文件的话,头文件修改后,编译c源文件的依赖关系很复杂,并且在编程过程中会有调整,要完全描述这种依赖关系变得很,且makefile会很复杂难读。因此,djyos的makefile不描述头文件和C文件的依赖关系,故在修改头文件后,需要执行makeclean命令删掉所有.o文件,强迫重新生成所有.o文件。makedebug编译调试版本makerun_inramdebug时,已经产生了.o文件,而.c文件又没有修会重是直debug时产生的.o文件重run_inramdebug的发布源代码时,实际上只希望发布源代码文件和.binmakeclean删掉其他编译产------------------------如果你只是想知道如何编 djyos,到此为止--------------------------修改总控makefile在工程下,比如工程是myprj,则myprj下的makefile文件就是总控makefile文件了。djyos被移植到新的cpu,或者改变指令集(由ARM改为thumb),或者改变器大小端时,makefilemakefile中这些内容都用变量表示,makefile总共只有几十行,绝大部分在移植时是无需修改的,即使上述几个方面同时需要调整,需要修改的也不超过10行。一般情况下只需要修改:CPUarm7tdmi \trom :org= len=\tram :org= len= 添加和修改子工程中添加子或者源程序文件时,就需要添加子makefile,当改名、删除子或者源程subdir=rom_init=preload=sysload=critical=双引号,行末也没有分号或其他符号,比如在driver下有两个包含源程序文件的子:uart、和flash_chip,则driver下的makefile中subdir的值就这样描述:subdir=uart subdir=uartflash_chiptty下也要添加makefile,只要从其他copy一个过来,再修改前述几个变量的值添加和删除以及改名源文件的方法相当简单,就是修改相应下的makefile中的boot_rom、rom_init、preload、sysload、critical中的一个或几个变量。---------------如果你不打算分析djyos的makefile实现方法,就此止步吧makefile在工程下,比如工程是myprj,则myprj下的makefile文件就makefilemakefilemakefilemake_ld文件,为什么要分成两个呢?是为了实现自动化生成连接文件,待介绍make_ld文件的时候再仔细说明。下面开始介绍makefile的各部分代码,斜体部分是从makefile文件中copy的代码。变Cmakefile的变量。其实这两者的差别非常之大,C语言的变量是一个地址makefile的变量就是字由空格分开的连续的字符构成一个单词。makefile有许多方法处理变量,实际上处理的是字符串。makefile中,这些字符串不需要用双引号。1exporttopdir=$(s 路径名字符串。exporttopdir=$(spwd)的含义是,利用操作系统的s命令取当 ,由于总控makefile在工程根 的路径名,赋值给topdir。export的含义是使topdir在子makefile中可见,注意,在子makefile中,topdir的值仍然是工程根目2MCUarm7tdmi3sub_makeexportsub_make=@make--no-print-@的含义是不在屏幕上输出本行命令,--no-print-directory是不输出进入和离开某子 这两者的使用使得屏幕输出比较简洁,当调试makefile时,可打开这两类输出,帮助定位错误。45、其他变量 AS:汇编器名,gcc中汇编器和c编译器都使用arm-elf-gcc。 生成目1rm_obj_list删除编译子中产生的ld_obj_list文件,这是一个临时文件,如果上一次的编译过程成功完2、 中间目顾名思义,这个目标是进入子,执行子下的编译任务,在子的makefile中,又以同样令执行子子的编译任务,就这样一级级嵌套,直到所有子下的变异任务全部完成。$(subdir)$(sub_make)-C$@ 命令,$(subdir)subdir变量展开,$@makefile中比较晦涩难懂的符号,意思是$(subdir)$(sub_make)-C$@$(sub_make)–Capp$(MAKECMDGOALS)$(sub_make–Cdjyos$(MAKECMDGOALS)3、最终目标debug\run_inram\run_inflashboot_rom:rm_obj_list$(sub_make)-fmake_ld自动生成连接ld文编译产生的是可重定位的目标文件,目标文件中不包含地址信息,需要经过连接后才能生成真正可执行的文件。连接文件就是告诉器如何连接目标文件的文件,不同的编译系统对1、器描述,描写系统中的器配置,比如44b0版本的ld文件的器描述如下:{rom(rx) :org=0, len=2Mram :org= len=}norflash;第二块是可读写和执行的,起始地址为0xc000000,长度8M,对应sdram。3、输出可供连接器识别的符号,比如djyos的器管理模块就需要cfg_heap_topmakefile中,用这几个变量:boot_rom、rom_init、preload、sysload、critical表示具体文件成方法和变量含义参见子makefile的说明。rom_init_obj+=preload_obj+=际上是makefile文件的一部分,由make_ld文件用:ifneq($(target),)包含进来的,5debug、run_inram、run_inflash、boot_rom5个*.mld文件,该文件对应5个用于描述5个最终目标的连接文件。*.mld文件非常简单,就是用1条s内置函数printf生成*.ld文件,并把输出转向保存到*.ld文件中。连接生成可执行文件$(sub_make)-fmake_ld$(sub_make)-fmake_ldincludeld_obj_listifneq($(target),)includeld_obj_listifneq($(target),)debug$(objcopy)$(target).elfrm-fld_obj_list$(objcopy)$(objcopy)$(target).elfrm-fld_obj_list$(CC)$(LDFLAGS)$(rom_init_obj)$(preload_obj)$(critical_obj)$(sysload_obj)-o-$(objcopy)$(target).elfrm-fld_obj_list$(CC)$(LDFLAGS)$(rom_init_obj)$(preload_obj)$(critical_obj)$(sysload_obj)-o-$(objcopy)$(target).elfrm-fld_obj_listmake_ld$(sub_make)-fmake_ld$(CC)本文件,除了一个目标后连续出现令是按顺序执行的外,其他的一切,比如变量,include等,a= c=c= a=$(sub_make)-C$@时自动就要确保实includeld_obj_list必须在生成$(subdir)makefile和而现在的做法,最终目标依赖$(subdir),可以确保在完成$(subdir)目标之后$(sub_make)-fmake_ld 所有子makefile文件中,第10行开始是雷同的,本想在工程根 下用mksubinc文件描述雷同部分,然后在子makefile中用:includemakefile:11:/cygdrive/g/siyf/mksubinc:Nosuchfileor源文件和下 描 currentdir=$(spwd)subdir=appdjyosrom_init=preload=sysload=critical=12 下,有app和 ,而 3 4rom初始化部分代码,这些代码在复位后在rom中执行,除非你打算利用MMU重映射ram5些代码由rom_init中的预加载器copyram中,然后把控制权交给预加载器。67生成中间变量ifneqboot_rom_asm=$(filter%.s,$(boot_rom))boot_rom_asmobj=$(patsubst boot_rom_c=$(filter%.c,$(boot_rom)) boot_rom_obj=$(patsubst 推导出boot_rom_asmobj、boot_rom_cobj、boot_rom_obj三个中间目标变量,boot_rom_asmobjrom_init、preload、sysload、critical这5个变量。填写ld_obj_list文件@printf"rom_init_obj+=$(rom_init_obj)\n\boot_rom_obj+=$(boot_rom_obj)\n\criti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电缆生产的卓越之路-工艺优化与质量提升策略
- 人教版三年级语文下册教案
- 电子商务公司财务部管理办法
- 城市照明改造工程中心管理办法
- 美容院安全消防施工合同
- 市政工程招投标代理合同范本
- 税务局铝塑板安装施工协议
- 皮革厂消防巡查员聘用协议范本
- 体育场馆紧急疏散预案
- 教师劳动合同小学师资保障
- 四年级上综合实践-今天我当家
- 工商管理学科发展前沿
- 账号转让协议模板
- 夜市经济项目融资计划书
- 幼儿园主题班会小小工程师创造奇迹课件
- 【临床猫瘟的诊断与治疗3500字(论文)】
- 喀什地区旅游线路规划方案
- 新能源汽车技术职业生涯人物访谈报告
- 天津市武清区2023-2024学年八年级上学期期中地理试题【含答案解析】
- 山东省临沂市沂水县2023-2024学年八年级上学期期中数学试题
- 基于DHMM和VQ的关键词识别研究与实现的开题报告
评论
0/150
提交评论