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.mrgr.cn/news/45054.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!