关于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=? 的链接选项啊?
问题比较初级,感谢解答 这代码哪里来的?貌似贴的片段也是不全的.
同时请看Reset_Handler在哪里被引用.并对比keil提供的statup.S 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文件。 入口是ResetHandler,不是main函数。
是ResetHandler --> __main --> main函数。 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中的原文,并没有修改任何什么. 回复【3楼】ffxz
入口是resethandler,不是main函数。
是resethandler --> __main --> main函数。
-------------------------------------------------------------------
感谢回复,这个顺序我明白,我的问题是没找到最后的那个main()函数,所以以为把他给改名了,又没看见链接脚本里面有类似的改变entry的选项,所以想知道为什么?
请教3个问题:
1 entry=“” 是被用来指定类似被_main函数最终调用的(比如通用的main)这种函数的“入口点吧”
2 工程里面的main(或者相同功能的)函数在哪里
3 等于我们还是借用了keil 系统提供的_main 函数来实现了CRT的工作,是吧?
感谢
回复【4楼】aozima
-----------------------------------------------------------------------
感谢回复,看到那个链接脚本了,就是在程序里面没找到main()函数。呵呵 那个顺序其实在上面已经指出了,
main函数是在__main中进行调用,__main部分是keil mdk的代码,好像并未提供。这部分代码应该是要做RW数据搬移到RAM的动作,并把ZI清零。 回复【6楼】ffxz
那个顺序其实在上面已经指出了,
main函数是在__main中进行调用,__main部分是keil mdk的代码,好像并未提供。这部分代码应该是要做rw数据搬移到ram的动作,并把zi清零。
-----------------------------------------------------------------------
ffxz 你好,可能我没说清楚,我明白_main 调用main()
但是我在工程中没找到mian()能告诉我main()在那里么?谢谢 原以为楼主是指在启动代码里面找main()在哪.原来是在*.c里面找main().
我刚喝水看到这喷本本键盘上面了.要是本本7天内挂了你得赔我. 特此申明
或许楼主是见过某个法典规定 main()函数一定得要在 main.c中 1. 建议楼主找个好些的编辑器来敲代码.
2. keil再不济也还是有全局搜索的.可以搜索整个工程. 找到了int main(void)
我一直都在搜main(),本本不会坏了吧,不好意思了哈。 搜 "空格" + "main" + "(" 一般可以一次性成功
不行就去掉 "("
还不行就把写代码的拉出去枪毙100次.
刚想起来这有问题,有人会使用TAB,而部分编辑器确实搜不到.
看来最有用的办法还是:
随便找个地方写句
main()
然后 使用跳转到实现处 功能一步到位. 这个办法好,但是刚才我一直认为可能给main改名字了,所以搜的不是很理直气壮,呵呵
其实后来搜main 用match whole word only 发现也没多少结果,前十个就有int main(void)。
人就是总想省事,结果反而事与愿违,呵呵。
页:
[1]