前言

学的东西多了难免有些记不住,通过博客形式记录下来虽然耗费些时间,但总算是留下了一些东西,回头想起来也有迹可循不用完全依赖记忆,顺便也许能对一些同仁提供些许帮助。

本文章主要记录RT-Thread系统的一些简述。
这里还是要为RT-Thread打call,毕竟是我们的国产开源操作系统,支持国产,希望在众多开发者维护下会越来越好。
我用的开发板是正点原子的潘多拉STM32L4开发板,是原子和RT-Thread联合打造的,原子的资料中有两套源码,一套是原子给的HAL库使用例程,另一套是用RT-Thread上的相关外设使用例程。下面我的一些源码展示来自RT-Thread外设使用例程,注意与RT-Thread的最新源码会有一定出入

学习RT-Thread系统主要的获取资料和信息的通道当然还是官网:RT-Thread 官网
同时还提供了社区:RT-Thread 开源社区

官网有一篇文档《RT-Thread编程指南》非常适合初次接触RT-Thread的同学阅读。

内核源码下载:官网下载 (官网给了多个方式提供下载,非常贴心)
github 地址

RT-Thread API参考手册

启动流程

RT-Thread的启动流程有点特殊,在xxx.s启动文件之后没有直接到用户的main函数,而是利用MDK的特殊符号$ Super $ $ and $ Sub $ $ 在用户的main函数前还插入了一段程序用于一些硬件初始化以及系统初始化。
components.c文件中:

关于SuperSuperSuper$ and SubSubSub$的用法,见ARM官网描述

SuperSuperSuper$foo
Identifies the original unpatched function foo(). Use this to call the original function directly.

SubSubSub$foo
Identifies the new function that is called instead of the original function foo(). Use this to add processing before or after the original function.

对这两个符号有兴趣可参考这位大佬的博客进一步了解:$ Super$ $ and $Sub $ $的用法

针对这个符号我也另起了一篇$ Super$ $ and $Sub $ $的用法

注意:$ Super $ $ and $ Sub $ $要成对使用,且只在MDK中使用。

主要看rtthread_startup()函数:

int rtthread_startup(void)
{rt_hw_interrupt_disable();/* 板级硬件初始化  使用的硬件初始化,包括串口初始化,系统时钟配置等  HAL库的HAL_Init()也在这里* NOTE: please initialize heap inside board initialization.*/rt_hw_board_init();/* 显示 RT-Thread 的版本号 */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();//这里面很有意思,把main函数当成一个进程来运行了/* timer thread initialization */rt_system_timer_thread_init();/* 创建空闲任务 */rt_thread_idle_init();#ifdef RT_USING_SMPrt_hw_spin_lock(&_cpus_lock);
#endif /*RT_USING_SMP*//* 开启调度器 */rt_system_scheduler_start();/* never reach here */return 0;
}

官方的启动流程图:

其中有一个应用初始化的函数里面创建了一个main进程,这里面的处理很有意思,main进程里把main函数当成一个进程的一部分代码去运行了(相当于main()函数变成了一个进程,这跟我们用ucos,freeRTOS的思路不太一样)。

真正的main函数就比较简单了。

int main(void)
{unsigned int count = 1;/* set LED pin mode to output */rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);while (count > 0){/* led on */rt_pin_write(LED_PIN, PIN_LOW);rt_kprintf("led on, count: %d\n", count);rt_thread_mdelay(500);/* led off */rt_pin_write(LED_PIN, PIN_HIGH);rt_kprintf("led off\n");rt_thread_mdelay(500);count++;}return 0;
}

RT-Thread工程代码框架分析——(1)启动流程相关推荐

  1. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  2. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  3. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. JNI开发笔记(三)--JNI工程的框架分析

    JNI工程的框架分析 引 1. JNI工程的组成部分 2. 各个部分之间的关系 引 JNI开发笔记(一)–Android Studio安装与环境搭建 JNI开发笔记(二)–创建JNI基础工程并运行 1 ...

  5. linux usb host复位,Linux USB Host-Controller的初始化代码框架分析

    Linux USB Host-Controller的初始化代码框架分析 http://blog.csdn.net/zkami usb_hcd_omap_probe (const struct hc_d ...

  6. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 主线程创建 Activity 实例之前使用插件 Activity 类替换占位的组件 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  7. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | AMS 启动前使用动态代理替换掉插件 Activity 类 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 反射获取 IActivityManager 对象 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. skydive前端代码框架分析

    skydive前端代码: https://github.com/skydive-project/skydive/tree/master/statics 前端代码使用框架分析: 以vue-2.1.9框架 ...

最新文章

  1. 人脸识别(二)——训练分类器的补充说明
  2. linux grpc,grpc linux下的编译使用-Go语言中文社区
  3. 数学:乘法逆元-拓展GCD
  4. 中国版MSN慈善缘何遇冷:白领网民参与只为时尚(转自--竞报)
  5. Linux操作系统下激活网卡命令
  6. Laravel nginx 伪静态规则
  7. Icacls管理工具的使用
  8. 线上IIS应用程序池自动关闭
  9. 如何用python爬视频_如何使用python网络爬虫抓取视频?
  10. 魔兽世界 | 宏命令教程
  11. Python 之多元线性回归分析
  12. android支持pcm格式转换,Android中Pcm文件转Amr文件
  13. 建立统计回归模型的基本步骤_基本回归模型
  14. 协议、接口、服务的联系
  15. 微擎模块 抖音口红机 3.2.0+wap登陆1.3.0增加首页banner跳转链接
  16. zedboard u-boot编译的心路历程
  17. 网站建设好但是访问不了的原因及解决方法
  18. Python+Selenium实现新浪微博自动登录
  19. 系统分析与控制_多智能体协同控制研究中各定位系统分析
  20. Python案例-网络编程-socket入门-serverclient

热门文章

  1. Google与Pixar开发Draco支持USD格式 加速3D对象传输
  2. 网易易盾李雨珂:服务性能+算法确定性优化,迎接5G时代内容安全爆发式流量增长...
  3. 通过Canvas在浏览器中更酷的展示视频
  4. Zoom的Web客户端与WebRTC有何不同?
  5. 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历
  6. 《直播疑难杂症排查系列》之一 :播放失败
  7. webRTC+coturn穿透服务器的安装与搭建
  8. RTMPdump(libRTMP)源代码分析 4: 连接第一步——握手(Hand Shake)
  9. leetcode 722. Remove Comments | 722. 删除注释(Java)
  10. 【Java 排序】重写Compare方法,实现自己定义排序