使用ADS编写并调试程序?

[复制链接]
4904|8
 楼主| edisontang 发表于 2007-9-11 12:40 | 显示全部楼层 |阅读模式
1.用ADS编写一个工程后(代码中包含了一个main入口函数),并将RO设置为0x8000,这样子编译之后就可以下载到sdram中执行吗?<br /><br />2.我认为要完成1的功能,至少要对sdram进行一些初始化,才能下载到sdram中执行,那这段初始化,是否可以通过AXD的脚本(比如setmem等命令)来实现,还是要把<br />init.S(这个文件主要是硬件的一些初始化,比如sdram,中断屏蔽等,以及设置各个模式的堆栈,并最后跳入__main入口)一起编译到这个工程中呢?<br />我是否可以通过AXD的脚本初始化硬件后,然后在ADS中编译自己的程序,然后下载到sdram中执行吗?<br /><br />3.要执行c语言代码,之前必须要设置堆栈,拷贝RW代码,以及清0&nbsp;ZI段后,才能跳入到main入口。这个工作在ADS中可以由ADS自己来完成(比如调用_main,_rt_entry,并且在init.S中跳入__main()函数),是否也可以自己写一段初始化,设置<br />堆栈的代码来实现呢?<br /><br />4.在ADS中经常有一个分散装载(Scatlerloading)文件,如下:<br />ROM_LOAD&nbsp;0x02000000<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ROM&nbsp;+0<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init.o&nbsp;(Init,&nbsp;+First)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anon$$obj.o<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__main.o(!!!)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(+RO)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;RAM&nbsp;0x0<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vectors.o(Vect,&nbsp;+First)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flash.o<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(+RW,&nbsp;+ZI)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br />这个文件的具体含义是什么呢?<br />我是这样理解的:开始所有的代码都存在于0x02000000地址开始的flash空间中,运行时,系统会把vectors.o和flash.o,以及RW,ZI段拷贝到sdram的0x0的空间中,<br />我这样的理解有什么问题吗?<br /><br /><br />5.当用户使用分散装载功能的时候,必须重调用_user_initial_stackheap(),这是什么意思呢,为什么需要这么做,如何去做呢?<br />
dld2 发表于 2007-9-11 13:34 | 显示全部楼层

看ADS的PDF

1.用ADS编写一个工程后(代码中包含了一个main入口函数),并将RO设置为0x8000,这样子编译之后就可以下载到sdram中执行吗?<br />-----------------------------------------------------------<br />不行,除非0x8000地址确实是SDRAM。<br /><br />2.我认为要完成1的功能,至少要对sdram进行一些初始化,才能下载到sdram中执行,那这段初始化,是否可以通过AXD的脚本(比如setmem等命令)来实现,还是要把<br />init.S(这个文件主要是硬件的一些初始化,比如sdram,中断屏蔽等,以及设置各个模式的堆栈,并最后跳入__main入口)一起编译到这个工程中呢?<br />我是否可以通过AXD的脚本初始化硬件后,然后在ADS中编译自己的程序,然后下载到sdram中执行吗?<br />------------------------<br />我想以上方法都可以。<br /><br />3.要执行c语言代码,之前必须要设置堆栈,拷贝RW代码,以及清0&nbsp;ZI段后,才能跳入到main入口。这个工作在ADS中可以由ADS自己来完成(比如调用_main,_rt_entry,并且在init.S中跳入__main()函数),是否也可以自己写一段初始化,设置<br />堆栈的代码来实现呢?<br />-----------------------<br />可以。<br /><br />4.在ADS中经常有一个分散装载(Scatlerloading)文件,如下:<br />ROM_LOAD&nbsp;0x02000000<br />;程序的加载(存储)地址是0x02000000<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ROM&nbsp;+0<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init.o&nbsp;(Init,&nbsp;+First)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;init.o中的各段在(0x2000000&nbsp;+&nbsp;0)开始的地址;Init段是第一个段,放在最前面。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anon$$obj.o<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__main.o(!!!)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;上面两行不清楚<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(+RO)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;这里放所有未指明执行位置的RO段<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;RAM&nbsp;0x0<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vectors.o(Vect,&nbsp;+First)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;vectors.o中的各段放在0x0开始的地址;Vect是第一个段。也就是中断向量表要放在0x0开始的位置。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flash.o<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;flash.o中的各段放在这里,具体地址是0x0&nbsp;+&nbsp;vectors.o中各段的长度。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(+RW,&nbsp;+ZI)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;这里放所有未指明执行位置的RW和ZI段,ZI放在RO后面。<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />---------------------------<br />概要的说,scatter告诉连接器RO、RW、ZI各段的具体连接地址。也就是各程序段(RO)的执行地址,RW和ZI变量的所在地址位置。<br />在编译时,符号没有具体定位,连接器将解决这些符号。<br />加载地址大概是在需要解释HEX文件来决定将img拷贝到执行地址时使用,决定拷贝的源地址。<br />执行地址是各段在执行时的定位。<br /><br />这个文件的具体含义是什么呢?<br />我是这样理解的:开始所有的代码都存在于0x02000000地址开始的flash空间中,运行时,系统会把vectors.o和flash.o,以及RW,ZI段拷贝到sdram的0x0的空间中,<br />我这样的理解有什么问题吗?<br />------------------------<br />在使用ADS进行调试的状态,ADS会拷贝。在程序正常执行的时候,如果加载地址和执行地址不一致,要初始化代码完成拷贝。连接器会自动生成各段的起始地址和长度符号,初始化代码根据这些符号来确定拷贝的目的地址和长度。<br />ZI段需要填0,不需要拷贝。<br /><br /><br />5.当用户使用分散装载功能的时候,必须重调用_user_initial_stackheap(),这是什么意思呢,为什么需要这么做,如何去做呢?<br />---------------------<br />不知道。<br />
 楼主| edisontang 发表于 2007-9-11 14:08 | 显示全部楼层

可以这样吗

我是否可以通过AXD的脚本初始化硬件后,然后在ADS中编译自己的程序,然后下载到sdram中执行吗
sassos 发表于 2007-9-11 14:16 | 显示全部楼层

2楼说得不错

1.ScaterLoading程序实现的功能相当于是直接在ARM&nbsp;Linker中设置RO,RW等;<br />2.在使用ScaterLoading时要重调用user_initial_stackheap()?不知道你所说的重调用是什么意思。。?这个函数定义下r0地址就可以了。ScaterLoading我个人觉得没有什么很特殊的地方。
dld2 发表于 2007-9-11 14:26 | 显示全部楼层

回3楼

“我是否可以通过AXD的脚本初始化硬件后,然后在ADS中编译自己的程序,然后下载到sdram中执行吗”<br />可以。<br />但通常是在FLASH里烧个boot,这个boot来初始化硬件。
sassos 发表于 2007-9-11 14:27 | 显示全部楼层

回3楼

可以。<br />在AXD里通过所连接的仿真器初始化一些硬件比如SDRAM等。不过一般是写一个脚本文件,然后在AXD里面运行,把所需要设置的寄存器设置一遍,然后就可以下载你的程序运行了,通过改写scatter文件可以来定位程序数据段和代码段的位置,这里要注意中断向量的部分要放在地址0处才可以处理中断。
 楼主| edisontang 发表于 2007-9-12 10:02 | 显示全部楼层

很感谢各位的回复。

照各位的讲法,sdram初始化好后,就可以把自己的程序下载到sdram中调试了,那是否c环境的初始化(stack和heap的建立,代码的拷贝)都是由ADS自己完成了,我们只需要提供一个有main函数的代码就可以了?<br /><br /><br />此外,如果有中断发生的话,是否要自己写一段中断处理函数,并把它放到0x0开始的地方呢?这样子的话,好像必须借助于scatter文件来实现了?
dld2 发表于 2007-9-12 10:19 | 显示全部楼层

re

C环境的初始化要自己做。要么手工完成,要么调编译环境提供的库函数。<br />处理异常时,0x0开始的位置是异常向量,也就是一个跳转语句。每个异常向量只有4字节长度。<br />ARM的异常向量有RESET、数据ABORT、指令ABORT、软中断、IRQ、FIQ等等,每个都有固定的位置。<br />具体的做法,要看你的板子的初始化程序。如果没有任何初始化程序可以参考,完全根据芯片资料自己写,那是很难的。
Ice_River 发表于 2007-9-12 10:40 | 显示全部楼层

可以参考UBoot

以及ZLGADS模板下的启动代码!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

104

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部