【转】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中写一些应用代码:

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

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

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

最新文章

  1. MUI(2)
  2. Mime Types
  3. floyd详解
  4. Ftp连接错误
  5. [汇编语言]-第九章 jcxz,loop指令,转移位移的意义
  6. [AHOI 2012]树屋阶梯
  7. MSSQL2005-由嵌套失误感受到的强大智能优化功能
  8. __init__.py的作用
  9. 【Android端ANR卡顿检测】BlockCanary检测
  10. Fire Net HDU - 1045(二分匹配)
  11. poj2115
  12. SRC是在本位置显示:source的缩写,源的意思 HREF是点击后连接的目标:HyperlinkReference,超链接引用
  13. 2018.09.15 秘密的牛奶管道SECRET(次小生成树)
  14. 【SSH框架】之Struts2系列(一)
  15. rails中文本匹配相似度gem包对比
  16. BZOJ 4445 [Scoi2015]小凸想跑步:半平面交
  17. 洛谷P4557 [JSOI2018]战争(闵可夫斯基和+凸包)
  18. oracle数据库中函数和存储过程中的区别
  19. httpclient与webapi
  20. Swift异常处理:throw和rethrow

热门文章

  1. Maven的配置文件-settings.xml内容分解
  2. pypython解构
  3. LOJ-1308-Ant network(蚂蚁的网络)-求割点分隔开的子图个数及乘积
  4. POJ2482 Stars in Your Window 和 test20180919 区间最大值
  5. Spring MVC框架及标签库
  6. js字符串解析与转换成数字
  7. [51Nod 1244] - 莫比乌斯函数之和 & [51Nod 1239] - 欧拉函数之和 (杜教筛板题)
  8. MongoDB 分片管理(一)检查集群状态
  9. Cogs 329. K- 联赛(最大流)
  10. 爬虫与seo优化