大功率无感电阻
NEWS

RT-Thread编程功能扩展$ Sub $$和$ Super $$的高级用法

RT-Thread Nano较早被移植。

实际上,这不是所谓的移植,而是称为部署,因为官方的移植工作已经为我们完成。

文章链接:Xiaoxiong派系移植了RT-Thread Nano 1.与思想相关的信息检索如上一篇文章所述,在主要功能完成之前,RT-Thread与硬件配置,系统初始化,启动调度程序等有关。

因此我们稍后看到的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如何在执行主要功能之前实现所有初始化硬件和时钟?遵循官方文档RT -Thread代码启动过程:遵循代码,最后找到以下代码:/ *重新定义主函数* / int $ Sub $$ main(void){rtthread_startup(); return 0;} / *系统主线程* / void main_thread_entry(void * parameter){extern int main(void); extern int $ Super $$ main(void); / * RT-Thread组件初始化* / rt_components_init(); / *调用系统主函数* /#如果已定义(__CC_ARM)|| define(__ CLANG_ARM)$ Super $$ main(); / *对于ARMCC。

* /#elif定义(__ICCARM__)|| define(__ GNUC__)main();#endif)在正常的工作和开发语法中不使用此语法,因此我只能搜索文档以了解其实现方式。

果然,我在Keil帮助手册中找到了答案:从文档中,Keil MDK编译器使用两个符号$ Sub $$和$ Super $$来扩展main函数,这允许使用$ Sub $$ main在执行主函数之前执行$ Sub $$ main函数,因此一些基本的硬件和时钟初始化函数可以在$ Sub $$ main函数中完成。

完成这些任务后,您仍然必须跳至main函数以执行随后的逻辑,这需要通过调用$ Super $$ main来实现。

(注意:在Keil MDK编译器中就是这种情况。

但是IAR和GCC环境之间存在差异,因此我在这里不对其进行分析,稍后我们将对其进行讨论。

)由于main函数可用于这样可以在其他功能中使用吗?这句话引人好奇,我继续搜索该文档,并在armlink_user_guide手册中找到了它:接下来,我开始进行实验,然后我使用stm32cubeMX生成了一个基本的裸机项目并将其下载到Bear进行验证是正确的。

2.小​​熊练习2.1基本功能配置配置外部时钟,调试串口,调试接口和LED最终生成代码。

2.2编写验证代码。

首先添加一个串行端口重定向功能,然后可以使用printf int fputc(int ch,FILE * file){return HAL_UART_Transmit(& huart1,(uint8_t *)& amp; 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); //返回真正的主函数$ Super $$ main();}主函数如下:int main(void){//延迟2s HAL_Delay(2000); printf(“返回主函数 ”); while(1){HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); HAL_Delay(500); }}编译程序后,将其下载到bear pie开发板上,然后打开串行调试助手以查看:可以看出,这是一个非常引人注目的技能,您可以在支持此扩展的编译器中应用此技能。

符号,以简化代码,然后将函数添加到上述程序中:添加函数函数并在$ Sub $$ Function之前运行,然后在主函数中调用Function函数:void $ Sub $$ Function (void){extern void Function(void); extern void $ Super $$ Function(void);函数中的printf(&quot ;,在调用$ Sub $$ Function之前 ”); $ Super $$ Function();} void Function(void){printf("执行函数功能 ");} int main(void){//延迟2s HAL_Delay(2000); printf(“返回主函数 ”); //调用函数function Function(); while(1){HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); HAL_Delay(500); }}然后,在编译之后,将该程序下载到bear pie开发板上,并通过串行调试助手进行查看:至此,我们已经完全理解RT-Thread如何实现初始化硬件,系统初始化和启动硬件的基本原理。

主功能执行之前的调度程序。

3.案例下载,公众号后台回复:主要是

欢迎您的咨询