打印

请教各位老师,如何修改keil里main函数前的初始化代码?

[复制链接]
5276|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ycx0617|  楼主 | 2008-9-4 20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     请问各位老师,我想修改keil里进入main函数前那段数据初始化代码?
     就是  IMPORT  __main
           LDR     R0, =__main
           BX      R0
     在反汇编里,进入main之前执行了一段数据初始化代码,这段代码是不在startup.s里。我想修改这段代码,甚至不需要初始化,不知在那里设置或修改。
     末学诚心请教各位老师,请老师不吝赐教!

相关下载

相关帖子

沙发
Again_gyf| | 2008-9-5 08:30 | 只看该作者

re


           LDR     R0, =__my_main
           BX      R0

__my_main:
   ........

使用特权

评论回复
板凳
ycx0617|  楼主 | 2008-9-5 09:35 | 只看该作者

可不可以仔细点!

     你的意思是不是直接跳到mian处,而不进过那段初始化代码?我试了下,好像不对,也许是我没弄对。请说仔细点,没搞懂。谢谢。

使用特权

评论回复
地板
HWM| | 2008-9-5 09:39 | 只看该作者

LZ:再仔细看一下startup.s

......

; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0

......

使用特权

评论回复
5
ycx0617|  楼主 | 2008-9-5 11:36 | 只看该作者

我好像没表达清晰

    4楼,这个是进入c的main。在反汇编中有这样一段代码:  

0x000000FC  E12FFF10  BX        R0   ;R0为0x00000110。
0x00000110  EB000000  BL        __scatterload_rt2(0x00000118)
0x00000114  EB0010CA  BL        __rt_entry(0x00004444)
~~~~~~~
~~~~~~~
~~~~~~~
执行玩这些代码后,才正真进入用户main函数。
    在进入我们写的main之前还有这些,应该是初始化堆数据,以及ZI data。
有些变量我不想每次复位都初始化一次,而是想手动初始化,即进行显示初始化。
    对编译器不是很熟,不知怎么改。

使用特权

评论回复
6
HWM| | 2008-9-5 12:34 | 只看该作者

re LZ:

你这里的

0x000000FC  E12FFF10  BX        R0   ;R0为0x00000110。

就是

......

; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0

......

中的

                BX      R0

执行完这条指令后就进入到“C”的地界中去了(main()),那是编译的权力范围,你是无能为力的。

使用特权

评论回复
7
ycx0617|  楼主 | 2008-9-5 14:10 | 只看该作者

知道了

    这个是c编译器强制规定的,代码应该在库里,我是看不了了。看来改代码是不行了。那么有没有设置项,要求编译器不处理 ZI data?
    谢谢HWM的热心帮助!

使用特权

评论回复
8
农民讲习所| | 2008-9-5 14:17 | 只看该作者

你想干什么?

不想使用变量初始化,不要修改系统的ZI data,这是老掉牙的不安全行为。
你可以用指针的方式,在_bss_end的后面自己开辟一个内存区操作。

使用特权

评论回复
9
农民讲习所| | 2008-9-5 14:33 | 只看该作者

ARM里面

extern unsigned char Image$$ZI$$Limit[];  //系统编译器的系统变量

unsigned char *p;
p = (unsigned char *)(Image$$ZI$$Limit);

p指向系统变量区完毕后的开始内存区。

使用特权

评论回复
10
ycx0617|  楼主 | 2008-9-5 14:35 | 只看该作者

    我要的就是上电复位和看门狗复位,变量初始化不一样。
    上电复位需要初始化,但看门狗复位就不一定需要。有些变量我不想在看门狗复位后改变,而是保存原值。原来用PIC,现在用arm,思想上还拐来拐去的。
    那么,如何在 _bss_end 的后面自己开辟一个内存区操作了?
    请老师指点。
    越学下去,越觉得不懂,呵呵。

使用特权

评论回复
11
ycx0617|  楼主 | 2008-9-5 14:36 | 只看该作者

    这还在写了,您就发上来了。农民老师这是热心啊。

使用特权

评论回复
12
农民讲习所| | 2008-9-5 14:41 | 只看该作者

继续

struct xxx{
  unsigned int a;
  unsigned char *pv;
  ....
};
struct xxx *psxxx;

初始化时只要将psxxx指针赋值就可以了,不影响保存的数据。
操作时psxxx->a, psxxx->pv就可以。

使用特权

评论回复
13
Wxy8030| | 2008-9-5 18:13 | 只看该作者

直接把跳到你自己的 main 就行

     就是  IMPORT  __main
           LDR     R0, =__main
           BX      R0

改为       IMPORT  main
           B      main

(记不清是否要加一个下划线了)

但不建议这么做

使用特权

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

本版积分规则

1

主题

17

帖子

1

粉丝