CPU上电后程序是如何执行的?
参考资料
1.内存管理-程序是如何运行的
2.嵌入式代码里的启动文件为什么比main先启动?
3.【嵌入式】使代码在RAM中运行
4.跟涛哥一起学嵌入式 20:一段C语言代码编译、运行全过程解析
5.嵌入式系统中,FLASH中的程序代码必须搬到RAM中运行吗?
学习总结
参考链接1总结
对于CPU来说,内存是一个存放指令和数据的地方,并不能在内存中完成计算功能,例如要计算 a = b + c,必须将 a、b、c 都读取到CPU内部才能进行加法运算 。 内存是为了解决硬盘速度慢,CPU中的缓存是为了解决内存速度慢 。
关于缓存命中
缓存的容量是有限的,CPU只能从缓存中读取到部分数据,对于使用不是很频繁的数据,会绕过缓存,直接到内存中读取。所以不是每次都能从缓存中得到数据,这就是缓存的命中率,能够从缓存中读取就命中,否则就没命中。
参考链接2总结
知友1:
main函数的进行是需要栈的支持。最起码栈地址要配置好。另外,还有全局变量要在main之前提前初始化。还有其它配置工作。 实际单片机的main只是包装起来的一个循环,它的外层还有太多初始化硬件的程序,只是不开放给最顶层的程序员了。
知友2:
一,启动代码主要作用:1)准备C代码的运行环境,比如堆,栈等;2)处理中断向量表。
二,main 只是一个函数而已。在PC上,一般也就不修改(也是可以改的)。在嵌入式系统,很简单就可以改:你是可以把main修改成你喜欢的名称,然后在启动代码调用的那里,也改成相同的名称就可以。
参考链接5总结
问题概述
比如ARM,PowerPC等架构的MCU在上电后存储在FLASH的程序(比如用户编写好的应用程序)执行过程是怎样的呢?
- FLASH中的代码是如何得到运行的呢?比如PC指针是在哪里由谁设置的?
- 这些代码需要搬到RAM中才能运行吗?不这样做会有什么不妥吗?
- 如果需要搬到RAM,那是片内还是片外有什么区别吗?
- 如果用户存在FLASH的实际代码大小(比如1MB),超过了RAM的可用空间(比如512KB),那这个搬移过程是啥样的?
- 片外扩展的FLASH和SRAM与片内的想比,除了空间大小有差别,性能速度上会有怎样的差异呢?