哈喽大家好,我是咕噜老尼,今天我和大家分享一下关于代码如何运行的五个问题。
问题1:FLASH中的代码是如何得到运行的呢?比如PC指针是在哪里由谁设置的?以ARM为例的单片机,该类单片机的代码在nor flash中,cortex内核可以直接运行,不需要将代码加载到ram中运行。ARM-cortex-A系列的SOC,该类SOC更加复杂,通常有内存管理单元,代码存储在nand flash中,程序运行时,需要先将代码加载到ram中运行,该类SOC的启动环节包含了加载程序。就像Windows操作系统存储在硬盘中,开机的时候,操作系统的代码会加载到RAM中。PC指针:无论什么单片机或者SOC,都有一个PC寄存器,这个寄存器保存了下一条待取指令的地址。正常情况下自动加“4”,遇到分支跳转的时候,由跳转指令设置值。那么指针是什么?指针是一个变量的地址,在含有操作系统即硬件层面含有内存管理单元的情况下,指针是虚拟地址,不含操作系统的情况下,是物理地址,虚拟地址和物理地址经过MMU转换。
问题2:这些代码需要搬到RAM中才能运行吗?不这样做会有什么不妥吗?
上文讲了,大部分单片机的代码直接在nor flash中运行,少部分需要加载到ram中。nor flash可以直接寻址一个字节,可以找到一个指令的具体地址,因此可以直接运行。nand flash 的存储单元是块,不能对指令直接寻址,因此不能直接运行其中的代码。因此保存在nand flash中的程序不加载到ram中运行不了。即你的硬盘中的Windows不加载到内存条中,运行不起来。
问题3:如果需要搬到RAM,那是片内还是片外有什么区别吗?
片内片外都可以,具体看是那款SOC或CPU了。
问题4:如果用户存在FLASH的实际代码大小(比如1MB),超过了RAM的可用空间(比如512KB),那这个搬移过程是啥样的?
现在实际情况很少遇到这种情况,当然可能会有RAM很小的系统,可以分时分段的使用,即程序运行一段,加载一段,运行完,加载下一段。很不建议这样玩,现在的RAM很大了,你的实际代码达到1MB的时候,你的内存可能都有1G,2G了。比如Linux操作系统编译完后,实际上只有几MB,实际的Linux系统会有几个G 的内存可用。
问题5:片外扩展的FLASH和SRAM与片内的想比,除了空间大小有差别,性能速度上会有怎样的差异呢?
具体要看SOC的总线设计。一般来说片外的性能弱一点。能不能在Flash中直接运行程序代码,取决于Flash的访问特性。Flash存储器是按块组织的,在使用时也倾向于按块访问才更加高效。Flash类似于ROM一类的存储器,但它其实是可读可写的,不同于同样可读可写的RAM,它在写入数据时需要先将你所写位置所属的块擦除,不管你是不是只写几个字节,所以如果要改写Flash中的数据,总是会先将数据所属的块缓存到内存中,然后再在内存中改写好数据后又重新将块写回,这样就不会丢失数据,但是花销太大。读的时候,往往也是先定位块的位置,然后在块中顺序读取,在不同块中间断读取数据是非常低效的,所以按块读按块写是Flash的一大特点,它不能够随意的对存储区域寻址,典型的如NAND Flash。
好啦今天就讲到这了,我是咕噜老尼,我们下次再见