文章转载自: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 ;
}

最新文章

  1. Mysql服务启动的时候 如何加载配置文件
  2. 利用pip8.1.2 安装django1.9.7
  3. php内存缓存
  4. IOS 多级列表展开控件
  5. 目录启动CXF启动报告LinkageError异常以及Java的endorsed机制
  6. java第四课:数组
  7. Windows恢复Grub引导,用grub安装ubuntu
  8. IBM的人工智能“沃森”首次确诊罕见白血病,只用了10分钟!
  9. 【原创】IE8升级到IE11控制台报错的解决方案
  10. Java基础小知识1——分别使用字节流和字符流复制文件
  11. xpath语法大全
  12. JavaScript中的Generator函数
  13. qml: QtCharts模块的使用(基本配置)------<一>
  14. React性能优化记录(不定期更新)
  15. A4988和CNC SHIELD使用方法 步进电机
  16. springcloud config
  17. [Understanding] Compressive Sensing and Deep Model
  18. [LeetCode] 209. Minimum Size Subarray Sum_Medium
  19. Ajax同步
  20. 关于echarts堆叠图标问题 ,某条数数不需要堆叠的处理

热门文章

  1. Crontab的格式说明
  2. Flutter 获取网络数据及渲染列表
  3. 《剑指offer》树专题 (牛客10.25)
  4. C语言递归之在每个树行中找最大值
  5. 攻防世界WEB新手练习
  6. Bootstrap 控制台示例
  7. vue中的axios.post使用json数据传输,出现请求头字段内容类型是不被允许的情况的解决方案
  8. Scrapy setup.py 各参数详解
  9. DAG添边定理
  10. Timezone offset does not match system offset: 0 != -32400. Please, check your config files