【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程序和用户程序不发生冲突💥。
作者:Baiyug
出处:https://www.cnblogs.com/Baiyug/p/16247124.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~