$Super$$和$Sub$$是KEIL编译器中可以使用的两个特殊符号。

$Super$$ 这个符号用来直接调用原始函数,例如原始函数名为foo(),使用此符号可以写为$Super$$foo()。

$Sub$$ 这个符号用来代替原始的函数,例如原始函数名为foo(),使用此符号可以写为$Sub$$foo()。

实例:在RTT源码中,程序启动流程中用到了这两个知识点。

1、运行 $Sub$$main()

int $Sub$$main(void)

{

rt_hw_interrupt_disable();

rtthread_startup();

return 0;

}

2、进入rtthread_startup()

int rtthread_startup(void)

{

rt_hw_interrupt_disable();

/* board level initalization

* NOTE: please initialize heap inside board initialization.

*/

rt_hw_board_init();

/* show RT-Thread version */

rt_show_version();

/* timer system initialization */

rt_system_timer_init();

/* scheduler system initialization */

rt_system_scheduler_init();

#ifdef RT_USING_SIGNALS

/* signal system initialization */

rt_system_signal_init();

#endif

/* create init_thread */

rt_application_init();

/* timer thread initialization */

rt_system_timer_thread_init();

/* idle thread initialization */

rt_thread_idle_init();

/* start scheduler */

rt_system_scheduler_start();

/* never reach here */

return 0;

}

3、进入rt_application_init()

void rt_application_init(void)

{

rt_thread_t tid;

#ifdef RT_USING_HEAP

tid = rt_thread_create("main", main_thread_entry, RT_NULL,

RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);

RT_ASSERT(tid != RT_NULL);

#else

rt_err_t result;

tid = &main_thread;

result = rt_thread_init(tid, "main", main_thread_entry, RT_NULL,

main_stack, sizeof(main_stack), RT_MAIN_THREAD_PRIORITY, 20);

RT_ASSERT(result == RT_EOK);

/* if not define RT_USING_HEAP, using to eliminate the warning */

(void)result;

#endif

rt_thread_startup(tid);

}

4、运行main_thread_entry任务

void main_thread_entry(void *parameter)

{

extern int main(void);

extern int $Super$$main(void);

/* RT-Thread components initialization */

rt_components_init();

/* invoke system main function */

#if defined (__CC_ARM)

$Super$$main(); /* for ARMCC. */

#elif defined(__ICCARM__) || defined(__GNUC__)

main();

#endif

}

5、运行$Super$$main()

$Super$$main()实际上就是调用main,这里的main就是main.c中的main函数

int main(void)

{

return 0;

}

总结,启动流程为:

$Sub$$main()->rtthread_startup()->rt_application_init()->main_thread_entry()->$Super$$main()->main()。

最新文章

  1. Spring Cloud Alibaba 高级特性 基于 Sleuth+Zipkin 实施链路跟踪体系
  2. 常识性概念图谱建设以及在美团场景中的应用
  3. linux中fstab含义,fstab每一列的含义
  4. 软件工程 团队作业 #9
  5. 数格子算面积的方法_面试小学数学经典教案:《什么是面积》
  6. C语言查看tuxedo队列长度,tuxedo的常用启、停、参数讲解、日志查看
  7. Ubuntu系统---C++之Eclipse IDE 编译器安装
  8. webpack ,require.ensure配合oclazyload 实现ng1模块懒加载
  9. JDK ThreadLocal解析
  10. 最新多种方式, 判断客户端IP是国内还是国外?
  11. 如何解决aar中的第三方依赖无法调用问题
  12. ILSVRC2015_DET.tar.gz下载地址
  13. 2022 年需要掌握的 5 种嵌入式技术
  14. 2020!前端开发应知网站(墙裂推荐!)
  15. 【物联网实训项目】------(五)家庭智慧安防系统之智能监控
  16. ElementUI 图标字体无法正常显示 本地CDN文件
  17. Teams下载安装教程
  18. PLA,FPGA 简介
  19. ENSP网络综合实验
  20. Infopath入门到精通系列-4 Infopath myschema.xsd文件 解析

热门文章

  1. 全球及中国乙氧基化烷基硫酸钠行业运行态势与需求趋势预测报告(2022~2027年)
  2. 生成带微信头像的用户二维码
  3. 4.8 putsgets函数
  4. 计算机打字200字,学打字的作文200字
  5. 新浪微博的架构发展历程
  6. 14年macmini装双硬盘_苹果2014款Mac mini更换固态硬盘图文教程
  7. gis生成道路中心线_ArcGIS方法-利用到路面提取道路中心线的方法
  8. iOS控件使用和多样布局
  9. 软件测试好学吗 入门还是很好学的,但想要深造就还是要费功夫
  10. Qt中使用TCP和MC协议与三菱Q系列PLC通信