0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread编程高阶用法-函数扩展之$Sub$$与$Super$$

RTThread物联网操作系统 来源:RTThread物联网操作系统 2020-06-28 09:18 次阅读

前面移植了RT-Thread Nano,其实准确来说那不叫移植,那叫做部署,因为移植的工作官方已经帮我们做好了。

1、引发思考-相关资料检索

在之前的文章提到过,RT-Thread已经提前在main函数以前就把跟硬件配置、系统初始化、启动调度器等相关的都做好了,所以我们后来看到的main函数非常简洁,真是让人感觉神清气爽,有继续往下写代码的欲望,如下:

main.c

int main(void) { while(1) { rt_kprintf("Hello RTT_NANO "); HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); rt_thread_mdelay(500); } }

那具体RT-Thread又是如何实现在main函数执行之前就把所有初始化硬件、时钟的工作都做了呢?跟随官方文档的RT-Thread代码启动流程:

跟代码,最后发现如下代码:

/* re-define main function */ int $Sub$$main(void) { rtthread_startup(); return 0; } /* the system main thread */ 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) || defined(__CLANG_ARM) $Super$$main(); /* for ARMCC. */ #elif defined(__ICCARM__) || defined(__GNUC__) main(); #endif }

平时工作开发中没用到这样的语法,于是只能搜索文档来看看到底是如何实现的,果然在Keil帮助手册中找到了答案:

从文档中得知,Keil MDK编译器用$Sub$$和$Super$$这两个符号来扩展了 main 函数,这使得使用$Sub$$main可以在main函数执行之前就预先执行$Sub$$main函数,所以在$Sub$$main函数里就可以完成一些基本的硬件、时钟初始化功能,做完这些工作以后,还是得跳转到main函数去执行往后逻辑的呀,这就需要通过调用$Super$$main来实现了。(注:在Keil MDK编译器中是这样的情况,但在IAR以及GCC环境下有差别,这里不做分析,等后面用到再说)。

既然main函数之前能这么用,是不是换个函数也能这么用呢?这引发我的好奇,于是继续查找文档,在armlink_user_guide手册中找到:

接下来开始做实验,然后我用stm32cubeMX生成一个基本裸机工程,下载小熊派上来验证是否正确。

2、小熊派上进行实践

2.1 基本功能配置

配置外部时钟、调试串口、调试接口以及LED

最后生成代码。

2.2 编写代码进行验证

首先添加一个串口重定向函数,后面才能使用printf

int fputc(int ch,FILE *file) { return HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000); }

接下来结合文档模仿RT-Thread写出以下函数:

void $Sub$$main(void) { extern int main(void); extern int $Super$$main(void); //初始化HAL HAL_Init(); //初始化系统时钟 SystemClock_Config(); //初始化GPIO MX_GPIO_Init(); //初始化串口 MX_USART1_UART_Init(); printf("初始化已完成 "); //点灯 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); //回到真正的main函数里 $Super$$main(); }

main函数如下:

int main(void) { //延时2s HAL_Delay(2000); printf("回到main函数中 "); while(1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500); } }

将程序编译后下载到小熊派开发板中,然后打开串口调试助手可以看到:

由此可见,这是一个很有逼格的技能,以后可以在支持这种扩展符号的编译器下将这种技能应用起来,从而简化代码,接下来我们再往上面这个程序里添加功能:添加Function函数和在它之前运行的$Sub$$Function,然后在main函数里调用Function函数:

void $Sub$$Function(void) { extern void Function(void); extern void $Super$$Function(void); printf("在Function函数之前调用$Sub$$Function "); $Super$$Function(); } void Function(void) { printf("执行Function函数 "); } int main(void) { //延时2s HAL_Delay(2000); printf("回到main函数中 "); //调用Function函数 Function(); while(1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500); } }

然后编译后将程序下载到小熊派开发板后,通过串口调试助手看到:

至此,我们已经完全弄明白RT-Thread是如何实现在main函数执行之前就把初始化硬件、系统初始化、启动调度器等工作都完成了的基本原理。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62594
  • 编译器
    +关注

    关注

    1

    文章

    1634

    浏览量

    49128
  • RT-Thread
    +关注

    关注

    31

    文章

    1288

    浏览量

    40116

原文标题:RT-Thread编程高阶用法-函数扩展之$Sub$$与$Super$$

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【S32K146 RT-Thread 使用SFUD组件驱动spi flash

    【S32K146 RT-Thread 使用SFUD组件驱动spi flash
    的头像 发表于 11-21 01:05 282次阅读
    【S32K146 <b class='flag-5'>RT-Thread</b>】<b class='flag-5'>之</b> 使用SFUD组件驱动spi flash

    RT-Thread上CAN实践

    开箱测试RT-Thread官方已完成了对英飞凌XMC7200EVK的移植,通过shell可以看到做好了uart3的console。本文将介绍如何进行RT-ThreadCan移植。接下来我们要完成CAN_FD的驱动移植,并正常启动RT-T
    的头像 发表于 11-13 01:03 1176次阅读
    <b class='flag-5'>RT-Thread</b>上CAN实践

    开源共生 商业共赢 | RT-Thread 2024开发者大会报名启动!

    亲爱的RT-Thread开发者我们很高兴地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread开发者大会)正式启动报名!2024RT-Threa
    的头像 发表于 10-29 08:06 388次阅读
    开源共生 商业共赢 | <b class='flag-5'>RT-Thread</b> 2024开发者大会报名启动!

    2024 RT-Thread全球巡回 线下培训火热来袭!

    亲爱的RT-Thread社区成员们:我们非常高兴地宣布,2024年RT-Thread全球开发者线下培训即将拉开帷幕!24年全球巡回培训将覆盖超10座城市及国家,为开发者提供一个深入学习RT-Thread嵌入式开发的绝佳机会。
    的头像 发表于 08-07 08:35 1221次阅读
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 线下培训火热来袭!

    【好书推荐】RT-Thread设备驱动开发指南

    强烈,他们迫切地希望有一本可以指导他们在RT-Thread上开发驱动的指南。为了解决开发者的燃眉急,《RT-Thread设备驱动开发指南》来了!希望帮助RT-Thre
    的头像 发表于 08-01 08:35 634次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>设备驱动开发指南

    RT-Thread 新里程碑达成——GitHub Star 破万!

    RT-Thread实时操作系统开源项目在GitHub上的star数量突破一万!截止发文,RT-Thread作为实时操作系统在业界Star数量排名第一!仓库地址:https://github.com
    的头像 发表于 07-04 08:35 480次阅读
    <b class='flag-5'>RT-Thread</b> 新里程碑达成——GitHub Star 破万!

    基于 RT-Thread专业版的EtherCAT主站方案

    (一)方案介绍本方案基于RT-Thread专业版,在RT-Thread端集成EtherCAT主站协议,通过EtherCAT对伺服电机或远程IO进行实时控制,具备传输速度快,实时性高,扩展设备灵活等
    的头像 发表于 06-19 08:35 910次阅读
    基于 <b class='flag-5'>RT-Thread</b>专业版的EtherCAT主站方案

    6月6日杭州站RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我们将在杭州举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 05-28 08:35 445次阅读
    6月6日杭州站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    2024 RT-Thread 全球技术大会演讲议程发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)致力于围绕RT-Thread基础软件技术发展、实践创新、开发者能力
    的头像 发表于 05-16 08:34 553次阅读
    2024 <b class='flag-5'>RT-Thread</b> 全球技术大会演讲议程发布!

    新书发布——《实时操作系统应用技术:RT-Thread与ARM编程实践》

    RT-Thread又一本新书《实时操作系统应用技术——基于RT-Thread与ARM的编程实践》发布,标志着RT-Thread生态和实时操作系统技术教育领域又迎来了一个重要里程碑。本书
    的头像 发表于 05-11 08:35 797次阅读
    新书发布——《实时操作系统应用技术:<b class='flag-5'>RT-Thread</b>与ARM<b class='flag-5'>编程</b>实践》

    RT-Thread混合部署Workshop北京站来啦!

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-19 08:34 442次阅读
    <b class='flag-5'>RT-Thread</b>混合部署Workshop北京站来啦!

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-16 08:35 422次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深嵌入式软件工程师农晓明老师为您讲
    的头像 发表于 03-27 11:36 823次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 03-27 08:34 533次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    恩智浦半导体正式加入RT-Thread全球合作伙伴计划!

    前不久,恩智浦半导体正式加入RT-Thread全球合作伙伴计划,成为RT-Thread高级会员合作伙伴。同时,RT-Thread现已成为恩智浦注册合作伙伴(RT-Thread| 简介合
    的头像 发表于 03-14 10:40 620次阅读
    恩智浦半导体正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴计划!