发新帖我要提问
123
返回列表
打印

彻底倒塌了~~~keil的CARM编译器好象不能设置生成相对跳转代码

[复制链接]
楼主: computer00
手机看帖
扫描二维码
随时随地手机跟帖
41
djyos| | 2007-4-13 13:56 | 只看该作者 回帖奖励 |倒序浏览

圈圈:你没有理解我举这个例子的本意

    这段代码肯定是符合C语言规范的,不要为了让它能运行就改为运行时赋值,这有"打哪指哪"的嫌疑.运行时赋值与局部变量赋值有类似之处,不能全怪我没看清楚.
    C语言编译器无论把功能做得多么花哨,总是要忠实于anci C 规范,这段符合C规范的代码,必须要能实现才可以,在程序中调用 faddr();时,必须能调用到func函数才算符合C规范.不为"我下面就没办法在运行中去取函数地址了"而改变,我这个例子中并没有要你运行中去取函数地址.
    我虽然没有仔细研究过ads的"只读位置无关",举这个例子是在怀疑"位置无关"是否可以完全实现C语言所有要素,还是只能部分实现.如果我的怀疑成立,你也就无需费力地苦苦追求了.
    我感觉,要实现真正的动态加载,或者称位置无关,只能把连接器包含在加载器里面才可以做到,flash里保存的是未经链接的代码,这样加载器爱把它放在哪里就放在哪里.
    猜测而已,没有仔细研究过,也不知道操作系统究竟是怎样做的,其实在编程方面,我是一个十足的菜鸟,没什么实际编程经验,参与这个帖子的讨论,也着实让我长了不少见识.
void func(void);
const void (* const faddr)(void) = func;
void func(void)
{
    …………
}

使用特权

评论回复
42
computer00|  楼主 | 2007-4-13 14:52 | 只看该作者

这个是可以编译通过,

并且这时取到的func函数的地址值也是在FLASH中的地址,并且faddr这个变量也将一直保存着
这个地址。这个变量的值是不会随着PC值而改变的。但是,如果要产生地址无关的代码,那么
func函数本身的地址值必须跟PC有关,即把代码复制到不同的地方,使用func();时会跳到不同的
地址。这个功能在我的代码里面已经实现了。它会产生相对PC跳转来调用函数的指令。并且
你再去读func,发现它的值也变了。而你去读faddr,就不能说明什么问题了,因为它一直被
保存在RAM甚至ROM中,在上初始化代码或者甚至在编译过程时就被固定了。这样再去调用
它,就变成绝对地址跳转了,我就是要避免这样的代码出现,不然我还复制到RAM里去干啥。

使用特权

评论回复
43
djyos| | 2007-4-13 15:21 | 只看该作者

圈圈:那你最好不要这样做

    代码是写给被人看的,也是写给别人用的,你不能限制别人使用合法的C语句.我举的例子中,每一个字符都是合乎C规范的,在你这里却失效了.你不能开发一辆汽车,把刹车和油门交换位置,还要吹你的安全气囊设计的多么先进安全.
    在学校,这点可能并不怎么重要,但是,当你长时间维护并升级一个产品,或者和别人合作做项目的时候,你就会深刻地体会到,遵守规范和保持技术的一致性是多么的重要.你对你的代码做了很多限制后,符合了要求,但使用你代码的人却不一定会遵守这些限制,或者在遵守这些限制后,根本就不能工作.我的主要工作是做硬件,软件上的经验和能力都比不上你们这些牛人,但是遵守规范这一点上,我想软硬件都应该是一样的.我曾经犯过一个错误,两个相似的产品,都有一个用发光管做的run指示灯,但是由于我画图的疏忽,一个用pe3点灯,另一个用pe4点灯,就这点问题,带来了无尽的烦恼,长期需要维护两个软件版本,而且由于软件版本的缘故,还不容许修改硬件.
    所有的技巧都不能使合乎规范的语句失效,否则就是失败的技巧.
    如果你有时间,还不如研究一下ads的"位置无关"是否能满足我举的这个例子,本来我是想看看的,不过现在没有时间,熟悉一个开发环境是要花点精力的,再说我也没有打算用ads或者realview.你在学校可能会好一点,有时间,研究明白了别忘了贴上来看看,我会一直关注这个帖子的.

使用特权

评论回复
44
computer00|  楼主 | 2007-4-13 17:08 | 只看该作者

有时候是必须要做些限制的,没办法

既然你要调用这个函数,就不能一开始就取它的地址,而应该在运行过程再决定地址,
或者直接用函数名调用,这样就不会错了。要按照这个过程似乎不是很过分吧?
不能说它没错就一定要有人去使用。你可以事先声明叫别人不要这样用。同样,
把绝对地址转换为一个函数调用,是不会产生相对跳转代码的,不然程序就不好控制了。


这好比C语言不对数组下标做越界检查,或者程序不负责堆栈溢出检测一样,必须由用户自己来负责保证这点。



使用特权

评论回复
45
computer00|  楼主 | 2007-4-13 17:11 | 只看该作者

不过我已经放弃让编译器全部产生相对跳转这个做法了

我要修改RO地址,产生能够在RAM里运行的代码,然后生成hex,再转成bin,通过其它途径下载到FLASH中,而不是通过JTAG。

使用特权

评论回复
46
mc9s08aw60| | 2007-4-13 17:33 | 只看该作者

顶。。。用ADS吧。和和。。。

使用特权

评论回复
47
zhiwei| | 2007-4-13 17:36 | 只看该作者

好像可以的

起始地址设置到RAM空间,在RAM空间运行这是没有问题,用FlashPGM是可以把这样编译的hex烧写到0起始地址的!
这样只有发生中断时才会跳到Flash,如果你的启动文件也做了向量重定义的话可以链接回RAM执行ISR。

使用特权

评论回复
48
computer00|  楼主 | 2007-4-14 01:05 | 只看该作者

我决定通过串口,将44B0 BIOS分成两部分烧入到FLASH中去了

内存分配情况如下图所示.

首先写个程序,通过JTAG下载,然后通过这个程序,将RO地址设置
在RAM的BIOS程序加载到RAM中,然后运行之.然后再利用它将自己烧入到FLASH中的"BIOS程序部分"中,
然后再做一个拷贝BIOS程序到RAM的启动代码,放到"BIOS启动代码"那里,然后在0地址放一条跳转到
这个启动代码的指令,然后开机之后,就可以将BIOS复制到RAM区的BIOS运行区里,在RAM里面运行代码了。


使用特权

评论回复
49
djyos| | 2007-4-14 14:16 | 只看该作者

so麻烦,看来我选择gcc是选对了

自由控制连接脚本,还可以在没有mmu的机器上做overlap式的加载呢,这是做操作系统最需要的.

使用特权

评论回复
50
ketp| | 2007-4-14 21:56 | 只看该作者

to mybao:不理解你得意思

加载域和执行域是编译时确定的,启动代码只是把代码从加载域搬到执行域而已,并且这可以让库函数来做。

使用特权

评论回复
51
computer00|  楼主 | 2007-4-16 01:00 | 只看该作者

哈哈~~~~通过串口烧录终于搞定了...好辛苦啊...

搞了好几个手脚,才把程序通过串口烧到了flash,不过现在好了,程序已经跑起来了,只要我不擦除它,就会一直在里面,不用再辛苦了........

使用特权

评论回复
52
djyos| | 2007-4-16 08:31 | 只看该作者

恭喜恭喜

真羡慕年轻啊,精力好,我只要熬到12点就打恍惚了.想当年,参加电子竞赛时,平均一天也就睡一个多小时.

使用特权

评论回复
53
computer00|  楼主 | 2007-4-17 23:17 | 只看该作者

倒塌了~~~ping不通...

对网络不熟,没办法往下调了.......可能要补几天网络方面的东东了......

44B0发送一个广播包没问题,如果IP地址一样的话,系统还会提示IP地址冲突. 但是就是ping不通.....

使用特权

评论回复
54
hotpower| | 2007-4-17 23:24 | 只看该作者

恭喜~~~

使用特权

评论回复
55
computer00|  楼主 | 2007-4-18 01:05 | 只看该作者

哈哈~~~有点眉目了~~~原来是有个结构体里面搞错了

原来写的是

unsigned ihl:4,
version:4;

我改成

unsigned char ihl:4;
unsigned char version;

就好了,这时再ping已经有数据包返回了,但是显示还是超时!晕菜...单步运行,发现一个函数ip_fast_csum,
哈哈,里面嵌入了汇编,上次为了快点编译通过,就没有细看它,直接把这些在线汇编注释掉了,我居然把这事给忘了,汗一个......

明天再来把这个函数搞定,估计就能ping通了,哈哈~~~~~不知道这个函数干啥的,倒塌.....先睡觉去,天亮了.......再说......

使用特权

评论回复
56
computer00|  楼主 | 2007-4-19 01:40 | 只看该作者

哈哈,终于可以通过网口下载程序了,速度300多KB/S....

比串口快多了~~~~~~~~~

使用特权

评论回复
57
hotpower| | 2007-4-19 03:04 | 只看该作者

很羡慕呀~~~

使用特权

评论回复
58
computer00|  楼主 | 2007-4-19 10:07 | 只看该作者

我晕.....44B0太旧了,你们都玩高级货去了,还羡慕个啥...

我才羡慕呢.......有钱了去弄个ARM9来玩.....

使用特权

评论回复
59
ideaxuwen| | 2007-4-23 15:06 | 只看该作者

用__ram: RAM Function

使用特权

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

本版积分规则