打印

使用ADS编写并调试程序?

[复制链接]
3704|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
edisontang|  楼主 | 2007-9-11 12:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.用ADS编写一个工程后(代码中包含了一个main入口函数),并将RO设置为0x8000,这样子编译之后就可以下载到sdram中执行吗?

2.我认为要完成1的功能,至少要对sdram进行一些初始化,才能下载到sdram中执行,那这段初始化,是否可以通过AXD的脚本(比如setmem等命令)来实现,还是要把
init.S(这个文件主要是硬件的一些初始化,比如sdram,中断屏蔽等,以及设置各个模式的堆栈,并最后跳入__main入口)一起编译到这个工程中呢?
我是否可以通过AXD的脚本初始化硬件后,然后在ADS中编译自己的程序,然后下载到sdram中执行吗?

3.要执行c语言代码,之前必须要设置堆栈,拷贝RW代码,以及清0 ZI段后,才能跳入到main入口。这个工作在ADS中可以由ADS自己来完成(比如调用_main,_rt_entry,并且在init.S中跳入__main()函数),是否也可以自己写一段初始化,设置
堆栈的代码来实现呢?

4.在ADS中经常有一个分散装载(Scatlerloading)文件,如下:
ROM_LOAD 0x02000000
{
    ROM +0
    {
        init.o (Init, +First)
        anon$$obj.o
        __main.o(!!!)
        * (+RO)
    }
    RAM 0x0
    {
        vectors.o(Vect, +First)
        flash.o
        * (+RW, +ZI)
    }

}

这个文件的具体含义是什么呢?
我是这样理解的:开始所有的代码都存在于0x02000000地址开始的flash空间中,运行时,系统会把vectors.o和flash.o,以及RW,ZI段拷贝到sdram的0x0的空间中,
我这样的理解有什么问题吗?


5.当用户使用分散装载功能的时候,必须重调用_user_initial_stackheap(),这是什么意思呢,为什么需要这么做,如何去做呢?

相关帖子

沙发
dld2| | 2007-9-11 13:34 | 只看该作者

看ADS的PDF

1.用ADS编写一个工程后(代码中包含了一个main入口函数),并将RO设置为0x8000,这样子编译之后就可以下载到sdram中执行吗?
-----------------------------------------------------------
不行,除非0x8000地址确实是SDRAM。

2.我认为要完成1的功能,至少要对sdram进行一些初始化,才能下载到sdram中执行,那这段初始化,是否可以通过AXD的脚本(比如setmem等命令)来实现,还是要把
init.S(这个文件主要是硬件的一些初始化,比如sdram,中断屏蔽等,以及设置各个模式的堆栈,并最后跳入__main入口)一起编译到这个工程中呢?
我是否可以通过AXD的脚本初始化硬件后,然后在ADS中编译自己的程序,然后下载到sdram中执行吗?
------------------------
我想以上方法都可以。

3.要执行c语言代码,之前必须要设置堆栈,拷贝RW代码,以及清0 ZI段后,才能跳入到main入口。这个工作在ADS中可以由ADS自己来完成(比如调用_main,_rt_entry,并且在init.S中跳入__main()函数),是否也可以自己写一段初始化,设置
堆栈的代码来实现呢?
-----------------------
可以。

4.在ADS中经常有一个分散装载(Scatlerloading)文件,如下:
ROM_LOAD 0x02000000
;程序的加载(存储)地址是0x02000000
{
    ROM +0
    {
        init.o (Init, +First)
     ;init.o中的各段在(0x2000000 + 0)开始的地址;Init段是第一个段,放在最前面。
        anon$$obj.o
        __main.o(!!!)
     ;上面两行不清楚
        * (+RO)
     ;这里放所有未指明执行位置的RO段
    }
    RAM 0x0
    {
        vectors.o(Vect, +First)
     ;vectors.o中的各段放在0x0开始的地址;Vect是第一个段。也就是中断向量表要放在0x0开始的位置。
        flash.o
     ;flash.o中的各段放在这里,具体地址是0x0 + vectors.o中各段的长度。
        * (+RW, +ZI)
     ;这里放所有未指明执行位置的RW和ZI段,ZI放在RO后面。
    }
}
---------------------------
概要的说,scatter告诉连接器RO、RW、ZI各段的具体连接地址。也就是各程序段(RO)的执行地址,RW和ZI变量的所在地址位置。
在编译时,符号没有具体定位,连接器将解决这些符号。
加载地址大概是在需要解释HEX文件来决定将img拷贝到执行地址时使用,决定拷贝的源地址。
执行地址是各段在执行时的定位。

这个文件的具体含义是什么呢?
我是这样理解的:开始所有的代码都存在于0x02000000地址开始的flash空间中,运行时,系统会把vectors.o和flash.o,以及RW,ZI段拷贝到sdram的0x0的空间中,
我这样的理解有什么问题吗?
------------------------
在使用ADS进行调试的状态,ADS会拷贝。在程序正常执行的时候,如果加载地址和执行地址不一致,要初始化代码完成拷贝。连接器会自动生成各段的起始地址和长度符号,初始化代码根据这些符号来确定拷贝的目的地址和长度。
ZI段需要填0,不需要拷贝。


5.当用户使用分散装载功能的时候,必须重调用_user_initial_stackheap(),这是什么意思呢,为什么需要这么做,如何去做呢?
---------------------
不知道。

使用特权

评论回复
板凳
edisontang|  楼主 | 2007-9-11 14:08 | 只看该作者

可以这样吗

我是否可以通过AXD的脚本初始化硬件后,然后在ADS中编译自己的程序,然后下载到sdram中执行吗

使用特权

评论回复
地板
sassos| | 2007-9-11 14:16 | 只看该作者

2楼说得不错

1.ScaterLoading程序实现的功能相当于是直接在ARM Linker中设置RO,RW等;
2.在使用ScaterLoading时要重调用user_initial_stackheap()?不知道你所说的重调用是什么意思。。?这个函数定义下r0地址就可以了。ScaterLoading我个人觉得没有什么很特殊的地方。

使用特权

评论回复
5
dld2| | 2007-9-11 14:26 | 只看该作者

回3楼

“我是否可以通过AXD的脚本初始化硬件后,然后在ADS中编译自己的程序,然后下载到sdram中执行吗”
可以。
但通常是在FLASH里烧个boot,这个boot来初始化硬件。

使用特权

评论回复
6
sassos| | 2007-9-11 14:27 | 只看该作者

回3楼

可以。
在AXD里通过所连接的仿真器初始化一些硬件比如SDRAM等。不过一般是写一个脚本文件,然后在AXD里面运行,把所需要设置的寄存器设置一遍,然后就可以下载你的程序运行了,通过改写scatter文件可以来定位程序数据段和代码段的位置,这里要注意中断向量的部分要放在地址0处才可以处理中断。

使用特权

评论回复
7
edisontang|  楼主 | 2007-9-12 10:02 | 只看该作者

很感谢各位的回复。

照各位的讲法,sdram初始化好后,就可以把自己的程序下载到sdram中调试了,那是否c环境的初始化(stack和heap的建立,代码的拷贝)都是由ADS自己完成了,我们只需要提供一个有main函数的代码就可以了?


此外,如果有中断发生的话,是否要自己写一段中断处理函数,并把它放到0x0开始的地方呢?这样子的话,好像必须借助于scatter文件来实现了?

使用特权

评论回复
8
dld2| | 2007-9-12 10:19 | 只看该作者

re

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

使用特权

评论回复
9
Ice_River| | 2007-9-12 10:40 | 只看该作者

可以参考UBoot

以及ZLGADS模板下的启动代码!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

104

帖子

0

粉丝