RT-Thread概述与体验

news2024/11/26 10:02:16

RTT目录结构

在这里插入图片描述
最核心的文件只有5个:

  • src\thread.c:线程相关的文件,比如创建线程、启动线程。
  • src\timer.c:定时器相关的文件。
  • src\scheduler.c:调度器:维护线程的就绪链表、提供临界区的进出函数。
  • src\ipc.c:实现了线程间通信的各类对象:消息队列、信号量、互斥量、事件等。
  • include\rtservice.h:提供了链表操作

启动流程及main函数

在startup_stm32f103xe.S中,首先进入SystemInit,系统初始化,初始化系统时钟,以及向量表重定位。

void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= 0x00000001U;

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#if !defined(STM32F105xC) && !defined(STM32F107xC)
  RCC->CFGR &= 0xF8FF0000U;
#else
  RCC->CFGR &= 0xF0FF0000U;
#endif /* STM32F105xC */   
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= 0xFEF6FFFFU;

  /* Reset HSEBYP bit */
  RCC->CR &= 0xFFFBFFFFU;

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= 0xFF80FFFFU;

#if defined(STM32F105xC) || defined(STM32F107xC)
  /* Reset PLL2ON and PLL3ON bits */
  RCC->CR &= 0xEBFFFFFFU;

  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x00FF0000U;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000U;
#elif defined(STM32F100xB) || defined(STM32F100xE)
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000U;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000U;      
#else
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000U;
#endif /* STM32F105xC */
    
#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
  #ifdef DATA_IN_ExtSRAM
    SystemInit_ExtMemCtl(); 
  #endif /* DATA_IN_ExtSRAM */
#endif 

#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 
}

然后进入entry

/* Add -eentry to arm-none-eabi-gcc argument */
int entry(void)
{
    rtthread_startup();
    return 0;
}
#endif

进入内核启动

int rtthread_startup(void)
{
    rt_hw_interrupt_disable(); //关中断

    /* board level initialization
     * NOTE: please initialize heap inside board initialization.
     */
    rt_hw_board_init();

    /* show RT-Thread version */
    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();

    /* timer thread initialization */
    rt_system_timer_thread_init();

    /* idle thread initialization */
    rt_thread_idle_init();

#ifdef RT_USING_SMP
    rt_hw_spin_lock(&_cpus_lock);
#endif /*RT_USING_SMP*/

    /* start scheduler */
    rt_system_scheduler_start();

    /* never reach here */
    return 0;
}
#endif

系统开始调度后,进入main_thread_entry

/* the system main thread */
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
}

rt_components_init()组件初始化
进入main函数

void rt_components_init(void)
{
#if RT_DEBUG_INIT
    int result;
    const struct rt_init_desc *desc;

    rt_kprintf("do components initialization.\n");
    for (desc = &__rt_init_desc_rti_board_end; desc < &__rt_init_desc_rti_end; desc ++)
    {
        rt_kprintf("initialize %s", desc->fn_name);
        result = desc->fn();
        rt_kprintf(":%d done\n", result);
    }
#else
    const init_fn_t *fn_ptr;

    for (fn_ptr = &__rt_init_rti_board_end; fn_ptr < &__rt_init_rti_end; fn_ptr ++)
    {
        (*fn_ptr)();
    }
#endif
}

组件初始化:初始化一系列组件,创建了SHELL线程,用户可以在串口上输入各种命令。因此main函数为空函数时,也可以通过SHELL访问。

#if defined(__CC_ARM) || defined(__CLANG_ARM)
    $Super$$main(); /* for ARMCC. */
#elif defined(__ICCARM__) || defined(__GNUC__)
    main();
#endif

S u p e r Super Super$main函数:就是调用main函数
在这里插入图片描述
rt_components_init函数中已经创建了SHELL线程,用户可以通过串口跟它交互。所以即使main函数为空,还是可以通过串口操作开发板。

每个工程都有一个 main.c 文件:

  • 可以把 main 函数写为空函数
  • 可以在 main 函数里面创建线程
  • 也可以在 main.c 任意位置使用宏 MSH_CMD_EXPORT 定义命令,然后在串口中执行这个命令

在这里插入图片描述

数据类型和编程规范

在这里插入图片描述
RT-Thread的数据类型定义在rtdef.h中,涉及8位、16位、32位、64位的定义。

格式为都以rt_开头,然后指明是否是有符号类型和位数,最后以_t结尾。

/* RT-Thread basic data type definitions */
#ifndef RT_USING_ARCH_DATA_TYPE
typedef signed   char                   rt_int8_t;      /**<  8bit integer type */
typedef signed   short                  rt_int16_t;     /**< 16bit integer type */
typedef signed   int                    rt_int32_t;     /**< 32bit integer type */
typedef unsigned char                   rt_uint8_t;     /**<  8bit unsigned integer type */
typedef unsigned short                  rt_uint16_t;    /**< 16bit unsigned integer type */
typedef unsigned int                    rt_uint32_t;    /**< 32bit unsigned integer type */

#ifdef ARCH_CPU_64BIT
typedef signed long                     rt_int64_t;     /**< 64bit integer type */
typedef unsigned long                   rt_uint64_t;    /**< 64bit unsigned integer type */
#else
typedef signed long long                rt_int64_t;     /**< 64bit integer type */
typedef unsigned long long              rt_uint64_t;    /**< 64bit unsigned integer type */
#endif
#endif

typedef int                             rt_bool_t;      /**< boolean type */
typedef long                            rt_base_t;      /**< Nbit CPU related date type */
typedef unsigned long                   rt_ubase_t;     /**< Nbit unsigned CPU related data type */

typedef rt_base_t                       rt_err_t;       /**< Type for error number */
typedef rt_uint32_t                     rt_time_t;      /**< Type for time stamp */
typedef rt_uint32_t                     rt_tick_t;      /**< Type for tick count */
typedef rt_base_t                       rt_flag_t;      /**< Type for flags */
typedef rt_ubase_t                      rt_size_t;      /**< Type for size number */
typedef rt_ubase_t                      rt_dev_t;       /**< Type for device */
typedef rt_base_t                       rt_off_t;       /**< Type for offset */

还定义特殊数据类型,比如rt_base_t是基础数据类型,和芯片位数有关,在Cortex-M3等32位架构中,就是32位的;在 A57 等 64 位架构中,它就是 64 位的。

rt_err_t用于记录错误编号。

rt_time_t 用于时间戳
rt_tick_t用于周期性时钟tick计数。

函数名使用英文小写,单词之间使用_连接,通常以rt开头。

如果函数入口参数是空,必须使用void作为入口参数。

内部静态函数,则以_开头。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/953004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CRM系统有哪些类型?如何管理客户关系?

什么是是客户关系管理 Zoho CRM是一种经营策略帮助企业建立客户为中心的企业管理模式同时CRM也是一种技术手段帮助企业建立牢靠的客户关系&#xff0c;实现降本增效的目的。例如建立全渠道沟通&#xff0c;提高客户满意度&#xff0c;跟进客户细分开展个性化的营销活动提高市场…

uniapp--- 微信小程序 用户隐私新规相关代码调整【vue3+ts+uView框架】

uniapp— 微信小程序 用户隐私新规相关代码调整【vue3tsuView框架】 官方公告地址&#xff1a;https://developers.weixin.qq.com/community/develop/doc/00042e3ef54940ce8520e38db61801 用户隐私保护指引填写说明地址&#xff1a;https://developers.weixin.qq.com/miniprogr…

C++信息学奥赛1177:奇数单增序列

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int arr[n]; // 创建大小为 n 的整型数组for(int i0;i<n;i) cin>>arr[i]; // 输入数组元素for(int i0;i<n;i){ // 对数组进行冒泡排序f…

Resource Hacker下载

下载路径 Resource Hacker (angusj.com)http://www.angusj.com/resourcehacker/#download 应用方法示例 【2023年更新】手把手教你去除 WinRAR 的弹窗广告_winrar广告怎么去除_areosun的博客-CSDN博客https://blog.csdn.net/haiyunzhiqiu/article/details/119176038#comment…

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——性质模态

性质&模态 角度一 角度二 矛盾关系 【对象】(1)所有、有的不;(2)所有不、有的;(3)某个、某个不。 【典例】①所有偶像都是靠颜值的。 ②有的偶像不是靠颜值的。 试分析: (1)如果①为真,试判断②的真假。 (2)如果①为假,试判断②的真假。 (3)①和②是否可…

u盘提示需要格式化如何恢复里边的数据?你可以这么做

“昨天我和往常一样往U盘传输一些重要文件&#xff0c;突然收到一个提示&#xff1a;说我需要格式化它才能使用&#xff0c;但是我里面有重要的数据&#xff0c;所以我不敢点&#xff0c;可是没法复制出里面的数据&#xff0c;有没有人告诉我&#xff0c;如何恢复里边的数据&am…

【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;首先我们要知道后序遍历数组的最后一个元素必然是根节点&#xff0c;然后根据根节点在中序遍历数组中的…

Zynq GTX全网最细讲解,aurora 8b/10b协议,OV5640板对板视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX 接收接口GTX IP核调用和使用 4、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTX aurora 8b/10b数据对…

Docker Harbor 私有镜像仓库的部署和管理

目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 四、部署配置Docker Harbor 首先需要安装 Docker-Compose 服务 部署 Harbor 服务 修改配置文件 docker配置文件添加本地仓库地址 关于 Harbor.cfg 配置文件中有两类参数&#xff1a;所需参数和可选参数 &a…

双基证券:游戏版号发放整体趋势的向好将持续优化供给端

双基证券表示&#xff0c;版号发放整体趋势的向好将继续优化供应端&#xff0c;游戏新产品周期正逐渐开启&#xff0c;各家游戏公司盈余端将逐渐企稳&#xff0c;同时将推进游戏商场规划进一步增加。长时间来看&#xff0c;AIGC等技术对游戏全工业链具有降本增效&#xff0c;提…

节日书单视频怎么制作?这个工具不要错过

节日书单视频制作是一项具有一定专业性和科普性质的任务。在制作节日书单视频时&#xff0c;我们需要注意一些方法和注意事项&#xff0c;以确保视频的质量和效果。本文将介绍一些关键的步骤和技巧&#xff0c;帮助您顺利完成节日书单视频的制作。 编辑制作节日书单视频的话&am…

Python2021年9月Python二级 -- 编程题解析

题目一: 日期转换 编写一个程序&#xff0c;实现用户输入一个日期&#xff0c;格式为"月/日/年"&#xff0c;如输入05/21/2021&#xff0c;程序输出日期为’May 21,20211至12月的英文名称如下: January,February,March,April, May, June, July&#xff0c;August, Se…

YOLO目标检测——人脸表情识别数据集下载分享

受试者在15个视点和19个照明条件下成像&#xff0c;同时显示一系列面部表情&#xff0c;资源包括PIE照明子集&#xff08;1154张人脸灰度图&#xff0c;3232&#xff09;和三个Pose05、Pose07、Pose09子集&#xff08;分别包括3332张、1629张、859张人脸灰度图&#xff0c;6464…

RTP协议简介

介绍 RTP&#xff0c;real-time transport protocol&#xff0c;实时传输协议&#xff0c;用于传输具有实时属性的数据。RTP提供端到端的网络传输功能&#xff0c;适用于通过组播或单播网络服务传输实时数据(如音频、视频或仿真数据)的应用。 RTP协议层有两个子协议&#xff…

构建稳定的爬虫系统:如何选择合适的HTTP代理服务商

在构建一个稳定、高效的爬虫系统中&#xff0c;选择合适的HTTP代理服务商是至关重要的一步。本文将介绍如何选取可靠且性能优秀的HTTP代理服务供应商&#xff0c;来完成搭建一个强大而稳定的爬虫系统。 1.了解不同类型和特点 -免费公开代理服务器:提供免费但可能存在限制或不…

C++信息学奥赛1179:奖学金

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int id[n], arr[n], brr[n], crr[n]; // 创建大小为 n 的整型数组 id, arr, brr, crrfor(int i0;i<n;i) {id[i] i1; // 初始化 id 数组为 1,2,3…

使用maven创建springboot项目

创建maven快速启动项目 命令行或者idea、eclipse快捷创建也可以 pom.xml下project项目下导入springboot 父工程 <!--导入springboot 父工程--> <parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.bo…

Linux socket网络编程实战(tcp)实现双方聊天

在上节已经系统介绍了大致的流程和相关的API&#xff0c;这节就开始写代码&#xff01; 回顾上节的流程&#xff1a; 创建一个NET文件夹 来存放网络编程相关的代码&#xff1a; tcp服务端代码初步实现--上 这部分先实现服务器的连接部分的代码并进行验证 server1.c&#xff…

服务器中locked勒索病毒的原因和影响,勒索病毒解密,数据恢复

locked勒索病毒是一种流行的计算机病毒&#xff0c;它会对感染的计算机进行加密&#xff0c;并要求用户支付一定数量的赎金才能解锁。这种病毒已经存在了几年&#xff0c;对许多计算机用户造成了严重的困扰。 locked勒索病毒通常是通过电子邮件或恶意网站传播的。电子邮件中可能…

项目详细描述

目录、 一、SOC智能游戏机&#xff08;集创赛-西南赛区三等奖&#xff09; 二、AXI2AHB Bridge 三、基于FPGA智能导盲拐杖&#xff08;FPGA竞赛全国二等奖&#xff09; 三、基于FPGA的倾角监测系统 四、图像压缩核心算法 一、SOC智能游戏机&#xff08;集创赛-西南赛区三等…