Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DIY综合交流区
[RealTouch例程]动态线程创建与删除
发布于 2012-08-13 09:19:02 浏览:16766
订阅该版
实验目的 ? 快速熟悉动态线程创建和删除的接口 ? 可以使用线程实现简单任务 硬件说明 本实验使用RT-Thread官方的Realtouch开发板作为实验平台。涉及到的硬件主要为 ? 串口3,作为rt_kprintf输出,需要连接JTAG扩展板 具体请参见《Realtouch开发板使用手册》 实验原理及程序结构 实验设计 本实验的主要设计目的是帮助读者快速了解线程相关API,包括动态线程的创建/删除相关API,为了简化起见,我们将这些API放在同一个线程中调用。请读者注意,本实验本身不具有实际的工程参考价值,只是帮助读者快速了解线程API的用法。 源程序说明 本实验对应1_1_thread_dynamic 系统依赖 在rtconfig.h中需要开启 ``` #define RT_USING_HEAP``` 此项可选,开启此项可以创建动态线程和动态信号量,如果使用静态线程和静态信号量,则此项不是必要的 ``` #define RT_USING_CONSOLE``` 此项必须,本实验使用rt_kpriintf向串口打印按键信息,因此需要开启此项 ``` #define RT_TICK_PER_SECOND 100``` 此项定义了1秒= RTTICKPERSECOND个tick = 100 tick,一个tick为10ms 主程序说明 在applications/application.c中的thread_dynamic_init()函数中定义了两个线程tid1、tid2, /* 指向线程控制块的指针 */ ```rt_thread_t tid1,tid2;``` 两个线程的创建过程如下 ```tid1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 6, 10); if (tid1 != RT_NULL) rt_thread_startup(tid1); tid2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 6, 10); if (tid2 != RT_NULL) rt_thread_startup(tid2);``` 下面的代码是两个线程的入口程序,在入口程序中thread2将会去删除thread1,也就是调用了线程删除的API /*线程1运行一直在打印计数,由于线程1和2优先级相同均为THREAD_PRIORITY,所以将会采用时间片轮转的方式轮换执行*/ ```static void thread1_entry(void* parameter) { rt_uint32_t count = 0; rt_kprintf("thread1 dynamicly created ok "); while(1) { rt_kprintf("thread1 count: %d ",count++); rt_thread_delay(RT_TICK_PER_SECOND); } } ```在线程1时间片用尽后得到执行,在打印完成后线程2 delay,于是回到线程1执行,在delay结束后回到线程2执行,线程2将删除线程1,并且在执行结束后也将自行删除 ```static void thread2_entry(void* parameter) { rt_kprintf("thread2 dynamicly created ok "); rt_thread_delay(RT_TICK_PER_SECOND * 4); rt_thread_delete(tid1); rt_kprintf("thread1 deleted ok "); } ``` 编译调试及观察输出信息 编译请参见《RT-Thread配置开发环境指南》完成编译烧录,参考《Realtouch开发板使用手册》完成硬件连接,连接扩展板上的串口和jlink。 运行后可以看到如下信息: ``` | / - RT - Thread Operating System / | 1.1.0 build Aug 10 2012 2006 - 2012 Copyright by rt-thread team thread1 dynamicly created ok thread1 count: 0 thread2 dynamicly created ok thread1 count: 1 thread1 count: 2 thread1 count: 3 thread1 count: 4 thread1 deleted ok``` 结果分析 从打印信息可以看到首先看到thread1和thread2先后建立成功,然后thread2 ```rt_thread_delay(RT_TICK_PER_SECOND * 4);``` 系统调度到thread1执行可以看到继续执行计数,因为thread1的延时为1个tick,所以可以看到它打印了四次计数,当它第四次延时时,thread2的延时也到了,系统调度到thread2继续运行,它调用了 ```rt_thread_delete(tid1);``` 将thread1删除,删除成功后打印信息 thread1 deleted ok 此时可以看到thread1也不再出现计数信息,可以确定thread1被成功删除了。 [attach]0[/attach] 程序见下楼。 下载附件 [实验1_1动态线程的创建与删除.pdf](https://oss-club.rt-thread.org/uploads/88_3a4d6f256bdd4866a1c56bbfd8c03cde.pdf) 下载附件 [1_kernel_thread_dynamic.zip](https://oss-club.rt-thread.org/uploads/3089_2800017b3e2b608b9a59f811effdddd0.zip)
查看更多
15
个回答
默认排序
按发布时间排序
lindabell
2012-08-13
这家伙很懒,什么也没写!
哇,例程已经开始更新了 看来我得赶快把手头的事情清一清啊,要不就跟不上了 [s:175] [s:175]
shaolin
2012-08-14
这家伙很懒,什么也没写!
更新了例程代码。
wizardxbl
2012-09-05
这家伙很懒,什么也没写!
额,文件注释中文不知道什么编码格式的,我用emacs打开都是乱码。 然后,我下载的附件内容和动态线程没什么关系阿……是timeout的?
bloom5
2012-09-05
这家伙很懒,什么也没写!
[attach]1277[/attach] 例程修改
shaolin
2012-09-05
这家伙很懒,什么也没写!
>[attach]0[/attach] >例程修改 --- 程序跟文档没有对应上,需要使用 楼上这份程序。谢谢反馈。
咖啡恋
2012-09-05
这家伙很懒,什么也没写!
小白来请教问题:在该例程的动态创建的线程中,如果tid1不是由while(1)控制循环执行的程序,而改为另一个能自动结束的线程时,并且不在tid2中删除tid1,等tid1程序执行完,也会自动删除tid1线程并且释放内存? 还有,动态创建的线程,会在什么情况下去删除该线程?
bernard
2012-09-05
这家伙很懒,什么也没写!
说得有些绕,可否说得清晰些? 例如tid1、tid2。你预计达到的效果是?
shaolin
2012-09-05
这家伙很懒,什么也没写!
如果 tid 能够自动结束,那么它执行完毕后,会被自动删除并释放内存。 动态创建的线程,只要它执行结束,就会被设置为结束状态,当 IDLE 线程运行时,会将它删除,并释放相应内存。
咖啡恋
2012-09-05
这家伙很懒,什么也没写!
抛开例程程序,如果我创建了两个线程thread1和thread2,在什么情况下要去考虑删除线程而什么情况不用删除线程呢?假设内存是有限的
bernard
2012-09-05
这家伙很懒,什么也没写!
>抛开例程程序,如果我创建了两个线程thread1和thread2,在什么情况下要去考虑删除线程而什么情况不用删除线程呢?假设内存是有限的 --- 如果线程不是持续运行的,而仅在一段时间内运行,这时候建议采用动态线程。当线程运行结束资源自动释放。 尽量不要做线程删除,如果需要确实需要,那么建议设置线程的cleanup回调函数(在线程对象的结构体中有),它会在线程被删除前回调以进行一些用户定义的资源释放动作、清除工作。当线程不再使用时可以删除线程,或让线程自动退出。
撰写答案
登录
注册新账号
关注者
0
被浏览
16.8k
关于作者
shaolin
这家伙很懒,什么也没写!
提问
115
回答
444
被采纳
0
关注TA
发私信
相关问题
1
[项目]搞个开源的硬件项目
2
硬件计划贴,及时更新,欢迎提意见
3
软件计划贴,及时更新,欢迎提意见::WMA,MOUNT,LWIP等问题急需解决.
4
MMS协议
5
定点的wma解压库-libwma
6
QQ群记录 [20090821]
7
STM32网络收音机PCB报名征集
8
第一版调试记录
9
第二版硬件讨论
10
RADIO项目相关模块规格--欢迎大家自己做板时规格与此兼容,减少重复劳动
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部