目录

1. 存储设备布局

2. 链接器脚本

2.1 链接器脚本生成

2.2 链接器脚本分析

2.2.1 分散加载文件

2.2.2 加载区 & 运行区

2.2.3 ER_IROM1运行区分析

2.2.4 RW_IRAM1运行区分析

3. 启动文件分析

3.1 MSP初始值

3.2 链接器内存堆

3.3 异常向量表

3.4 Reset_Handler


说明:本文以正点原子的μVision FreeRTOS工程作为实例

1. 存储设备布局

STM32F407的存储设备布局如下图所示,此处使用了MCU内部的iROM & iRAM

2. 链接器脚本

2.1 链接器脚本生成

① 使用μVision IDE时,链接器脚本由IDE根据所选MCU型号自动生成

② 自动生成的链接器脚本在工程的Objects目录,文件名后缀为.sct

说明:MCU型号对链接器脚本最大的影响就体现在所用存储介质的地址与范围

2.2 链接器脚本分析

2.2.1 分散加载文件

① 分散加载文件(scatter file)用来指定ARM链接器在生成镜像时如何分配RO / RW / ZI等数据的存放地址

② 分散加载文件的描述需要与实际运行设备匹配

2.2.2 加载区 & 运行区

加载区:包含应用程序复位和加载时的代码和数据

运行区:包含应用程序运行时的代码和数据,应用程序启动过程中,从每个加载区可创建一个或多个运行区

说明1:镜像中的所有代码和数据必须准确地指定到一个加载区和一个运行区

示例中的LR_IROM1是1个加载区,其中包含2个运行区(ER_IROM1和RW_IRAM1)

说明2:加载区 & 运行区关系

2.2.3 ER_IROM1运行区分析

① *.o (RESET, +First)

部署在IROM最前端的为RO数据中的RESET section,这个section包含了MSP的初始值以及Reset_Handler(在异常向量表中),是Cortex-M3 MCU启动的起点

② *(InRoot$$Sections)

库函数__main中有InRoot$$Sections段,主要作用是将RW区复制到IRAM中,并且在RW区之后创建ZI区

③ .ANY (+RO)

所有文件中的RO区

2.2.4 RW_IRAM1运行区分析

① .ANY (+RW +ZI)

所有文件中的RW区和ZI区

附件:μVision链接器脚本示例

3. 启动文件分析

3.1 MSP初始值

① __initial_sp为异常向量表的第1个成员,内容为MSP的初始值

② __initial_sp被链接在RW区,大小为1KB(0x00000400)

说明1:满减栈的定义方式

AREA STACK段的起始地址是栈的低地址端,__initial_sp是栈的高地址端。由于Cortex-M3默认使用满减栈,所以MSP初始值为__inital_sp,也就是高地址端

说明2:MSP初始值上机调试

我们在Reset_Handler中添加LDR R0, =__initial_sp语句,查看MSP初始值,可见结果与预期相同

3.2 链接器内存堆

如之前的笔记分析,此处的内存堆是供编译器提供的malloc & free使用的,通过__heap_base & __heap_limit标号,可标识内存堆范围

3.3 异常向量表

说明:启动文件中提供了WEAK定义的中断Handler,用户可自定义Handler进行覆盖

3.4 Reset_Handler

Reset_Handler为Cortex-M3/4系列MCU启动的起点

Reset_Handler的主体先后调用SystemInit和__main函数,从而进入用户定义的main函数

说明1:SystemInit函数

SystemInit函数会设置内置Flash、PLL以及外置DDR(如果有的话),需要注意下该函数对异常向量表地址的重置,即将SCB->VTOR寄存器值设置为FLASH_BASE(0x08000000) | VECT_TAB_OFFSET(0x00000000),也就是IROM1的起始地址

说明2:__main函数

__main函数由C/C++标准库提供,执行代码和数据复制、加压缩以及ZI数据的零初始化

FreeRTOS源码分析与应用开发11(完):编译、链接与部署相关推荐

  1. FreeRTOS源码分析与应用开发02:任务管理

    目录 1. 任务概述 1.1 任务表示 1.2 任务状态 1.2.1 运行态 1.2.2 就绪态 1.2.3 阻塞态 1.2.4 挂起态 1.3 任务优先级 1.3.1 FreeRTOS优先级配置 1 ...

  2. FreeRTOS源码分析与应用开发01:中断配置与临界段

    目录 1. 异常与中断的基本概念 1.1 异常分类 1.2 中断概述 1.2.1 中断处理宜短暂 1.2.2 临界段影响中断实时性 1.3 中断硬件基础 1.3.1 外设 1.3.2 中断控制器 1. ...

  3. FreeRTOS源码分析与应用开发07:事件标志组

    目录 1. 概述 2. 事件标志组类型 3. 创建事件标志组 4. 删除事件标志组 5. 设置事件标志位 5.1 任务级设置 5.2 中断级设置 6. 清除事件标志位 6.1 任务级清除 6.2 中断 ...

  4. FreeRTOS源码分析与应用开发04:消息队列

    目录 1. 队列结构 2. 创建队列 2.1 动态创建队列 2.1.1 xQueueCreate函数 2.1.2 xQueueGenericCreate函数 2.1.3 xQueueGenericRe ...

  5. FreeRTOS源码分析与应用开发09:低功耗Tickless模式

    目录 1. STM32F4低功耗模式简介 2. Tickless模式详解 2.1 如何降低功耗 2.2 关闭SysTick的问题与解决方案 2.2.1 关闭SysTick导致系统节拍计数器停止 2.2 ...

  6. FreeRTOS源码分析与应用开发10:内存管理

    目录 1. 概述 1.1 RTOS中内存分配特点 1.2 内存堆(heap space)来源 1.2.1 ucHeap数组 1.2.2 链接器设置的堆 1.2.3 多个非连续内存堆 1.3 关于字节对 ...

  7. FreeRTOS源码分析与应用开发08:任务通知

    目录 1. 概述 1.1 任务通知概念 1.2 任务通知控制结构 2. 发送任务通知 2.1 任务级发送 2.2 中断级发送 2.2.1 xTaskNotifyFromISR函数 2.2.2 vTas ...

  8. FreeRTOS源码分析与应用开发06:软件定时器

    目录 1. 概述 1.1 软件定时器 & 硬件定时器 1.2 软件定时器精度 1.3 单次模式 & 周期模式 2. 软件定时器组件 2.1 定时器任务 2.2 定时器列表 2.3 定时 ...

  9. FreeRTOS源码分析与应用开发05:信号量

    目录 1. 信号量概述 1.1 信号量概念 1.2 4种信号量 1.2.1 二值信号量 1.2.2 计数信号量 1.2.3 互斥信号量 1.2.4 递归互斥信号量 1.3 信号量相关控制结构 1.3. ...

最新文章

  1. R语言xgboost模型构建:基于prima糖尿病数据集
  2. React 2019年路线图发布!Hooks明年一季度上线
  3. 001-Spring Cloud Edgware.SR3 升级最新 Finchley.SR1,spring boot 1.5.9.RELEASE 升级2.0.4.RELEASE注意问题点...
  4. python录制视频和声音_python录制系统声音
  5. Python手动实现kmeans聚类和调用sklearn实现
  6. RxSwift之环境的搭建配置与基础控件的使用
  7. Java-While循环
  8. python中for循环缩进_Python基础- 缩进,选择和循环
  9. Nessus下载失败问题解决
  10. 通过DCMM评估对企业有什么作用
  11. 预测模型如何改进自动化决策
  12. 大数据最火的Spark你确定不来了解一下吗?(1)
  13. torch.bmm 函数
  14. 【Ubuntu】如何在Ubuntu系统上设置好看的动态壁纸(Komorebi)
  15. Scratch教程——完整的跳跃
  16. linux spool输出一行 不换行,clob内容spool到文件中后,怎么去掉自动换行
  17. AI每日小练习之磨砂玻璃质感图标
  18. iVX低代码平台系列详解 -- 概述篇(一)
  19. 一文讲懂页面置换算法,带例题详解
  20. 计算机技术流浪地球,科幻圈观察:《流浪地球》原著作者刘慈欣:计算机技术是个坑!...

热门文章

  1. Java Kafka 简单示例
  2. html表格td点击事件,监听layui中的table中的td点击事件
  3. linux监听apache代码,linux系统使用python监控apache服务器进程脚本分享
  4. python变量类型声明_python基础知识:变量的定义以及类型
  5. flock用法详解 linux_linux下一个C语言flock功能使用 .
  6. Linux C入门之路,Linux C++学习之路
  7. MySQL计算表字段长度LENGTH
  8. 取消关机shutdown -c
  9. php 清除内容中的bom,检查并清除php文件中bom的函数
  10. python中等于列表的某一个值为真,python – 获取值等于特定值的列表中的所有元素...