RTT简介及其简单应用

article/2025/8/27 2:30:08

一、 裸机系统和多任务系统
裸机系统通常分为轮询系统和前后台系统。
轮询系统不难理解就是按照顺序从上往下反复来执行,伪代码如下:

int main()
{Init();while(1){/*事件1*/event1();/*事件2*/event2();/*事件3*/event3();}
}

前后台系统就是在轮询系统的基础上多个一个中断,伪代码为:

int main(void)
{Init();while(1){/*事件1*/event1();/*事件2*/event2();/事件3*/event3();}
}void interrupt(void)
{dosoemthing();
}

多任务系统则是一个个单独的任务之间相互协调,且这些任务都是无限循环且不返回的,伪代码为:

int main(void)
{Init();RTOS_Init();RTOS_Start();
}void thread1_entry(void *arg)
{while(1){event1();}
}void thread2_entry(void *arg)
{while(1){event2();}
}

二、RTT操作系统
RTT就是一个多任务抢占式操作系统,和裸机系统相比,RTT的优势在于当工程庞大时,我们可以将其分解成一个个小任务,这些任务都有优先级,操作系统的调度机制来决定任务的运行顺序,不用担心每个模块之间的相互干扰,同时,抢占的机制可以迅速的来处理紧急任务。

三,RTT相关函数

rt_thread_t rt_thread_create(const char *name,void (*entry)(void *parameter),void       *parameter,rt_uint32_t stack_size,rt_uint8_t  priority,rt_uint32_t tick)

函数功能:创建一个线程
参数讲解:
const char *name:线程名称
void (*entry)(void *parameter):线程入口
void *parameter:线程参数
rt_uint32_t stack_size:线程栈大小
rt_uint8_t priority:线程优先级
rt_uint32_t tick:时间片
函数返回值:该线程的句柄

rt_err_t rt_thread_startup(rt_thread_t thread)

函数功能:启动线程
参数讲解:
rt_thread_t thread:线程的句柄

信号量机制:
信号量是一种实现线程间通信的机制,实现线程之间同步或临界资源的互斥访问, 常用于协助一组相互竞争的线程来访问临界资源。在多线程系统中,各线程之间需要同步或互斥实现临界资源的保护。

rt_sem_t rt_sem_create(const char *name, rt_uint32_t value, rt_uint8_t flag);

函数功能:创建一个信号量
参数讲解:
const char *name:信号量的名字
rt_uint32_t value:持有信号量的个数
rt_uint8_t flag:RT_IPC_FLAG_FIFO(按先后顺序), RT_IPC_FLAG_PRIO(按优先级)。
函数返回值:信号量句柄

rt_err_t rt_sem_release(rt_sem_t sem)

函数功能:释放一个信号量

rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time)

函数功能:获取一个信号量
说明:如果欲获取的信号量为0,则调用该函数的线程会被挂起,挂起的时间由第二个参数设置

四、小demo
生产者、消费者模型:生产者不停的生产数据,但是当队列满了,就停止生产,消费者不停消费数据,当队列空了停止消费。
在这里插入图片描述

#include "board.h"
#include "rtthread.h"rt_thread_t producer_thread = RT_NULL;
rt_thread_t consumer_thread = RT_NULL;rt_sem_t notfull_sem = RT_NULL;
rt_sem_t notempty_sem = RT_NULL;#define BUF_SIZE		5
typedef struct
{uint32_t buf[BUF_SIZE];uint32_t write_p;uint32_t read_p;
}data;data data_t;void producer_thread_entry(void *arg);
void consumer_thread_entry(void *arg);int main(void)
{	notfull_sem = rt_sem_create("notfull_sem", 0, RT_IPC_FLAG_FIFO);notempty_sem = rt_sem_create("notempty_sem", 0, RT_IPC_FLAG_FIFO);producer_thread = rt_thread_create("producer_thread",producer_thread_entry,RT_NULL,512,0,20);consumer_thread = rt_thread_create("consumer_thread",consumer_thread_entry,RT_NULL,512,1,20);rt_thread_startup(producer_thread);rt_thread_startup(consumer_thread);}void producer_thread_entry(void *arg)
{static uint32_t cnt=0;while(1){		if(data_t.write_p - data_t.read_p < BUF_SIZE - 1){				data_t.buf[data_t.write_p % BUF_SIZE] = cnt++;rt_kprintf("生产一个数据: %d\n",data_t.buf[data_t.write_p % BUF_SIZE]);data_t.write_p++;rt_sem_release(notempty_sem);rt_thread_delay(200);}else{rt_kprintf("生产缓冲区已满\n");rt_sem_take(notfull_sem,RT_WAITING_FOREVER);rt_thread_delay(200);}		}
}void consumer_thread_entry(void *arg)
{while(1){if(data_t.read_p != data_t.write_p){			rt_kprintf("消费一个数据: %d\n",data_t.buf[data_t.read_p% BUF_SIZE]);data_t.read_p++;			rt_sem_release(notfull_sem);rt_thread_delay(400);}else{rt_sem_take(notempty_sem,RT_WAITING_FOREVER);rt_kprintf("消费缓冲区已空\n");}}
}

在这里插入图片描述可以看到生产者的生产速度大于消费者,出现了缓冲区已满的现象,生产者则停止生产,等待消费者消费一个数据后继续生产


http://chatgpt.dhexx.cn/article/WFksIIcM.shtml

相关文章

TCP中RTT时延的理解

最近服务器环境部署了tcprtt网络时延监控&#xff0c;发现不同服务器不同节点之间的RTT时延表象非常奇怪&#xff0c;无法准确的判断服务器的网络情况。因此需要弄清楚什么是RTT&#xff0c;以及能否作为服务器网络性能的检测指标。 1、RTT是什么&#xff1f; TCP中的RTT指的是…

FreeRTOS记录(四、FreeRTOS任务堆栈溢出问题和临界区)

本来计划是消息队列、信号量、任务通知、事件集、邮件的文章 但是因为自己调试的时候遇到了一个问题&#xff0c;还是把堆栈溢出问题放到前面来说 ..增加临界区的使用说明 2021/11/7 ..临界区的使用部分增加任务挂起与临界区说明 2021/11/26目录 任务…

1-FreeRTOS入门指南

本专栏是根据官方提供的文档进行FreeRTOS的各个功能函数的说明&#xff0c;以及函数的使用 本专栏不涉及动手操作&#xff0c;只是对原理进行说明&#xff0c;FreeRTOS基础知识篇更新完成会对如何在开发板上进行上手实战操作。 这里不会对比其他RTOS的优缺点&#xff0c;因为每…

freeRTOS调度

freeRTOS调度策略 背景 嵌入式的设备开发通常有两种模式&#xff1a;裸机开发和OS开发。像功能较为强大的SOC通常都会先一直linux或其他OS然后进行业务逻辑的开发&#xff1b;而单片机则有很多简单的应用场景直接使用裸机开发的模式&#xff0c;稍微复杂些的场景&#xff0c;会…

FreeRTOS 解析

目录 Task Task State Task Priority Idle Task Run Time Statistics Task Scheduling Single-core 单核处理器 AMP 非对称多核处理器 SMP 对称多核处理器 Context Switch Inter-task Communication and Synchronization Queue 队列 Binary Semaphore 二值信号量 …

FreeRTOS队列

在实际的应用中&#xff0c;常常会遇到一个任务或者中断服务需要和另外一个任务进行“沟通交流”&#xff0c;这个“沟通交流”的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式&#xff0c;但是如果在使用操作系统的应用中…

FreeRTOS任务状态

1. 任务状态介绍 FreeRTOS中的任务状态&#xff0c;可以简单的分为运行态&#xff08;running&#xff09;和非运行态&#xff08;not running&#xff09;。 但是对于非运行态我们还可以继续细分&#xff1a; 阻塞状态&#xff08;Blocked&#xff09;暂停&#xff08;挂起…

FreeRTOS延时

1、相对延时函数 将当前任务添加到阻塞列表pxDelayedTaskList&#xff0c;任务进入阻塞态。 vTaskDelay → prvAddCurrentTaskToDelayedList → vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) )。任务的阻塞时间更新到状态列表项xStateListItem x…

FreeRTOS多任务管理

文章目录 1、任务1.1 任务简介1.2 任务调度1.3 任务的状态 (就绪态 / 运行态 / 阻塞态 / 挂起态)1.4 空闲任务 2、动态创建两个任务2.1 定义动态内存空间的堆2.2 定义任务函数2.3 定义 任务控制块 指针2.4 动态创建任务 xTaskCreate()2.5 启动任务 vTaskStartScheduler() 3、常…

FreeRTOS 移植

源码 FreeRTOS源码 选择 FreeRTOS 的最新版本 V9.0.0&#xff08;2016 年&#xff09;比较稳定 1&#xff09;解压后的文件 提取的文件&#xff0c; FreeRTOS—>Source->portable目录下的MemMang&#xff0c;RVDS MemMang 存放内存相关的源文件,heap_1.c,heap_2.c,he…

初识FreeRTos

初识FreeRTos Preface一、FreeRTos简介二、 为什么选择FreeRTos三、FreeRTos资料和源码的下载四、介绍我自己的开发环境4.1FreeRTos4.2AlienTek Summary Preface 距离我上一次写博客已经差不多有5个月了&#xff0c;最近想给自己挖个新坑&#xff0c;讲一讲关于FreeRTos 相关的…

FreeRTOS移植

1. 前言 本文是基于FreeRTOSv9.0.0版本的实时系统&#xff0c;移植到STM32F103芯片平台上。移植环境使用的是MDK5.32版本&#xff0c;我在移植之前就已经构建好了一个裸机工程源码了&#xff0c;而且已经确保了这份裸机代码是没有问题的。开始移植之前我强烈建议一定要确认自己…

FreeRTOS快速入门-初探FreeRTOS

首发&#xff0c;公众号【一起学嵌入式】 对于 RTOS 入门系列文章&#xff0c;已经更新完一款&#xff08;RT-Thread&#xff09;&#xff1a; 助你快速入门 RT-Thread 这个系列的文章结合 RT-Thread&#xff0c;介绍过 RTOS 相关的核心知识。 接下来&#xff0c;开始另外一…

FreeRTOS系列|FreeRTOS简介

1. RTOS简介 RTOS全称为 Real Time Operation System&#xff0c;即实时操作系统。RTOS强调的是实时性&#xff0c;又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作&#xff0c;不允许超时&#xff1b;而软实时里对处理过程超时的要求则没有很严格。RTOS的核心就…

freertos任务基础知识(freertos篇)

多任务 对于单任务系统就是常说裸机大while循环&#xff0c;有的时候也需要加一些中断服务函数完成一些处理&#xff0c;相比于多任务而言上面的单任务系统也叫做前后台系统&#xff0c;即&#xff08;中断服务函数叫前台程序&#xff0c;大while叫后台程序&#xff09; 前后台…

FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架

目录 一、为什么要学习FreeRTOS 二、前言------从0到1认识FreeRTOS 1、逻辑系统与多任务系统 1.1、裸机系统&#xff1a;裸机系统通常分成轮询系统和前后台系统 1.2、多任务系统 2、数据结构-列表与列表项 三、任务 3.1基本属性 3.1.1任务栈 3.1.2任务控制块 3.1.3任…

一、初识FreeRTOS之FreeRTOS简介

目录 一、什么是FreeRTOS&#xff1f; 二、为什么选择FreeRTOS&#xff1f; 三、FreeRTOS的特点 四、FreeRTOS资料与源码下载 五、FreeRTOS源码文件介绍 一、什么是FreeRTOS&#xff1f; Free即免费的&#xff0c;RTOS的全称是Real time operating system,中文就是实时操作…

Docker技术入门与实战-第3版.pdf OCR 高清 可复制

Docker技术入门与实战-第3版.pdf OCR 高清 可复制 Docker技术入门与实战-第3版.pdf OCR 高清 可复制简介预览下载地址 Docker技术入门与实战-第3版.pdf OCR 高清 可复制 简介 本书从Docker基本原理开始&#xff0c;深入浅出地讲解Docker的构建与操作&#xff0c;内容系统全面…

从docker到kubernetes(k8s)入门与实战--docker教程

安装docker 装个依赖 yum -y install gcc gcc-c 卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 安装依…

Docker 入门到实战教程(二)安装Docker

一.卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…