技术笔记20230721 rBoot学习6
继续学习rBoot。前几天看完了rBoot的readme,今天在网上看到了几篇分析rBoot的文章。顺着文章的思路学习一下。
工程创建
我学习ESP8266使用的系统是windows,所以选择了方便安装与使用的安信可一体化开发工具AiThinker_IDE v0.5。AiThinker_IDE中的ConfigTool使用默认配置。先构建一个rBoot例程项目。分别从git仓库中下载rBoot和esptool2,然后将他们复制到同一文件夹下。我的工程目录是这样的:
.
├── rBoot
├── esptool2
分别将rBoot与esptool2导入到AiThinker_IDE中。导入时选择Existing Code as Makefile Project
和Cygwin GCC
。然后先编译esptool2再编译rBoot即可。
分析代码流程
由于链接脚本中定义的入口函数ENTRY
为call_user_start
,我们先看一下这个函数的定义。此函数有汇编版本与C语言版本,如rBoot作者所说,使用gcc编译时使用汇编版本的入口函数,而C语言版本的入口函数虽然会占用stack但其他功能与汇编版本相同。C语言更直观,容易理解,下面就看一下C语言版本的call_user_start
。
// small stub method to ensure minimum stack space used
void call_user_start(void) {
uint32_t addr;
stage2a *loader;
addr = find_image(); // 1.找到image的地址
if (addr != 0) {
loader = (stage2a*)entry_addr; // 2.加载image
loader(addr);
}
}
此函数主要流程为找到image的地址、加载image。那我们继续看一下rBoot是如何找到image地址的。