【Keil】浅学一下keil中的.sct文件
【Keil】浅学一下keil中的.sct文件
最近重新捣鼓了acfly的源码,有了新的有趣发现,当然,过程并不有趣。
起因
clone下来我去年提交的代码,编译 ......
报错辣!
linking...
.\Objects\ACFly.axf: error: L6031U: Could not open scatter description file \ACFly_Prophet.sct: No such file or directory
在网上找了一下解决方案,鬼迷心窍的我听信了CSDN上的谗言,做了一下修改:
改前

改后

显而易见,我将原本工程里配置的Linker直接删去了,这并不是一个明智的做法。
然而,当时我并没有意识到问题的严重性,继续操作,编译 ......
没报错,然而这遇到了非常奇怪的问题,我在使用DFU烧录的时候进度卡了,然后我断电准备重新烧,但这时,飞控上电后并没有响起熟悉的蜂鸣器音乐,是的,它并没有初始化,地面站上也没有显示出相应的com口,再次使用DFU烧录时直接失败,检测不到usb。
DFU失败了,我又使用Jlink烧录,烧录成功了,但飞控仍然未初始化,像死了一样。
发现了漏洞
重新烧录了bootloader,飞控成功初始化,再次烧录我的代码,飞控还是没能初始化。
这时,我又仔细看了看我唯一的修改,ACFly_Prophet.sct,这时我想起我去年提交的代码ignore了Object文件夹,而ACFly_Prophet.sct正存在于其中。我从角落里翻出ACFly_Prophet.sct,添加,编译,烧录,成功。
什么是sct
sct全名,scatter,意味分散。.sct文件就是分散加载文件。分散加载文件就是可以通过这个脚本文件来自己定义各个不同的位置,哪里存的是代码、哪里存的是数据,去哪个特定的地址找到下一步需要运行的函数等等。
我们都知道,编译器在生成可执行文件时,先将每个.c文件编译成.o文件(此过程叫编译),然后将很多个.o文件链接成可执行文件(此过程叫链接)。在链接的过程中,会用到一个描述文件,用来指定链接时的行为。这个描述文件叫做链接文件,如linux下的.ld文件,keil中的分散加载文件(.sct文件)。
默认的,在keil中编译程序时,会自动的生成.sct文件(默认在生成.o、.hex文件的目录下)。
为什么这里要指定sct文件
看看acfly的sct文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08100000 0x00100000 { ; load region size_region
ER_IROM1 0x08100000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
DTCM_IRAM 0x20000000 0x00020000 { ; RW data
heap_4.o (+RW +ZI)
queue.o (+RW +ZI)
port.o (+RW +ZI)
tasks.o (+RW +ZI)
timers.o (+RW +ZI)
cpu_load.o (+RW +ZI)
.ANY (HEAP)
.ANY (STACK)
*(.DTCM)
}
RW_IRAM2 0x24000000 0x00070000 {
.ANY (+RW +ZI)
*(.AXI_RAM)
}
AXI_DMA_RAM 0x24070000 0x00010000 { ; RW data
*(.AXI_DMA_RAM)
}
SRAM1 0x30000000 0x00020000 { ; RW data
*(.SRAM1)
}
}
LR_IROM2 0x08040000 0x000c0000 { ; load region size_region
RES_IROM 0x08040000 0x000c0000 { ; load address = execution address
*(.RES_IROM)
}
}
好吧,这个我确实还看不太懂。
acfly将它的程序分为Bootloader程序和用户程序。
一个Bootloader程序和一个用户程序,那么这就需要调整分散加载文件,以达成在一个Flash里面同时摆放两个不同程序的目的。
ACFly_Prophet.sct是猪猪他们自己写的分散加载文件,估计是为了使Bootloader程序和用户程序不发生冲突。
参考博客:
https://www.1024sou.com/article/919869.html
https://blog.csdn.net/qq_23274715/article/details/103445958
【Keil】浅学一下keil中的.sct文件的更多相关文章
- Keil MDK中单个c文件生成LIB文件
看大多数说的都是简单地将整个工程转换成.LIB,在Project->Options for Target->Output下,选择Create Library,就可以了. 不过这样生成的li ...
- 从Keil 4升级到Keil 5的工程,想返回来用Keil 4打开
情景描述: 笔者电脑程序Keil 4升级到Keil 5,相应地,原来项目上的工程也在第一次用Keil 5打开的时候进行了升级.之后,由于客户需要开发资料,其版本为Keil 4,我尝试着用Keil 4打 ...
- junit浅学笔记
JUnit是一个回归测试框架(regression testing framework).Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(Wh ...
- 浅学JavaScript
JavaScript是互联网上最流行的脚本语言,可广泛用于服务器.PC.笔记本电脑智能手机等设备: 对事件的反应: <!DOCTYPE html> <html> <hea ...
- Keil共存的方法 - Keil MDK兼容Keil C51,实操可行
记录一下成功使Keil MDK和Keil C51共存的过程! 之前一直用Keil C51开发,最近需要用到ARM9内核的IC,就需要Keil C51和Keil MDK共存.看了一下网上几个教程,方法大 ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- 转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
- 代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]
函数代码://demo.c #include<stdio.h> #include<stdlib.h> , global2 = , global3 = ; void functi ...
随机推荐
- iOS开发之检测项目是否包含UIWebView
应苹果审核要求不能包含UIWebView,所以我们上线之前应该扫一下项目是否包含UIWebView 我们直接打开终端 cd 到工程文件下面 执行命令 grep -r UIWebView . 在扫描结 ...
- 启动 RMAN 客户端并与之交互
启动和退出 RMAN RMAN 可执行文件与数据库一起自动安装,通常与其他数据库可执行文件位于同一目录中.例如,Linux 上的 RMAN 客户端位于$ORACLE_HOME/bin. 您有以下启动 ...
- c#在代码中再次调用按钮点击事件
在一个按钮事件中调用另一个按钮(button1)的点击事件,可以直接如下: button1.PerformClick() 也称之为 以编程方式调用按钮的click事件
- Linux基础第七章:磁盘阵列(RAID)
一.磁盘阵列 二.磁盘阵列类型 1.RAID 0 2.RAID 1 3.RAID 5 4.RAID10 三.磁盘阵列配置 1.硬件方式 2.软件方式 一.磁盘阵列独立硬盘冗余阵列(RAID, Redu ...
- PostScript语言教程(七、条件语句)
POSTSCRIPT语言中有许多操作符用于制定程序内流的控制.我们在前一章使用了一个repeat运算.所有的控制操作符都使用了之前简要提到的对象类型,即函数,用于我们调用. 7.1.函数 函数(既过程 ...
- python菜鸟学习: 4.购物车演练
# -*- coding: utf-8 -*-'''1.启动程序后让用户输入消费额,然后打印商品列表'2.允许用户根据商品编码购买商品3.用户选择商品后,检测余额是否够,够则直接扣款,不够就提醒4.可 ...
- gitee提交过程
https://gitee.com/ 一个线上代码云端软件开发协作平台 首先注册一个账号 然后添加新的仓库 仓库名称和路径是必填项 然后创建项目 选择 克隆存储数据库 存储库位置是网站获取的git位 ...
- python基础篇 12-函数+文件读写+json练习作业
需求: 写一个管理商品的程序,商品文件格式在a.json里面 提供商品的增删改查功能 choice = input('请输入你的选择:1.查看商品 2.新增商品 3.修改商品 4.删除商品') #1. ...
- pnn模型 待整理
https://blog.csdn.net/qq_18293213/article/details/90262378?spm=1001.2101.3001.6650.5&utm_medium= ...
- Monkey 用户指南(译)
原址:https://developer.android.com/studio/test/monkey.html 帮助:google翻译:https://translate.google.cn/ 自己 ...