Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DIY综合交流区
[RealTouch例程]静态线程的初始化及脱离
发布于 2012-08-13 20:21:44 浏览:7336
订阅该版
实验目的 ? 快速熟悉静态线程相关接口 ? 可以使用线程实现简单任务 硬件说明 本实验使用RT-Thread官方的Realtouch开发板作为实验平台。涉及到的硬件主要为 ? 串口3,作为rt_kprintf输出,需要连接JTAG扩展板 具体请参见《Realtouch开发板使用手册》 实验原理及程序结构 实验设计 本实验的主要设计目的是帮助读者快速了解线程相关API,包括静态线程的创建/删除、相关API,为了简化起见,我们将这些API放在同一个线程中调用。请读者注意,本实验本身不具有实际的工程参考价值,只是帮助读者快速了解线程API的用法。 源程序说明 本实验对应1_kernel_thread_static 系统依赖 在rtconfig.h中需要开启 ? #define RT_USING_CONSOLE 此项必须,本实验使用rt_kpriintf向串口打印按键信息,因此需要开启此项 主程序说明 在applications/application.c中定义了两个线程数据结构以及相应栈 ```static struct rt_thread thread1; static rt_uint8_t thread1_stack[512]; static struct rt_thread thread2; static rt_uint8_t thread2_stack[512]; ```application.c中的thread_detach_init()函数中初始化了两个静态线程t1、t2,静态线程的初始化对应于动态线程的创建(create)有一点不同,由于静态线程的栈是用户提供建立的,在编译时分配,内核不会再进行动态分配空间,所以比动态线程多两个参数:线程数据结构以及线程栈的开始地址 ```result = rt_thread_init(&thread1, "t1", /* 线程名:t1 */ thread1_entry, RT_NULL, /* 线程的入口是thread1_entry,入口参数是RT_NULL*/ &thread1_stack[0], sizeof(thread1_stack), /* 线程栈是thread1_stack */ 6, 10); if (result == RT_EOK) /* 如果返回正确,启动线程1 */ rt_thread_startup(&thread1); result = rt_thread_init(&thread2, "t2", /* 线程名:t2 */ thread2_entry, RT_NULL, /* 线程的入口是thread2_entry,入口参数是RT_NULL*/ &thread2_stack[0], sizeof(thread2_stack), /* 线程栈是thread2_stack */ 5, 10); if (result == RT_EOK) /* 如果返回正确,启动线程2 */ rt_thread_startup(&thread2); ```下面的代码是两个线程的入口程序,在thread2的入口程序中将会去脱离thread1,也就是从就绪线程队列中删除thread1 ```static void thread1_entry(void* parameter) { rt_uint32_t count = 0; while (1) { rt_kprintf("thread count: %d ", count ++); rt_thread_delay(RT_TICK_PER_SECOND); } } static void thread2_entry(void* parameter) { rt_thread_delay(RT_TICK_PER_SECOND*10); /* * 线程2唤醒后直接执行线程1脱离,线程1将从就绪线程队列中删除 */ rt_thread_detach(&thread1); rt_thread_delay(10); } ```编译调试及观察输出信息 编译请参见《RT-Thread配置开发环境指南》完成编译烧录,参考《Realtouch开发板使用手册》完成硬件连接,连接扩展板上的串口和jlink。 运行后可以看到如下信息: | / - RT - Thread Operating System / | 1.1.0 build Aug 10 2012 2006 - 2012 Copyright by rt-thread team thread count: 0 thread count: 1 thread count: 2 thread count: 3 thread count: 4 thread count: 5 thread count: 6 thread count: 7 thread count: 8 thread count: 9 结果分析 因为thread2拥有更高的优先级,所以在初始化两个线程成功后thread2首先得到执行,得到执行后thread2延时RT_TICK_PER_SECOND*10个系统tick, ```rt_thread_delay(RT_TICK_PER_SECOND*10);``` 此时系统调度到thread1执行,thread1执行计数打印,可以看到10次计数打印。当thread2的延时到达时,它将重新获得执行权。Thread2调用rt_thread_detach()函数将thread1脱离线程就绪队列, ```rt_thread_detach(&thread1);``` 从而线程1不会再被调度执行。 总结 什么是动态线程?什么是静态线程?两者有什么区别? RT-Thread中支持静态和动态两种定义方式。用线程来举例的话,rt_thread_init对应静态定义方式, rt_thread_create 对应动态定义方式。 使用静态定义方式时,必须先定义静态的线程控制块,并且定义好堆栈空间,然后调用rt_thread_init来完成线程的初始化工作。采用这种方式,线程控制块和堆栈占用的内存会放在RW段,这段内存空间在编译时就已经确定,它不是可以动态分配的,所以不能被释放,而只能使用 rt_thread_detach 函数将该线程控制块从对象管理器中脱离。 使用动态定义方式 rt_thread_create 时, RT-Thread 会动态申请线程控制块和堆栈空间。当不需要使用该线程时,调用rt_thread_delete函数就会将这段申请的内存空间重新释放到内存堆中(如果线程执行完毕,退出时,系统也会自动回收线程控制块和堆栈空间) ![RealTouch_blink.zip](/uploads/88_14606a0479d7d7bd1545c425021c65db.zip) ![1_kernel_thread_static.zip](/uploads/88_062860a1dcbd058df08de5192f18d2a4.zip) 下载附件 [实验1_2静态线程的初始化及脱离.pdf](https://oss-club.rt-thread.org/uploads/88_8c2e74a26f1ddfedb77b1baca77db7e4.pdf)
查看更多
8
个回答
默认排序
按发布时间排序
idealpursuer
2012-08-13
这家伙很懒,什么也没写!
我想问下这用的是那个版本的RT-Thread
aozima
2012-08-13
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>我想问下这用的是那个版本的RT-Thread --- 基本例程不限定RT-Thread的版本,不过建议统一使用SVN版本。
shaolin
2012-08-13
这家伙很懒,什么也没写!
为方便使用,稍后每份例程会配相应代码,传上来;
shaolin
2012-08-24
这家伙很懒,什么也没写!
加入例程代码。
lgnq
2012-08-30
这家伙很懒,什么也没写!
发现一处错误,以下代码是延时10秒,而不是延时10个tick ``` rt_thread_delay(RT_TICK_PER_SECOND*10); ```
shaolin
2012-08-30
这家伙很懒,什么也没写!
>发现一处错误,以下代码是延时10秒,而不是延时10个tick > > >``` >rt_thread_delay(RT_TICK_PER_SECOND*10); >``` --- 确实是这样,谢谢 lgnq 指出。
bernard
2012-08-30
这家伙很懒,什么也没写!
关于延时部分,建议不要写绝对值,而是写与RT_TICK_PER_SECOND相关的相对值,这样在更换RT_TICK_PER_SECOND的配置后,具体的数值可以保持不变。
撰写答案
登录
注册新账号
关注者
0
被浏览
7.3k
关于作者
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
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
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
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
5
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部