博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CPU的汇编启动代码
阅读量:5949 次
发布时间:2019-06-19

本文共 998 字,大约阅读时间需要 3 分钟。

在学习STM32的时候一直看不明白Startup_stm32f40_41xxx.s这个文件。里边写的每句话好像也能看懂但是就不知道他想干嘛。现在终于有点体会了所以来在这里记录下来,希望能对后来的人有帮助。

1、首先启动代码要确定的是都用汇编来写,因为C语言是不能实现的。这个原因是因为C语言想要运行必须要有堆栈的支持,如果没有堆栈(这里最重要的是栈,因为堆可能不需要)那么C程序运行后就会指向了一个不知道什么地方的地方就会出错程序就跑飞了。从这里看C不是不能执行是执行了就肯定会出错。因此必须要用汇编来给C搭建好栈空间好让他正确执行。
2、启动代码也并不是所有的硬件都需要,比如我们用C51的时候就没有看到这个启动代码,上来就用C来写程序了。这是因为C51的硬件内部完成了c所需要的栈所以能执行,还有就是普通PC,他的启动代码是在BIOS(BIOS应该是一块很小的NorFlash吧,好像记得是)里烧写好了他做的启动工作里有一部分肯定是栈和堆的初始化。STM32的启动代码是厂家给你写好的可以看到开头就有如下内容
Stack_Size EQU 0x00000400

AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem SPACE Stack_Size

__initial_sp

可以看到大小是1K的一个栈直接初始化了CPU的SP指针也就是说把栈初始化好了。因为在ARM中SP就是r13随便上网查一下就知道了。

还用STM32的启动代码来说接着就是异常向量表,这个不用管这是硬件规定好的名字你想改也不能改(最多也就是用#define来包装一层),之后就是Reset_Handler这个标签也就可以认为是C中的函数吧。跟着是
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
跳转到SystemInit因为用的是BL所有能返回来,在调用就是我们写的main函数了用bx调用所有就不用返回了。
3、总结一下也就是说一般这种嵌入式或者是单片机的启动代码一般只做时钟初始化、关闭看门狗(可能有的CPU硬件里边已经给你做了)、还有就是初始化栈和堆接着就可以跑你的C程序了。也就是加载bootloder和操作系统什么的吧。

转载于:https://blog.51cto.com/13638458/2347681

你可能感兴趣的文章
ASP.NET MVC测试方法与实战技巧
查看>>
Mysql慢查询
查看>>
传统线程机制之定时器的应用(TIMER,TIMERTASK)
查看>>
org.apache.hadoop.hive.contrib.serde2.RegexSerDe not found
查看>>
citrix客户端的配置和访问(六)
查看>>
Linux下搭建Ionic框架
查看>>
移动支付的基本要素
查看>>
云计算:大数据时代的系统工程(二)
查看>>
Hadoop、Spark、HBase与Redis的适用性讨论(二):HBase
查看>>
常见的数据库连接池
查看>>
K8S使用Ceph RBD作为后端存储
查看>>
Centos yum的配置与使用
查看>>
Linux 文件内容查看工具介绍-cat,less,more,tail,head
查看>>
linux lsof 命令
查看>>
AD 总结
查看>>
在windows中将QString 转化为宽字节
查看>>
Jquery ajax异步提交
查看>>
MySQl的意外断电后无法启动
查看>>
如何防止表单重复提交
查看>>
真是因为忙才加班吗
查看>>