RT-Thread代码启动过程与$Sub$ $main、$Super$ $main
2024-09-03 15:34:28
文章转载自:https://blog.csdn.net/yang1111111112/article/details/80913001
我们找到系统复位的地方,可以往下单步跟踪。
①从系统初始化开始执行,将函数地址赋给R0寄存器,跳转到R0地址执行并返回此处(BLX是带链接的跳转,即带返回的跳转)。
②将main函数地址给R0,将函数地址赋给R0,跳转到R0地址执行,不返回(BX是跳转,不返回)。
③跳转到了$Sub$$main。
【注:在 __CC_ARM 编译器环境下,使用了$Sub$$ 与 $Super$ $ 的“补丁”功能。
详见http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0377g/pge1362065967698.html
这是一种特殊模式:用于有一个已经存在且不能被改变的函数 的情况。使用这两个模式可以帮原函数打补丁。如存在一个函数foo();
$Sub$ $foo :定义的新功能函数,在foo()函数之前/后使用$Sub$ $foo 可以添加一些新的程序代码。
$Super$ $foo :就是原始的未修补的foo函数,使用这个$Super$ $foo函数将直接跳转到foo()函数。
】
$Sub$$main 中主要是一些系统启动代码(系统初始化)。
④在rtthread_startup中,主要实现了板级初始化(初始化外设和驱动);打印RT-Thread的logo和版本信息;初始化系统定时器;初始化调度器;创建application线程(这里将用户main函数作为一个线程,用户main里面是空的);初始化软件定时器;创建空闲线程;启动系统调度(启用调度后,main函数就会参与调度开始运行)。
【所以说 $Sub$ $main在main之前干的活就是进行rt-thread系统初始化,为了让用户更方便的使用,让用户不要操心的太多】
以下是在rt_application_init()函数中创建的main函数线程:
$Super$ $mian 可以直接跳到main()函数; 用户可以在main中写一些应用代码:
可以如下使用:
uint8_t func(void)
{
uint8_t var1 = ;
var1++;
return var1;
} /* 调用func前调用下面函数功能 */
void $Sub$$func(void)
{
int var2 = ;
var2 += ; /* 调用结束后再返回到原func指向代码,也可以屏蔽下面代码不执行原func代码功能 */
extern void $Super$$func(void);
$Super$$func();
} uint8_t var = ; int main(void)
{
var = func();
return ;
}
最新文章
- Mysql服务启动的时候 如何加载配置文件
- 利用pip8.1.2 安装django1.9.7
- php内存缓存
- IOS 多级列表展开控件
- 目录启动CXF启动报告LinkageError异常以及Java的endorsed机制
- java第四课:数组
- Windows恢复Grub引导,用grub安装ubuntu
- IBM的人工智能“沃森”首次确诊罕见白血病,只用了10分钟!
- 【原创】IE8升级到IE11控制台报错的解决方案
- Java基础小知识1——分别使用字节流和字符流复制文件
- xpath语法大全
- JavaScript中的Generator函数
- qml: QtCharts模块的使用(基本配置)------<;一>;
- React性能优化记录(不定期更新)
- A4988和CNC SHIELD使用方法 步进电机
- springcloud config
- [Understanding] Compressive Sensing and Deep Model
- [LeetCode] 209. Minimum Size Subarray Sum_Medium
- Ajax同步
- 关于echarts堆叠图标问题 ,某条数数不需要堆叠的处理
热门文章
- Crontab的格式说明
- Flutter 获取网络数据及渲染列表
- 《剑指offer》树专题 (牛客10.25)
- C语言递归之在每个树行中找最大值
- 攻防世界WEB新手练习
- Bootstrap 控制台示例
- vue中的axios.post使用json数据传输,出现请求头字段内容类型是不被允许的情况的解决方案
- Scrapy setup.py 各参数详解
- DAG添边定理
- Timezone offset does not match system offset: 0 != -32400. Please, check your config files