打印
[其他ST产品]

str711 地址问题

[复制链接]
楼主: guwengchuixue
手机看帖
扫描二维码
随时随地手机跟帖
21
Neoo| | 2009-8-11 17:23 | 只看该作者 回帖奖励 |倒序浏览
当然可以阿

使用特权

评论回复
22
guwengchuixue|  楼主 | 2009-8-12 10:35 | 只看该作者
谢谢,我还有个问题想请教一下,函数的调用是相对地址的调用(以PC为基准)还是绝对地址的调用(以链接地址为基准)?这样子来看好象是函数的调用是长地址跳转。那为什么一般的函数调用的反汇编都是使用BL呢?

使用特权

评论回复
23
vigia| | 2009-8-12 11:03 | 只看该作者
BL的跳转范围是前后32MB,属于相对地址调用,一般的调用都够了。

使用LDR PC, =func 直接赋值PC,可以使跳转范围变成4GB,属于绝对地址调用

这些都是编译器完成的,你可以不关心的。


你可以试试定义一个函数在RAM地址中,再在flash中调用,看看编译器使用了什么跳转指令。

使用特权

评论回复
24
guwengchuixue|  楼主 | 2009-8-13 11:23 | 只看该作者
非常的感谢!!
好像不是您所说的那样,在我看到有个启动代码,在代码还没有搬运之前就利用BL boardInit 就可以使用该函数了(boardInit 运行域地址设置在RAM),应该是调用FLASH中地址的代码.那么如果照您所说,之后将boardInit 复制到RAM,此时调用boardInit 函数是跳转到FLASH中,还是ram??

使用特权

评论回复
25
vigia| | 2009-8-13 11:44 | 只看该作者
不好意思,没看懂你说的。。。。

你是说在启动代码还没有拷贝boardInit函数到RAM之前,已经有BL boardInit了?

我不是很明白,如果boardInit是你自己的函数,启动代码不会去调用的。boardInit是什么?

使用特权

评论回复
26
guwengchuixue|  楼主 | 2009-8-13 12:01 | 只看该作者
这个项目是是使用STR的,说不大清楚。我想说的意思是函数名是地址,那这个地址是在编译连接就固定 的地址,还是因为这个函数保存在如0X0地址才有地址?函数的调用不是计算偏移量?在FLASH 和RAM中都有函数,当调用该函数时候到底是调用FLASH中的还是RAM(按您所说应该是RAM),但是在FLASH中也有该函数啊?

使用特权

评论回复
27
vigia| | 2009-8-13 12:18 | 只看该作者
如果一个函数你指定的地址在RAM里,在FLASH里是没有这个函数的。你的意思是你需要有2个同样的函数,一个在flash里跑一个在ram里跑?

关于在RAM里跑的函数,编译器是根据你指定的地址知道函数地址的,并且在调用时会调用到这个地址,很明显,这个地址跳转范围超过了32M了,根据命令集,只能使用绝对跳转了。

同样,编译器会在启动代码中加上一段代码,完成函数拷贝到RAM指定地址的功能。

使用特权

评论回复
28
Neoo| | 2009-8-13 12:58 | 只看该作者
非常的感谢!!
好像不是您所说的那样,在我看到有个启动代码,在代码还没有搬运之前就利用BL boardInit 就可以使用该函数了(boardInit 运行域地址设置在RAM),应该是调用FLASH中地址的代码.那么如果照您所说,之后将b ...
guwengchuixue 发表于 2009-8-13 11:23

请注意,只有在使用C语言的时候才会有所谓的各个段的搬移,而这些搬移都是在您调用__main函数的时候编译器自动帮您做的,不是直接使用B Main,而是要用B __main。
在使用汇编的时候没有类似的说法,函数的搬移和跳转都要自己手动完成的。

关于您提到的这个函数,确认这个函数是汇编直接调用的么?如果是汇编直接调用的,并且这个函数的code是在ram中的,那这个跳转也是可以成功的,但是相应的RAM空间并没有这一部分的函数数据,程序跳转过去之后会跑飞掉的。

使用特权

评论回复
29
Neoo| | 2009-8-13 13:05 | 只看该作者
还有一点要注意,我们所说的code,ro,rw等区段和代码的实际存储区段是有差异的。代码存储在flash并不一定表示这个函数非得在flash中运行,函数在哪里运行时要根据link中的脚本文件定义的。甚至我们可以把代码分散的存储在不连续的存储空间中。
而汇编不一样,存储在哪里就应该在哪里运行,除非您手动做代码的搬移

对于STR711的话,同样的一个程序,你存储在0x40000000,或者是0x0地址对于程序的运行都没有影响的。

使用特权

评论回复
30
guwengchuixue|  楼主 | 2009-8-13 14:39 | 只看该作者
既然是复制到指定的RAM中,那在FLASH中不是还是有该函数存在啊?

使用特权

评论回复
31
Neoo| | 2009-8-13 14:49 | 只看该作者
是的,在进入main函数之前,只不过是编译器自动生成的

使用特权

评论回复
32
guwengchuixue|  楼主 | 2009-8-13 15:04 | 只看该作者
请注意,只有在使用C语言的时候才会有所谓的各个段的搬移,而这些搬移都是在您调用__main函数的时候编译器自动帮您做的,不是直接使用B Main,而是要用B __main。
在使用汇编的时候没有类似的说法,函数的搬移和跳 ...
Neoo 发表于 2009-8-13 12:58

该函数是在汇编中调用(启动代码中),此时代码还没有复制到RAM中,但是该函数是用C写的,是初始化看门狗,中断之类的。是不是在使用汇编写的并且是使用相对地址调用如BL可以调用任何函数。

使用特权

评论回复
33
guwengchuixue|  楼主 | 2009-8-13 15:10 | 只看该作者
EXTERNAL_SRAM_BASE         EQU                (0x02200000)
EXTERNAL_IMAGE_SIZE         EQU                (0x0007E000)
EXFLASH_IMAGE_BASE         EQU                (0x01000000)
IMPORT  boardInit
ResetHandler
                                 ldr                r4, =0xFFE00000
                ldr                r0, =0x0000FFFF
                ldr                r4, [r4]
                bic                r4, r4, r0

                ldr     r0, =INTERNAL_SRAM_BASE
                ldr     sp, =INTERNAL_SRAM_SIZE
               
                mov                r8, #0
                mov                r10,r4
                cmp                r4, #0
                addeq        sp, sp, r0
                addeq   r8, r8, r0
               
                bl      boardInit               
            add                r9, pc,#-(8+.-VectorTable)
            ldmia        r9!,{r0-r7}
            stmia        r8!,{r0-r7}
            ldmia        r9!,{r0-r7}
            stmia        r8!,{r0-r7}       


复制其中开始的一部分,

boardInit该函数是在一个。C文件中定义的。刚开始FLASH地址为0,在ADS中设置RO为SRAM

使用特权

评论回复
34
guwengchuixue|  楼主 | 2009-8-13 15:12 | 只看该作者
这样BL  boardInit   应该是在FLASH中运行吧

使用特权

评论回复
35
Neoo| | 2009-8-13 15:13 | 只看该作者
程序在flash里面运行,调用函数也需要进行跳转,函数在RAM里面只不过跳转的地址不同罢了,跳转的过程都是一样的。调用结束之后,当然要回到调用的地方继续执行阿。

使用特权

评论回复
36
guwengchuixue|  楼主 | 2009-8-13 15:21 | 只看该作者
程序在flash里面运行,调用函数也需要进行跳转,函数在RAM里面只不过跳转的地址不同罢了,跳转的过程都是一样的。调用结束之后,当然要回到调用的地方继续执行阿。 ...
Neoo 发表于 2009-8-13 15:13

谢谢,应该是这样的。我现在就是有个疑问,既然如我上面所说能实现(BL boardInit   ),现在我的大部分程序是在FLASH中运行,我要调用一个运行域在RAM里面此时也已经完成复制(即调用完 B __main),现在我要调用该函数,是调用FLASH中的程序,还是RAM中的程序呢,在这两个地方不是有程序在吗?

使用特权

评论回复
37
Neoo| | 2009-8-13 15:28 | 只看该作者
当然是ram中的,因为这个函数的各个段都是按照code在ram的状态链接的,虽然你可以强制指向这段代码在flash的内容进行执行,但是执行过程中,会引起异常。

使用特权

评论回复
38
guwengchuixue|  楼主 | 2009-8-13 15:45 | 只看该作者
那也就是说C语言中的函数调用与汇编中的函数调用(BL)的机制是不一样,C语言函数调用所得到的地址是连接地址,是这样吗?还有您刚才在有一帖中说BL boardInit ,会从FLASH跳到RAM中运行,但是好象不能这样就跳转到RAM中,应该还是在FLASH中,可能问题就是出在这BL boardInit 会不会跳到RAM中,但是据我所知,这样是不能跳到RAM中的。也就是27楼大侠所提到的问题。

使用特权

评论回复
39
guwengchuixue|  楼主 | 2009-8-13 19:28 | 只看该作者
按照之前几位大侠所诉:隐隐约约好像有点明白,在c语言中,函数的调用是将该函数的链接地址给PC,因此能实现从FLASH到RAM的跳转。而在汇编中的函数调用BL是按照偏移量来计算PC值。这两种调用是不同,我这样的理解是否正确?希望大侠能帮我打通一下任督二脉!!

使用特权

评论回复
40
guwengchuixue|  楼主 | 2009-8-14 09:10 | 只看该作者
哪位大侠能给小弟解释一下。。。。。。。

使用特权

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

本版积分规则