1.首先是要建立工程,new->ARM Executable Image,输入名称test,路经,ok.
2.然后再test.mcp的对话框里面右键->add files选择添加的文件,或者自己写文件。这里面就有个问题,添加文件的时候一定要看这个文件有没有必要,与本项目无关的文件一定不要加,否则会牵连出一大堆的变异错误,所以可以考虑先从main.c开始,加入后编译,看看编译中的错误涉及到哪些文件(肯定有一些宏或者变量在另外的文件中定义),再逐一的加入,切不可乱加一气。
3.编译,改错。
4.单击test.mcp对话框上的下拉菜单可以选择编译的种类:debugrel,debug or release
5.单击test.mcp对话框上的debugrel/debug/release settings...按钮进行配置:
首先是左侧栏的target-〉target settings,如果想要编译输出二进制文件,那么就要在post-lingker里面选中ARM fromELF
其次是linker-〉ARM linker,output属性页可以设置链接类型:简单或者是散列(scatter),后面可以设置ro和rw的地址,注意:如果是在调试阶段,那么我们在ro中要写成0x0c000000,rw中要写成0x0c5f0000,这是因为此时代码是下载到SDRAM中运行的,这段代码将在系统关机后消失,而SDRAM的开始地址就是0x0c000000。如果我们是在发布阶段,那么我们要在ro中要写成0x00000000,rw中可以写成0x0c00000,此时,程序代码被直接下载到sst39vf1601的flashROM当中,掉电也不会消失,且系统每次重启时都会执行这段代码,而我们将rw就写到了hynix的SDRAM中,既数据区占用了整个的SDRAM。之后是Layout属性页,这里我们要设置object/symbol和section,前者要设置成xxx.o文件,这个文件是要放在程序前面的,用来定义和声明一些宏和变量,中断向量,等等。section里面放置开始的段标记。
再次是lingker-〉ARM fromELF,如果想要输出二进制文件时就要把output format设置为plain binary,下面的output filename设置输出文件的路径和名字,注意:如果不设置后面的output filename的话是不会得到二进制文件的,所以说这个不要忽视。
设置完毕,单击ok退出。
6.重编译,去刚才设置的路径里面看看有没有二进制文件吧。
7.单击test.mcp对话框上面的debug按钮启动AXD调试器。此时如果电路已经连接好的话调试器就可以直接加载.axf映像文件了。
8.下面说说对于AXD的配置:
单击菜单栏options-〉config target,可以选择调试的模式:
ADP是硬件调试,通过网线和jtag转并口连接线连接电路板
ARMUL是软件仿真,可以看一些寄存器的值
如果安装了h-jtag的话还可以选择用h-jtag来进行调试,方法如下:
在安装h-jtag的情况下,单击AXD-〉options->config target,在出现的对话框中点击ADD,选择所安装的h-jtag安装目录下的.dll文件,点击确定,就可以在AXD里面安装h-jtag的调制方式了。
连接好电路,选择正确的调试方式,点击ok,AXD就会自动地将调试文件.axf下载到目标板中去(0x0c000000),之后就可以进行单步调试了。
下面再介绍一下h-jtag的使用方法:
总体上来讲,h-jtag是一个flashROM的下载器,也就是说它只能下载到目标板的flashROM中。对于S3C44B0X来说,使用的SST39VF1601 flashROM为2MB,地址范围为0x00000000~0x00200000。也就是说利用h-jtag只能将代码烧录到这段地址当中。而我们知道,这段宝贵的地址是用来存放我们系统的bios的,里面无非是定义了一些变量和宏,以及中断矢量,之后便会跳转到正式执行代码的地方,这个正式存放代码的地方可以是SDRAM,此时系统用于调试,sdram中的代码断电后消失;也可以存放在这2MB flash空间后面剩余的地方,这也就是我们以后编译完整的大型系统程序时直接把生成的二进制文件烧录仅从0x00000000开始的地址的原因(此时我们的这个文件已经包含了bios的功能模块)。
还有就是h-jtag可以自动监测你的目标机的芯片类型,这还是很方便的。
另外,如果使用S3C44B0X开发板的14针jtag转并口的话,必须在h-jtag:settings-〉jtag settings下面的jtag selection中选择sdt jtag,否则系统监测不到你的目标机。关于h-jtag的更详细的内容请自行参考相关文档。
还有就是说一下关于jtag.exe和fluted.exe两个命令行模式的文件的使用。
对于Jtag.exe,需要先安装giveio.sys,然后利用命令allowio jtag.exe /a就可以了启动jtag.exe。
对于fluted,其实和h-jtag差不多,也是用来烧写flash的,它需要在Jtag运行的情况下,还需要有.fcd,.bsp,.bin等等文件在一个文件夹下,然后才可以运行,速度比较慢。
昨天算是正式的开发出来了hello world程序,相比前天而言又有一些新的心得,说是经验也好教训也罢,好学者无所谓耻,不懂装懂才是大忌,一并列在下面,有贻笑大方之嫌,只为同道的学弟学妹能少走点弯路。
首先要谈的是一些题外的话。也算是经历过了一些开发,个人感觉如果要给开发时间做个预算的话是很困难的事情,尤其是对于以前根本就没有接触过的技术。有可能你看书也看懂了,思路也理清了,基本的技术也摸透了,这些大概是我们在做开发时间预算时的主要依据,但最要命的却是一些莫名其妙的问题。比如一个很典型的例子就是开发环境的选择和搭建,不要觉得这是个很简单的事情,首先在选择上面就有说道。众所周知的事我们是个“盗版大国”,那么这里面可能就有一个开发工具的版本问题以及授权问题,恐怕我们这样的在校生这方面的资源还比较丰富,以后进了公司的话恐怕就没有这么充足的资源了,所以大学在校的资源要好好利用。就拿这次我的这个项目来讲,大概比较盛行的ARM开发工具也就3、4种,比较常见的有SDT2.5,ADS1.2等等,各种教材一般也是依照这两款开发工具编写的,而现在sdt大势已去,不过现有的一些资料还保留着大量的sdt源代码,当初我也是觉得没什么,如果它们都是高级语言的话就应该是相通的,不过后来就发现sdt工程里面可以顺利编译通过的程序却在ads里面报错,以下是两个很常见的错误:
一是有关.a文件和.s文件的读写问题,我们知道在sdt工程的target文件夹下有两个.a文件:memcfg.a和option.a,这两个文件在sdt2.5下可以顺利地读取,不过在ads里面却不能识别,必须把二者的扩展名改为.s,也就是由参考文件转换为源文件,而且还要在引用这两个文件的44binit.s文件中的
GET option.a
GET memcfg.a
两个语句改为:
GET option.s
GET memcfg.s
并且将option.a memcfg.a 重名名为 option.s memcfg.s 。
一定不要包涵在工程文件中。这样这样才能被ads识别。
还有一个问题到现在都没有解决,就是关于ads和sdt的浮点数(endian)的转化问题,昨天这个问题搞得我很头疼,索性直接打电话给中关村卖我开发板的那家公司的技术部,结果被认定是很莫名其妙的问题,不了了之,所以干脆就换了一个开发环境(ADS1.2),放弃sdt里面的文件,于是这样才搞通。
以上说了这么多的废话,要说明的不只是技术问题,而是我们必须对我们开发环境的搭建有足够的认识,对其中会碰到的莫名其妙的问题有足够的心理准备,否则还没等你正式进入开发工作便已弄得心浮气躁了。
再插一句,说到心浮气躁突然想起那天和老田谈了三个多小时,感觉现在的大学生最大的特点就是一个“躁”字,你如此,他如此,我也如此。这个“躁”分两种,一是“浮躁”,华而不实,蜻蜓点水,二是“急躁”,急功近利,好大喜功,“多快好省”的一套。本人更倾向于后者,曾经方言如果给老子一个很牛b的技术让老子干啥都成,不知这种心理状态会不会对未来产生什么样的影响呢,呵呵。
所以这两天就总结,通信里面也有五行和八卦。五行是:视野、意识、表达、技术、心态,且重要性依次降低,这主要是对个人的发展来说的。而八卦是:市场、管理、人才、资金、技术、创意、人脉和XX,最后一个没想好,暂且放在此吧,大家有兴趣的可以帮我补上,这八个因素是针对一个企业的发展来说的。一个企业最关键的就是市场,所以说市场是企业的爹娘,没有市场的话后面七者根本就谈不上,所以为什么我们改革开放的二十年民营资本如雨后春笋的壮大,就是因为在缺少竞争力的传统国企笼罩下的大钟市场几乎是一片空白,而现在我们说做企业难,其实是说这个企业的市场很难扩大,因为竞争对手很多,而市场本身对于用户来说并没有达到饱和,所以这就是为什么我们要想赚点小钱只需在某个小区里面开个便利店就可以了,但要想把便利店做成国美和华联恐怕就不是那么的容易。管理是企业的灵魂,这就涉及到那个当前很时髦的团队问题。人才是动力,企业是人做出来的,社会也是人们作为一个团体的表现形式,优秀的人在社会和企业中就会发挥更大的作用,所以我们必须把人的主观能动性调动起来,人才是不竭的资源,但并不意味着人才资源对你的企业来说是丰富的。有人又会谈到有关“孙悟空”的问题,没错,这样的员工的确难找,但是更难的事如何留住这样的员工让他为你服务,所以说现在的那些企业张口闭口企业文化,我看一般说这样话的人本身就没什么文化,企业的文化在于它潜移默化的感染力,而不是上下嘴唇一碰就能出来的,由此想到前一阵子看《赢在中国》,其中马云就问了一个入围32强的年轻小伙子,他是怎样贯穿企业文化的,显然那个小伙子对这个没有充分的准备,临场发挥说他们公司在员工过生日的时候都会招开大会表示庆贺,小伙子的随机应变和头脑灵活是值得肯定的,但这个想法实在糟糕:首先是这样的活动很留于表面,说白了还是一个“躁”字,其次的话,除非他不想把企业做大,否则的话以后如果企业有了成百上千的员工的话那么几乎天天召开这样的大会似乎是很无聊的事情,至少我是不会去的。其次就是资金,对于资金这东西现在大家的看法又有点“躁”,有人浮躁,觉得资金这东西没什么了不起的,别天天拿资金不足说事儿,这我同意,如果一个项目如果在开始计划时就得出除了资金什么都不缺的结论的话,那么这个项目可以断定就是个垃圾,所以现在书市和媒体上充斥着诸如《两万元开店》《两万元帮你赚大钱》之类的书籍或是新闻,同志们看都别看,骗人的。但是也千万别轻看了钱这东西,有人说:我懂,不就是“钱不是万能的,但没有钱是万万不行的”么?我说:你不懂。一个企业的资金运作我觉得可以看两点:一是资金流,不在乎你企业现有资产是多少,不在乎你年收入多高,不在乎你企业规模多大,而在于你企业的钱是不是“活”的,钱能生钱,但死了就没有繁殖力了——它可不是蟑螂。二是要看你的钱用在了哪,好钢用在刀刃上,资源合理分配是每个企业面临的一道难题。技术是核心,技术和创意往往是在一起的。创意这东西就好比IQ,企业有了创意就好比你这个企业的IQ比较高,容易发现未来的市场,不过这就有个龟兔赛跑的问题,兔子之所以会输,一方面是因为他睡觉了,另一方面是因为:它是兔子,它不是乌龟。我要是乌龟的话绝不会选择在公路上比赛,我会选择在水里。游泳作为一项技术来言对于一个旱鸭子来说是致命的,可能你刚开始跑的比较快,但跑道是公路,你能跑,我虽然慢点,但只要努力的话就总有赶超你的一天,而游泳是兔子不可逾越的鸿沟,原因是它的两只大耳朵不能想机器猫的竹蜻蜓一样当螺旋桨用。所以,说了半天废话最终归结为:要迅速的摆脱对手,除了要有可以使你短期领先的创意之外,还要有让同行望尘莫及的技术门槛——一个典型的例子就是ARM,由此拐来拐去终于拐回了正题,佩服自己。(关于人脉我不想多说,原因是我不懂,原因是大家都懂。)
前两天去参加了深圳英蓓特在中关村举办的颁奖大会,正因为在会议上受到了煽动和鼓舞,才会放弃原来的技术路线改用ARM的解决方案。ARM本部公司非常的聪明,他们并不生产芯片,他们只生产“ARM内核”,所谓的内核可以理解为一种思路,一个黑箱,而把芯片的生产授权给其他公司,这样其他公司永远不会知道arm核心的思想到底是什么,而且又实现了双赢,arm公司本身又可以集中精力和资源开发技术门槛,高!
那么现在继续说我们这个hello world项目,呵呵,大家保持冷静~~~。。。
程序本身应该是没什么问题的,不过好像超级终端的设置存在问题,使用uart串口发送数据被显示成为乱码,后来得知,这种乱码的情况一是因为可能波特率不匹配,二是因为你必须在“属性”里面的“设置”页,选中“以7位ASCII码来显示接受的数据”。
还有的问题就在于我发现这个uart函数本身有点问题,它的实现里面有点莫名其妙,本来128个ascii码它却用256位的数组来盛放,所以导致ascii码是重复的,也就是你输入的A/B/C/D/E/F/G/H会对应:A/B/A/B/C/D/C/D...以此类推,而且有时候还不能一次性发送多个字符,还会产生串扰,感觉很古怪的问题,这个明天还要看看。正因为如此,其实昨天的hello world其实并不完善,我使用一个一个字符传的,而且因为ascii码的对应关系,其实要传送的并不是hello world,而是一个很奇妙的代码,让我想起了《达·芬奇密码》里面博物馆馆长给他女儿留下的暗语和那个经典的斐波那契数列——让我们永远记住这一滑稽可笑的hello world暗语:
R I X X _ w _ d Z H
( H E L L O W O R L D )
最后还有两点,就是有关ADS1.2编译的,首先是如果出现诸如could not open "....../xxx.o"文件的话可以点击project->remove object files,这样就可以了。还有就是在设置“place at the beginning”的时候既要填写正确的目标文件(xxx.o),又要正确的填写section段,否则是无法找到程序入口的。
比如在44b0里面的一般设置是:44binit.o Init