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

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);

原文地址:https://blog.csdn.net/2301_79779075/article/details/142749531
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mrgr.cn/news/45054.html

相关文章:

  • 【数学二】一元函数微分学-微分的计算
  • 销冠的至高艺术:让自己不像销售
  • 个人点餐导出—未来之窗行业应用跨平台架构
  • 如何让客户主动成为你的品牌大使
  • @KafkaListener的作用
  • 开放式耳机是什么意思?分享几款适合各类运动佩戴的蓝牙耳机
  • leetcode-哈希篇1
  • 第一讲:Go语言开发入门:环境搭建与基础语法
  • Raft 常见问题解答
  • 多元化网络团队应对复杂威胁
  • Python笔记之识别到当前python脚本所在的目录,而不是执行python命令的目录
  • 【ShuQiHere】 重新定义搜索:本体搜索引擎的时代
  • City Builder Urban 城市都市街道建筑场景模型
  • Golang | Leetcode Golang题解之第462题最小操作次数使数组元素相等II
  • Python | Leetcode Python题解之第463题岛屿的周长
  • Sharding 分页原理分析
  • 拆一个烙铁的射频电源
  • ctf.bugku - 本地管理员
  • 30 树 · 二叉树
  • 动态规划算法专题(四):子串、子数组系列