IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> liteos连接器脚本(二) -> 正文阅读

[嵌入式]liteos连接器脚本(二)

上一节我们概述了连接器脚本的作用,并且结合data段,bss段和text段的各一个例子解释了和程序中的对应关系,那么这一节,我们结合具体的stm32l431来看看系统的boot阶段。在讲解之前这里要讲一个上一届遗留的问题,上一届我们提到了一个图是最终可执行程序的布局,这个里面有bss段,实际上的可执行文件里面的bss段是不占用磁盘空间的,大家想一下为什么,因为bss段里面本来就是脏数据,没有有效数据,所以如果留出来空间就是对磁盘空间的浪费,可执行文件只需要记录bss段的区间大小就行。不过当程序到内存中之后,却是需要根据这个相对地址留出来一段内存用作bss段的,因为bss段里面定义的变量是在程序执行的过程中实实在在需要使用的变量。

并且同时我们知道连接器脚本决定了程序布局,并且连接器脚本里面可以定义程序中使用的变量,这一点很重要,程序执行初始化的时候就是通过这些变量辅助的找到段,或者也有可能其他的辅助的变量。这个和我们通常变量的定义在源代码中会感觉到有一点诧异。大家记住这一点

上一节我们概述了连接器脚本的作用,并且结合data段,bss段和text段的各一个例子解释了和程序中的对应关系,那么这一节,我们结合具体的stm32l431来看看系统的boot阶段。在讲解之前这里要讲一个上一届遗留的问题,上一届我们提到了一个图是最终可执行程序的布局,这个里面有bss段,实际上的可执行文件里面的bss段是不占用磁盘空间的,大家想一下为什么,因为bss段里面本来就是脏数据,没有有效数据,所以如果留出来空间就是对磁盘空间的浪费,可执行文件只需要记录bss段的区间大小就行。不过当程序到内存中之后,却是需要根据这个相对地址留出来一段内存用作bss段的,因为bss段里面定义的变量是在程序执行的过程中实实在在需要使用的变量。

并且同时我们知道连接器脚本决定了程序布局,并且连接器脚本里面可以定义程序中使用的变量,这一点很重要,程序执行初始化的时候就是通过这些变量辅助的找到段,或者也有可能其他的辅助的变量。这个和我们通常变量的定义在源代码中会感觉到有一点诧异。大家记住这一点

在这里插入图片描述
我们从这里开始以nor启动为例看连接器脚本(STM32L431RCTx_FLASH.ld),可以看到下面这段的MEMORY描述的就是STM32L431处理器自带的存储的地址空间和大小(如果外接扩展了,肯定要修改这里)。可以看到isr_vector段放在flash的开始,也就是在0x08000000开始放isr。接着是text,text段在isr段紧接着的flash里面。

在这里插入图片描述
然后我们看data和bss以及heap的分布,可以看到vector_ram在ram的开头部分,也就是在0x20000000地址处存放,然后接着是data,再接着是bss,user_heap等。

在这里插入图片描述
这里我们考虑一个问题,我们编译出来的是一个二进制文件,就是我们上一节提到的一个最终可执行文件的分布图,然后我们肯定要给STM32烧录程序,我们配置的是nor启动,将程序烧录在了norflash中,那么nor在0x08000000处,但是我们刚才的连接器脚本里面vector_ram和data段等后面提到的几个在ram中,ram是掉电丢失数据的,所以肯定会有系统启动之后会有一段data段和vector段的拷贝动作。

我们形象的画一下最终data段拷贝之后,bss段拷贝之后的memory图如下

在这里插入图片描述
编译好可执行文件之后,该文件的图形如上图蓝色所示,里面的分布就是这样的,bss段和heap段里面仅仅有大小记录不占用实际的文件大小,然后我们将该文件烧录到地址0x08000000norflash处也就如上图蓝色标注的那样。nor flash总共256K大小,所以通常会剩余一部分。然后系统启动从0x08000000处取得第一条指令开始执行,然后会将中断向量表拷贝拷贝到vector_ram里如上图箭头,然后拷贝data段(data段里有初始化好的变量)

,接着根据bss的大小记录在内存中分配一块作为bss段清零。ram最后的0x4000(_Min_Stack_Size)预留给系统栈(注意不是任务的栈,实际上任务的栈在heap里面),中间剩余的一部分用于heap,也就是我们内存管理单元管理这部分内存,我们malloc和free操作的就在这里。

接着我们看一下编译生成的Huawei_LiteOS.map文件,该map文件描述的就是最终在内存中的布局结构,当然也是对可执行文件的一个描述。我们只要看开始部分和data等的地址,验证前面的分布说法
在这里插入图片描述
上面这个文件我们能看到isr_vector从0x08000000开始存储我们的中断向量表g_pfnVectors,text段从0x08000040处开始存储我们的代码段,可以看到这些函数等。

接下来我们看data段的在map里面的描述
在这里插入图片描述
可以看到vector_ram从0x20000000处开始然后我们定义的初始化好的变量在data段里面地址也是0x2000xxxx。所以系统最初只有将data段先拷贝到内存_sdata指定的地址之后,我们在后面的c语言里面才能访问这些变量,因为刚开始他们在flash里(地址位0x0800xxxx,刷进去的)。

所以我们这里的例子讲解的系统的运行代码段实际在nor flash里面并不是在内存里面,然后我们的data段等其他和数据(非rodata)相关的段都会在内存里面。也就是代码并没有拷贝进内存,当然速度没有ram快,当然也可以拷贝进内存,不过这里的连接器脚本会更复杂,需要重新规划整个存储。然后这里的ram只有64k也比较小。也可以外扩展ram

至此我们对于STM32L431RCTx_FLASH.ld描述的系统存储分布有了一个清晰的认识,下一节我们开始讲解系统启动部分,然后开始分析在liteos里面这段分布图的heap是如何管理的。大家务必记住这里最终的memory图,这个图像会贯穿整个liteos包括后面的任务调度管理,内存分配,堆栈切换等等都和这幅图相关。

liteos属于单核心,并且不区分用户态和内核态,所以他的整个系统是比较简单的,可以帮助一些有一定开发经验并且喜欢操作系统的同学作为入门。希望到这里大家能清楚并理解前面的讲解,或者里面也许有错误,也可以指出来。都是个人理解

最后欢迎对操作系统原理感兴趣的朋友关注微信公众号deepcoder
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:42:18  更:2022-07-21 21:43:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:32:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码