RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main

摘要:
跳转到R0地址执行并返回此处(BLX是带链接的跳转,②如果有函数foo(),则将主函数地址赋给R0;使用$Sub$$foo before/fafter foo()函数添加一些新的程序代码。使用此$Super$$foo函数直接跳转到foo()函数。]$Sub$$main主要包含一些系统启动代码(系统初始化)。创建应用程序线程(此处将用户主函数作为线程)。

【转】https://blog.csdn.net/yang1111111112/article/details/80913001

我们找到系统复位的地方,可以往下单步跟踪。

①从系统初始化开始执行,将函数地址赋给R0寄存器,跳转到R0地址执行并返回此处(BLX是带链接的跳转,即带返回的跳转)。

②将main函数地址给R0,将函数地址赋给R0,跳转到R0地址执行,不返回(BX是跳转,不返回)。

RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main第1张

③跳转到了$Sub$$main。

【注:在 __CC_ARM 编译器环境下,使用了$Sub$$ 与 $Super$ $ 的“补丁”功能。

详见http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0377g/pge1362065967698.html
RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main第2张

这是一种特殊模式:用于有一个已经存在且不能被改变的函数 的情况。使用这两个模式可以帮原函数打补丁。如存在一个函数foo();

$Sub$ $foo :定义的新功能函数,在foo()函数之前/后使用$Sub$ $foo 可以添加一些新的程序代码。

$Super$ $foo :就是原始的未修补的foo函数,使用这个$Super$ $foo函数将直接跳转到foo()函数。

$Sub$$main 中主要是一些系统启动代码(系统初始化)。

 RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main第3张

④在rtthread_startup中,主要实现了板级初始化(初始化外设和驱动);打印RT-Thread的logo和版本信息;初始化系统定时器;初始化调度器;创建application线程(这里将用户main函数作为一个线程,用户main里面是空的);初始化软件定时器;创建空闲线程;启动系统调度(启用调度后,main函数就会参与调度开始运行)。

【所以说 $Sub$ $main在main之前干的活就是进行rt-thread系统初始化,为了让用户更方便的使用,让用户不要操心的太多】

 RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main第4张

以下是在rt_application_init()函数中创建的main函数线程:

 RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main第5张

RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main第6张

$Super$ $mian 可以直接跳到main()函数; 用户可以在main中写一些应用代码:

 RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main第7张

总结:可以这样使用给main函数打补丁:

int $Sub$$main(void)
{
    //添加补丁函数
 
    $Super$$main(); //使用本句直接转到main()运行
}

 当然,main()函数也可以是自己的其他函数,操作都是一样的,换一下函数名就好了

免责声明:文章转载自《RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IP地址划分linux驱动学习(2)beep驱动下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用TSQL的Rand函数生成随机数的艰苦历程

在上一篇《大量数据插入的几种方式的速度比较》里,有一列数据是用Rank函数来生产的,用来造假数据。 现在的问题是,如果要更新这一列的值,怎么办呢?也许全部删除,重新插入一遍就可以。但是太慢了。于是随手就写出了下面的代码。   Update aTable Set aColumn = @MaxInt *RAND()   结果完全出乎意料,这一列的值全是一样的!...

[转]如何定位Release程序崩溃原因

1       案例描述作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭。请与您的供应商联系。呵呵,这句微软的“名言”,恐怕是程序员最怕见也最常见的东西了。 在一个大型软件的测试过程中,初期出现程序崩溃似乎成了不可避免的事。其实测试中出现程序崩溃并不可怕,反而是测试的成功。...

积少成多Flash(7) ActionScript 3.0 交互之鼠标事件和键盘事件

[索引页][源码下载]积少成多Flash(7) - ActionScript 3.0 交互之鼠标事件和键盘事件 作者:webabcd介绍演示使用 Flash ActionScript 3.0 来监听用户的键盘事件和鼠标事件,并对其作相应的处理 键盘事件 - 在 flash.events.KeyboardEvent 类下。只有两个事件类型 Keyboard...

ParallelsDesktop安装精简版系统

本文原文链接地址:http://nullpointer.pw/ParallelsDesktop%E5%AE%89%E8%A3%85%E7%B2%BE%E7%AE%80%E7%89%88%E7%B3%BB%E7%BB%9F.html 分享一个虚拟机安装精简版 Windows10 系统的方法,只占用 5G 存储空间大小的完整版 win10 系统哦,不要安装那些...

Django测试pytest

一、概述1. 课程概述2. 课程安排二、接口测试1.【知道】什么是接口测试2. 环境准备3. Postman的基本使用3.1【掌握】借助Postman完成接口测试3.2【掌握】导出导入Postman测试记录4. Requests的使用4.1 发送GET请求4.1.1【掌握】发送GET请求4.1.2【掌握】响应状态码、响应头、响应体4.1.3【知道】字符编码...

斐讯 N1 刷 Armbian 5.64

前言 N1 天天链是斐讯出的一款挖矿产品,虽然已经翻车,但是本身硬件配置还是很不错的,晶晨 S905D 主控,蓝牙 4.1,双频 WiFi,2G + 8G,USB2.0,HDMI。而一个只要不到 80 块,真是玩 Linux 神器。买了个回来折腾刷上了 Armbian 5.64,记录一下折腾过程。 准备工作 硬件: N1 一个,U 盘一个(推荐闪迪酷豆 C...