aaa1982 发表于 2011-3-6 17:34:49

关于rt-thread 请教

终于开始学习代码了,以后把我的问题都放到这个帖子里。


问题1:关于启动过程:
Reset_Handler   PROC
                EXPORTReset_Handler            
                IMPORT__main

                LDR   R1, = __initial_sp      ; restore original stack pointer
                MSR   MSP, R1

                LDR   R0, =__main
                BX      R0
                ENDP
原来的认识是 跳到__main就是跳到keil提供的crt库里面完成程序运行的一些准备工作,最后准备完了跳到main()函数里面。

工程好像把入口点函数改名字了,请问改成什么了? 那个函数是类似main()的入口函数,我也没看见类似entry=? 的链接选项啊?

问题比较初级,感谢解答

aozima 发表于 2011-3-6 17:56:38

这代码哪里来的?貌似贴的片段也是不全的.

同时请看Reset_Handler在哪里被引用.并对比keil提供的statup.S

aaa1982 发表于 2011-3-6 20:10:54

Reset_Handler就在_Vectors段里面声明的。
__Vectors       DCD   __initial_sp               ; Top of Stack
                DCD   Reset_Handler            ; Reset Handler
                DCD   NMI_Handler                ; NMI Handler
                DCD   rt_hw_hard_fault         ; Hard Fault Handler
                DCD   MemManage_Handler          ; MPU Fault Handler
                DCD   BusFault_Handler         ; Bus Fault Handler


文件就是STM32选项卡下面的start_rvds.s文件。

ffxz 发表于 2011-3-6 20:14:24

入口是ResetHandler,不是main函数。

是ResetHandler --> __main --> main函数。

aozima 发表于 2011-3-6 20:25:20

startup.S:
; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT__Vectors

__Vectors       DCD   __initial_sp               ; Top of Stack
                DCD   Reset_Handler            ; Reset Handler
                DCD   NMI_Handler                ; NMI Handler

linker:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00010000{    ; load region size_region
ER_IROM1 0x08000000 0x00010000{; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
}
RW_IRAM1 0x20000000 0x00005000{; RW data
   .ANY (+RW +ZI)
}
}

以上是keil自带的startup.s中的原文,并没有修改任何什么.

aaa1982 发表于 2011-3-6 20:46:24

回复【3楼】ffxz
入口是resethandler,不是main函数。
是resethandler --> __main --> main函数。

-------------------------------------------------------------------

感谢回复,这个顺序我明白,我的问题是没找到最后的那个main()函数,所以以为把他给改名了,又没看见链接脚本里面有类似的改变entry的选项,所以想知道为什么?


请教3个问题:
1 entry=“” 是被用来指定类似被_main函数最终调用的(比如通用的main)这种函数的“入口点吧”
2 工程里面的main(或者相同功能的)函数在哪里
3 等于我们还是借用了keil 系统提供的_main 函数来实现了CRT的工作,是吧?

感谢

回复【4楼】aozima
-----------------------------------------------------------------------

感谢回复,看到那个链接脚本了,就是在程序里面没找到main()函数。呵呵

ffxz 发表于 2011-3-6 20:51:27

那个顺序其实在上面已经指出了,
main函数是在__main中进行调用,__main部分是keil mdk的代码,好像并未提供。这部分代码应该是要做RW数据搬移到RAM的动作,并把ZI清零。

aaa1982 发表于 2011-3-6 21:27:37

回复【6楼】ffxz
那个顺序其实在上面已经指出了,
main函数是在__main中进行调用,__main部分是keil mdk的代码,好像并未提供。这部分代码应该是要做rw数据搬移到ram的动作,并把zi清零。
-----------------------------------------------------------------------

ffxz 你好,可能我没说清楚,我明白_main 调用main()

但是我在工程中没找到mian()能告诉我main()在那里么?谢谢

aozima 发表于 2011-3-6 21:33:02

原以为楼主是指在启动代码里面找main()在哪.原来是在*.c里面找main().
我刚喝水看到这喷本本键盘上面了.要是本本7天内挂了你得赔我. 特此申明

或许楼主是见过某个法典规定 main()函数一定得要在 main.c中

aozima 发表于 2011-3-6 21:34:37

1. 建议楼主找个好些的编辑器来敲代码.
2. keil再不济也还是有全局搜索的.可以搜索整个工程.

aaa1982 发表于 2011-3-6 21:38:27

找到了int main(void)

我一直都在搜main(),本本不会坏了吧,不好意思了哈。

aozima 发表于 2011-3-6 21:41:56

搜 "空格" + "main" + "(" 一般可以一次性成功
不行就去掉 "("
还不行就把写代码的拉出去枪毙100次.

刚想起来这有问题,有人会使用TAB,而部分编辑器确实搜不到.
看来最有用的办法还是:
随便找个地方写句
main()
然后 使用跳转到实现处 功能一步到位.

aaa1982 发表于 2011-3-6 21:58:55

这个办法好,但是刚才我一直认为可能给main改名字了,所以搜的不是很理直气壮,呵呵


其实后来搜main 用match whole word only 发现也没多少结果,前十个就有int main(void)。

人就是总想省事,结果反而事与愿违,呵呵。
页: [1]
查看完整版本: 关于rt-thread 请教