zoukankan      html  css  js  c++  java
  • RT-Thread代码启动过程与$Sub$ $main、$Super$ $main

    文章转载自: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 = 0;
        var1++;
        return var1;
    }
    
    /* 调用func前调用下面函数功能 */
    void $Sub$$func(void)
    {
        int var2 = 0;
        var2 += 2;
        
        /* 调用结束后再返回到原func指向代码,也可以屏蔽下面代码不执行原func代码功能 */
        extern void $Super$$func(void);
        $Super$$func();
    }
    
    uint8_t var = 0;
    
    int main(void)
    {
        var = func();
        return 0;
    }
  • 相关阅读:
    使用hibernate实现树形结构无限级分类
    专家看台:盛大架构师周爱民回顾职业历程,分享十项建议
    开始运行命令大全
    rsvp.exe,AdskScSrv.exe ,avp.exe
    Web2.0 编程思想:16条法则
    李嘉诚:性格才是命运的决定因素
    中兴笔试题目
    管理Websphere的10个有用命令
    我的程序语言实践
    20200514:实现分布式Session的过程是怎样的?
  • 原文地址:https://www.cnblogs.com/yeshenmeng/p/11578664.html
Copyright © 2011-2022 走看看