sky_han 发表于 2018-11-6 11:48:06

bin文件没有地址信息,上电后,是如何将变量copy到RAM里的?

我在想既然是将程序下载到芯片内部的Flash中的,并且程序是bin格式二级制的,没有地址信息的,那复位后,是怎么样知道将这些变量放到RAM
具体位置的?

wudianjun2001 发表于 2018-11-6 13:44:51

BIN有地址信息的,按照地址顺序排列的,可以一眼看出哪个地址是什么数据

toofree 发表于 2018-11-6 14:55:22

本帖最后由 toofree 于 2018-11-6 14:57 编辑

二进制数据中,包含了命令字,执行参数,参数包括地址、变量值等信息。
堆是从RAM中划出的一部分区域,用来存放程序运行中的各种变量。
变量是放在堆中的,对于全局变量上电后会有堆的初始化代码,将Flash中存放堆的初始值数据(即变量初值)全部搬移到堆中。
对于局部变量,只有在程序执行到相应子程序后,才从Flash取初始值放到RAM中。

sky_han 发表于 2018-11-6 15:54:03

toofree 发表于 2018-11-6 14:55
二进制数据中,包含了命令字,执行参数,参数包括地址、变量值等信息。
堆是从RAM中划出的一部分区域,用来 ...

局部变量是放在堆中,全局变量是放在外面的,我是在想,就像全局变量,放在RAM中的位置,是怎么实现的?因为Bin文件中,没有变量的地址信息。

sky_han 发表于 2018-11-6 17:43:54

这个我想通了,局部变量不占RAM,全局变量占RAM,Bin文件会存全局变量的信息,也就是说FLAH中会存变量的地址。对与已经初始化的变量,会存初始值。IAR在编译代码的时候会将怎样处理这些变量的代码一起编译进去形成一个完整的程序。放到芯片Flash里之后,无论芯片如何reset,因为flash里面存了所有不可丢失的代码和全局变量的初始值,以及全局变量的地址。这就构成了整个代码逻辑。
比方说,你如果在代码中定义了一个很大的数组,如果你没有赋初值,那么对于芯片来说,FALSH空间不变,因为FLASH只有头地址和尾地址,两个地址值。只是RAM会被占用的大些,如果你给了初始值,那么就要为这个初值分配地FLASH空间,这样会撑大flash.
页: [1]
查看完整版本: bin文件没有地址信息,上电后,是如何将变量copy到RAM里的?