一,数据拷贝引起的指针问题
大家想一下,一个指针指向的内存地址处的数据,假设拷贝到了另外一个地方,那么这个时候我们的指针还是指向原来的位置,那么就会导致问题。为什么提出这个问题呢?因为我们前面讲到了liteos的data段的拷贝,那么对于data段的访问的指针是不是也要改变呢?
前面结合小熊派stm32L431的一个例子讲解了liteos在该实例中使用到的连接器脚本,大家对于编译出来的可执行程序以及烧录的位置以及最终的内存布局应该有了解了。在讲解前奏之前我们先解释一个前面遗留下来的一个问题,data段拷贝引起的指针的问题。我们知道在c语言中指针是数据的存储起始地址,前面我们提到data’段从0x0800xxxx拷贝到0x2000xxxx的位置,那么既然数据段data已经做了拷贝,我们访问的时候访问的是拷贝后的地址,这个时候指针应该变化了!!!但是为什么似乎我们在初始化好之后,可以直接使用,而没有修改指针?可能很多人不会想到这个问题,就认为理所应当。下面我们来解释这个问题:
如上图的蓝色部分是我们刷机之后,liteos系统在flash中的布局,然后我们上电,text段中的代码开始跑,但是这个时候在data段拷贝之前,我们的data段在蓝色部分,还不是橙色部分。这个时候假设text段中的代码对data段可以访问,那么访问的是蓝色部分,然后很快做了data段的拷贝,这个时候进入内存。我们当然期望我们的访问在内存里面。而不是在flash里面。但是这个时候的指针怎么