当前位置: 首页 > article >正文

RT-Thread实时操作系统 动态线程的创立

文章目录

    • 概要
    • 整体架构流程
    • 代码实现

概要

首先我们要知道RT_thread是什么,我们学习它到底要用它干什么

RT-Thread,全称为Real Time-Thread,是一款嵌入式实时多线程操作系统。它支持多任务处理,允许多个任务同时运行,但并不意味着处理器在同一时刻真正执行多个任务。RT-Thread不仅是一个实时操作系统内核,还包含文件系统、网络框架、设备框架等较为完整的中间件组件,具备低功耗、安全和通信协议等特点

我们可以通俗的理解为,我们以前用的单片机只有一个脑子,但有了rt_thread后,我们的单片机就有了两个脑子,可以同时处理多个任务。

整体架构流程

所用软件 RT-Thread studio  Moba Xterm (没有的私信我要软件包)

所用硬件 stm32zet6

代码实现

如下就是全部代码 


rt_thread_t th1_ptr;     //定义了一个句柄来接受后面函数的返回值

void th1_printf(void* parameter)    //创建的多线程函数
{
    while(1)
    {
 rt_kprintf("th1 is running!\r\n");
 rt_thread_mdelay(1000);
    }
}


int main(void)
{                                 //主线程
    int count = 1;


    th1_ptr =rt_thread_create("th1",th1_printf,NULL,1024,20,10);    //创建线程
    if(th1_ptr==RT_NULL)    //判断线程是否创建成功
    {
        LOG_E("th1_printf  rt_thread_create  failed!\r\n");
        return -RT_ENOMEM;   //若线程创建失败,则返回一个负数
    }

    rt_thread_startup(th1_ptr);  //线程创建成功后开始多线程的函数

    while (count++)
    {
        LOG_D("Hello RT-Thread!");
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

实验现象

在串口调试工具中,我们可以看到单片机除了主函数int main 之中的while(1)之外,
void th1_printf(void* parameter)也一直在给我们的电脑通过串口发送数据,这与我们以往的认知时不同的,在以前使用裸机的时候 我们知道只有 int main里面while(1)中的代码可以一直循环,但在上面这个程序中,我们除了int main中的while(1)还有一个
void th1_printf(void* parameter)中的程序也在一直运行,而引起这个现象的就是我们的多线程,我们借助实时操作系统RT-thread,来完成了多线程的操作。

如下 这个函数就是我们创建的线程函数,我们可以理解为这个函数就是一个除了主函数之外的 int main,有了rt-thread之后我们可以理解为 我们就有了多个int main

在这个函数中我们实现了打印的功能,那么现在问题就来了,我们进行了什么操作可以使下面这个函数,成为除主函数之外的多线程函数。

void th1_printf(void* parameter)    //创建的多线程函数
{
    while(1)                        //注:我们多线程实现的代码必须运行在while(1)中,必须把代码放在while(1)中
    {
 rt_kprintf("th1 is running!\r\n");
 rt_thread_mdelay(1000);
    }
}

如下这段代码就是我们实现多线程的创建的代码,首先创建了一个句柄 th1_ptr来接受函数的返回值,rt_thread_create("th1",th1_printf,NULL,1024,20,10); 这个函数就是我们用来创建多线程的一个函数,此函数有四个值,第一个值是我们所创建的 线程的名字(注:线程的名字,和线程函数的名字不是一个东西,线程是我们自己为了区分不同线程而创建的,而线程函数是实实在在存在的可以进入的),第二个参数就是我们的多线程函数接口 这个函数是我们实际创建的函数接口就是上面这个函数,第三个参数是我们需要向这个多线程函数传入的参数,第四个参数是我们这个多线程函数的所占内存空间 我们一般默认为1024,第五个参数是我们这个多线程函数的优先级 优先级总共有32个,第六个参数是我们的时间片 我们设置为10ms,我们给这个多线程的函数分配10ms的运行时间,也就是每10ms进入一次。

补充:时间片 时间片(timeslice)是分时操作系统中分配给每个正在运行的进程的一段CPU时间。

最后一个函数就是我们线程的启动函数,负责启动多线程


    th1_ptr =rt_thread_create("th1",th1_printf,NULL,1024,20,10);
    if(th1_ptr==RT_NULL)     //判断线程是否创建成功
    {
        LOG_E("th1_printf  rt_thread_create  failed!\r\n");
        return -RT_ENOMEM;   //若创建失败就返回负数
    }

    rt_thread_startup(th1_ptr);


http://www.kler.cn/news/336957.html

相关文章:

  • Ollama 运行视觉语言模型LLaVA
  • 指针(7)
  • Tomcat 项目配置指南
  • 【初阶数据结构】冒泡排序和选择排序(用C语言实现,主要讲思维)
  • 等保测评中的关键技术应用:防火墙与入侵检测系统
  • 【LeetCode】每日一题 2024_10_7 最低加油次数(堆、贪心)
  • Linux驱动开发(速记版)--输入子系统
  • 第 33 章 Ajax
  • 掌握RocketMQ——基本概念和系统架构
  • 复现文章:R语言复现文章画图
  • 【C++ 真题】B2037 奇偶数判断
  • GRASP七大基本原则+纯虚构防变异
  • QT调用libusb库stm32407上下位机
  • 数据库中,如何查询表中的所有记录?
  • RabbitMQ篇(死信交换机)
  • CSS滚动条
  • Python 工具库每日推荐【PyPDF2】
  • macOS终端配置自动补全功能
  • Linux运维01:VMware创建虚拟机
  • Docker 实践与应用举例