rt_thread启动流程

启动流程:
1:执行$sub$$main函数,此函数为main扩展函数,就相当于是在main函数里面进行操作,只是他是在执行main函数之前执行。
  在components.c文件中有定义:

/* $Sub$$main 函 数 */
int $Sub$$main(void) {
rtthread_startup();
return 0;
}

在这里 $Sub$$main 函数调用了 rtthread_startup() 函数,其中rtthread_startup() 函数的代码如下所示:

int rtthread_startup(void)
{
    rt_hw_interrupt_disable();  //关闭中断
 /* 板 级 初 始 化: 需 在 该 函 数 内 部 进 行 系 统 堆 的 初 始 化 */
    rt_hw_board_init();
    rt_show_version(); /* 打 印 RT-Thread 版 本 信 息 */
    rt_system_timer_init();/* 定 时 器 初 始 化 */
    rt_system_scheduler_init();/* 调 度 器 初 始 化 */
#ifdef RT_USING_SIGNALS
    rt_system_signal_init();/* 信 号 初 始 化 */
#endif
    rt_application_init(); /*由用户创建的main线程*/
    rt_system_timer_thread_init();/* 定 时 器 线 程 初 始 化 */
    rt_thread_idle_init();/* 空 闲 线 程 初 始 化 */
#ifdef RT_USING_SMP
    rt_hw_spin_lock(&_cpus_lock);
#endif /*RT_USING_SMP*/
    rt_system_scheduler_start();/* 启 动 调 度 器 */
    return 0;
}

2:执行完$Sub$$main 函数后,调用$super$$函数跳转到main函数里面,前面执行一些列初始化的时候,有一个函数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);
}

里面调用了函数rt_thread_create(),这个函数的第二个参数,为线程入口函数main_thread_entry()
main_thread_entry的函数定义如下:

void main_thread_entry(void *parameter)
{
    extern int main(void);
    extern int $Super$$main(void);
    
#ifdef RT_USING_COMPONENTS_INIT
    /* RT-Thread components initialization */
    rt_components_init();
#endif    
#ifdef RT_USING_SMP
    rt_hw_secondary_cpu_up();
#endif
    /* invoke system main function */
#if defined(__CC_ARM) || defined(__CLANG_ARM)
    $Super$$main(); /* for ARMCC. */
#elif defined(__ICCARM__) || defined(__GNUC__)
    main();
#endif
}

在这个函数中执行跳转函数$Super$$main()
  RT-Thread支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺序是:系统先从启动文件开始运行,然后进入 RT-Thread 的启动 rtthread_startup() ,最后进入用户入口main(),如下图所示:
系统启动流程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT-Thread作品秀】智能家居的语音控制方案。作者:xqyjlj 概述智能家居是现在一个很火热的方向,随着人们生活水平的提高,我们都逐渐开始希望身边的电器都可以不用手来控制,本作品就是基于这种需求,开发出来了一个基于语音控制的智能家居方案。本智能家居方案,分为联网与不联网两种版本。其中,无论是联网与不联网,语音识别功能均能正常使用。在本作品没有连上网的情况下,可以进行语音对开关的控制,进行MP3等常用音频文件的播放,以及具有拍照功能,可以将拍下来的照片储存在SD卡内,在本作品连上网的情况下,还附加了以下功能,可以将一些数据上报到云平台(onenet),并且将一些工作日志通过邮件发送给用户。 开发环境硬件:ART_PI(主控) LD3320(语音识别芯片) VS1053(音频解码芯片) OV2640(摄像头) RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:RT-Thread Studio 2.0.0 RT-Thread使用情况概述内核:调度器,信号量。 组件:UART,DFS,SPI,IIC,PIN。 软件包:smtp_client,btstack,netuils,fal,easyflash,littlefs,onenet。 硬件框架主控:ART-PI ART-Pi 是 RT-Thread 团队为嵌入式软件工程师、开源创客设计的一款极具扩展功能的 DIY 开源硬件。致力打造一个开源的软硬件平台。 语音识别芯片:LD3320 LD3320是非特定人(不用针对指定人)语音识别芯片,即语音声控芯片。最多可以识别50条预先内置的指令。 音频解码芯片:VS1053 VS1053是一款利用SPI通讯的音频解码模块,支持大部分的音频文件的解码播放和编码保存 摄像头:OV2640 OV2640是OmniVision公司生产的一颗1/4寸的CMOSUXGA(1632*1232)图像传感器;支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹等自动控制功能。 软件框架说明本项目采用的是多级联控模式。将多个模块的任务分为多个级别,以语音识别为主体,摄像头和语音播报为从体,在语音识别到关键字的时候,会出发相对应的函数,实现不同的效果,而onenet是与语音识别互相独立的,会源源不断的把数据实时发送到云端。 软件模块说明smtp_thread_entry:邮件线程,用于发送邮件。 ld3320_asr_thread:语音识别线程,用于语音识别,调用其他程序。 onenet_upload_entry:onenet线程,用于向云端发送数据。 语音识别过程: 首先初始化LD3320芯片,在对其写入需要识别的关键字数据,之后启动LD3320,之后等待其信号引脚拉低,在其信号引脚拉低后,通过读取其寄存器,我们便能知道LD3320获取到了什么样的关键字。之后便从关键字调取我们的相对应的函数。使之工作于不同的功能。 演示效果演示视频: 比赛感悟在报名这个比赛之后,我的目标其实是比现在的功能多得多的,这一点可以从我的Gitee上面的进度表可以看出,奈何原本打算三个人做的项目,到最后,也是我一个人来完成。自己之前画的板子,也是因为自己画板功力不足,还有焊接能力不足,导致本来拥有更多功能的拓展板也没完成。 不过比赛嘛,重要的不是结果,而是过程。通过这次比赛,我最起码收货到了以下知识: 安卓开发,微信小程序设计,web开发(以上由于个人能力问题,其实并未实现),音频处理,STM32H750的众多DMA的设置,以及bootloader,同时也知道了STM32还能片外运行的神奇事情,也学会了RT-Thread Studio的使用。最重要的事情就是明白了不要过分依赖别人,自己想的计划,就要自己去实现,不要总是把任务布置给其他人。
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值