现在依然有许多人在运用ADS1.2编译ARM9的程序,这款编译器实属经典,可是现已多年中止更新、保护了。这篇文章首要解说ARM公司受够Keil之后力推的一款编译器MDK。
MDK的运用上和ADS1.2有许多相似之处,从ADS1.2过渡到MDK也是十分简单的一种作业。
仍是无图无本相。
<一>这是MDK翻开的景象,当然我这现已是一个建立好的工程。假如一开始是空的,按图点击project–>new uvision project即可。
<二>
关于工程名的命名,修正,增加文件等与其他的编译器无异,信任咱们都会的。这儿要点解说戏法棒的装备
<三>
能够看到介面上有个Target Option选项。这才是该编译器强壮的地点。
设备挑选,咱们依据实践情况挑选即可,我这儿挑选的是S3C2440A
时钟部分为模仿调试的时钟,默许即可。
操作系统部分,MDK供给了一个实时操作系统,便于咱们开发RTOS上的程序,假如不需求,能够选无。
能够挑选ARM或许Thumb代码形式。
为只读内存的区域装备:有内部的ROM on-chip,有外部的ROM off-chip这个依据自己实践情况挑选。S3C2440A无片上能够运用的ROM,可是或许会外接ROM,比方
Nor或许NAND。为你的方针板上有的资源打上default勾选。
为读写内存区域装备:有内部的RAM on-chip,有外部的RAM off-chip这个也是依据自己实践情况装备。S3C2440A有内部RAM,为0x40000000的4K巨细,NAND时分会被映射到BANK0。
NOTE:::以上内存的区域装备是很灵敏的,除了依据你自己的方针板实践装备外,还能够依据你的意图来装备,你或许需求将RAM也模仿成ROM,这样便于调试等等。
这儿选项很简单,默许没有勾选Create HEX File,能够勾选上。也能够依据需求生成方针库。也能够为方针文件独自挑选寄存文件夹,使工程文件明晰。
List也能够挑选寄存的目录。能够挑选输出的内容文件。比方内存映像文件,符号文件,调用联系,穿插引证,生成文件的内存信息,未运用的section信息等。
便于检查。
选项也很明晰。要点是bulid后的用户程序。一般是用来将自己生成的axf转换为bin文件,和ads1.2很像。可是它比ads1.2至少强在一当地。
咱们或许留意到–bincombined–bincombined_padding=1相似的指令,该指令存在的原因跟scatter文件有关。
scatter文件描绘了怎么组成自己的输入段,构成加载域,碑文域,终究依照要求得到自己想要的内存布局文件。
BUT假如存在两个及其以上的加载域的话,生成的二进制文件会有多个,尽管咱们能够自主的烧写到咱们的方针存储区,可是这无疑增加了咱们的担负!
在ADS1.2中,是没有直接的方法将多个bin文件衔接在一起的,只能运用H-JTAG相似的东西,将多个bin文件转为HEX文件,拼接起来,再转为bin,有些费事
可是MDK下,直接运用这个指令即可完结将多个bin连成1个bin文件,是很便利的。这样scatter文件的多个加载域就不是问题了。
没什么特别的,留意默许优化等级的挑选对应是level2。正告的话,能够选显现悉数正告信息。
自己工程的头文件途径也要直接增加好,否则找不到。
与上一个选项卡相似。
linker选项也是十分重要的。默许的不是这个图的款式,是勾选了“运用方针选项卡里的内存布局”组织RO RW段。
一般情况下,这样的确是能够的,可是假如自己有特别的要求,是需求自己写scatter文件的。这个图便是我自己写的一个scatter文件,未运用默许选项,所以未勾选。
微操控指令下能够自己写上对应的指令,比方这儿的指定进口等等。
左右对称的选项,要点是右边,尽管模仿也很强壮,可是咱们一般都是有方针板的,所以仍是硬件调试的手法。
能够选用的有Jlink Ulink等等,我手头有个山寨的Jlink,所以挑选Jlink了。
下面的勾选框标明将自己要调试的文件下载到startup里,以及是否直接运转到main()函数。这个要依据实践需求来。
很或许你并不想运用MDK供给的库功用,就好像你不想运用ADS1.2供给的库功用相同,不运用main函数,那么就不存在run to main()。
很或许你是用SDRAM模仿ROM,在SDRAM中调试代码,也或许不需求将代码下载到starup。
抑或你在SDRAM中调试,运用了调试脚本,调试脚本里现已做了这2项作业,也是不需求勾选的,能够自己逐渐测验。
使用选项卡,是针对Flash使用的。能够挑选flash烧写东西。
点击设置能够进入Flash挑选,假如不存在自己的flash类型,能够自己增加算法,MDK手册有模板教你一步一步增加自己的Flash算法,比方nor nand之类的都能够增加。
Ramfor Alg是用于烧写算法的空间,MDK手册是说一般用内部RAM。
要点的都讲完了,老规矩,以点亮LED完毕这篇文章吧。
s3c2440.s
areainitcode,code,readonly
preserve8
code32
entry
export__start
__start
ldrsp,=1024*4
importdisable_watch_dog
importmemsetup
importcopy_2th_sdram
importMain
bldisable_watch_dog
blmemsetup
blcopy_2th_sdram
ldrsp,=0x34000000
ldrpc,=Main
halt_loop
bhalt_loop
end
led.c文件:
#include”S3C2440.h”
#define gpbcon (*(volatile ulong *)0xa0000010)
#define gpbdat (*(volatile ulong *)0xa0000014)
static __inline void wait(ulong dly);
#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
#define GPB7_out (1<<(7*2))
#define GPB8_out (1<<(8*2))
static __inline void wait(ulong dly)
{
for(;dly > 0; dly–);
}
int Main(void)
{
ulongi = 0;
gpbcon= GPB5_out | GPB6_out | GPB7_out | GPB8_out;
while(1)
{
wait(3000000);
gpbdat= (~(i<<5));
if(++i== 16)
i=0;
}
}
内存布局scatter文件:
;*
; * Scatter-Loading Description File generated by uVision *
; *
LR_ROM1 0x00000000 0x00200000 { ; load region size_region
NANDFLASH 0x00000000 0x00200000 { ; load address = executionaddress
*.o (initcode, +First)
.ANY (+RO)
}
}
LR_ROM2 2048 2048 {
SDRAM 0xb0004000 {
led.o (*)
}
}