前面结合小熊派stm32L431的一个例子讲解了liteos在该实例中使用到的连接器脚本,大家对于编译出来的可执行程序以及烧录的位置以及最终的内存布局应该有了解了。在讲解前奏之前我们先解释一个前面遗留下来的一个问题,data段拷贝引起的指针的问题。我们知道在c语言中指针是数据的存储起始地址,前面我们提到data’段从0x0800xxxx拷贝到0x2000xxxx的位置,那么既然数据段data已经做了拷贝,我们访问的时候访问的是拷贝后的地址,这个时候指针应该变化了!!!但是为什么似乎我们在初始化好之后,可以直接使用,而没有修改指针?可能很多人不会想到这个问题,就认为理所应当。下面我们来解释这个问题。
如上图在编译阶段text段里面的代码期望操作的数据是在红色箭头指定的区域,而不是蓝色箭头指定的区域,这个在编译阶段就确定了,这个就是为什么data段要重新拷贝。
我们在编译程序的时候连接器脚本中已经制定了代码段,数据段,bss段的期望最终位置。在系统初始化好之后,我们以任务管理中定义的一个变量为例来形象解释这个问题,可以看到g_pfnTskSwitchHook在定义的时候就是初始化为NULL(也就是0)
g_pfnTskSwitchHook的定义和使用
在系统初始化过程中o