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

    文章

    4406

    浏览量

    66813
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51070
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44254

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 475次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    rt-thread studio 导入BSP 失败怎么解决?

    rt-thread studio 手动导入bsp 失败。 版本: 2.2.8 构建ID: 202405200930 导入的bsp 是直接从rt-thread 代码仓库下载的 .log
    发表于 10-11 11:07

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1128次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式启动!

    RT-Thread 5.1.0版本中调用rt_sfud_flash_probe()函数报错的原因?

    使用RT-Thread Studio编译器,RT-Thread版本5.1.0 三、配置过程 1、启用SPI和SFUD 2、修改sfud_cfg.h文件 3、修改sfud_flash_def.h文件 4
    发表于 09-18 06:08

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以为修改index_all.json,发现联网的时候,会自动覆盖 另lastet版本
    发表于 09-16 06:06

    在Ubuntu上开发基于先楫MCU的RT-Thread应用指南

    1、前言RT-ThreadEnv是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的menuconfig
    的头像 发表于 08-29 12:22 1219次阅读
    在Ubuntu上开发基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用指南

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统的RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微控制器的核心
    的头像 发表于 08-24 10:05 685次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一个原生的嵌入式操作系统内核。初识Rust是因为xk
    的头像 发表于 08-02 11:03 3193次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全内核 RusT-<b class='flag-5'>Thread</b> 的诞生

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2418次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动调度的工作
    的头像 发表于 06-25 18:24 1434次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> 线程调度流程

    揭秘RT-Thread上的AUTOSAR CP系统

    标准,同时保留RT-Thread的POSIX支持与可裁剪性,实现了通信隔离、诊断模块集成等关键技术突破,为车载系统提供高安全、可扩展的解决方案。车载电子系统与传统
    的头像 发表于 06-23 20:22 2938次阅读
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系统

    2025 RT-Thread全球技术大会议程正式发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)是聚焦基础软件技术创新与实践的嵌入式技术盛会,持续推动技术价值转化
    的头像 发表于 05-27 19:28 1065次阅读
    2025 <b class='flag-5'>RT-Thread</b>全球技术大会议程正式发布!

    【直播预告】《实时操作系统应用技术—基于RT-Thread与ARM的编程实践》教学脉络及资源简介

    直播预告直播主题:《实时操作系统应用技术—基于RT-Thread与ARM的编程实践》教学脉络及资源简介开放时间:2025年5月29日(周四)20:00主讲老师:王宜怀课程类型:视频直播观看平台
    的头像 发表于 05-26 17:50 1093次阅读
    【直播预告】《实时操作系统应用技术—基于<b class='flag-5'>RT-Thread</b>与ARM的<b class='flag-5'>编程</b>实践》教学脉络及资源简介

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1058次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2431次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上