-
静态线程的初始化及脱离
实验目的
快速熟悉静态线程相关接口
可以使用线程实现简单任务
硬件说明
本实验使用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\n", 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延时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函数就会将这段申请的内存空间重新释放到内存堆中(如果线程执行完毕,退出时,系统也会自动回收线程控制块和堆栈空间)
-
原帖由 flyword 于 2012-8-10 17:01 发表 [url=https://bbs.eeworld.com.cn/redirect.php?goto=findpost&pid=1359278&ptid=321791][/url]
ART 可以预定吗?
ART应该是这个月月底,到时也会做一些活动。
-
RT-Thread bsp中就有506的移植,你为啥会去用500的?bsp里506的移植都已经有企业在使用了
-
液晶是7寸的,800x480的分辨率,运行新版的RT-Thread/GUI。现在已经可以付款订购了
-
你是使用SPI接EN28J60吧,这部分代码你可以联系我们获得的,包括SPI bus驱动的代码,enc28j60驱动的代码,已经移植好的RT-Thread + LwIP代码。
RT-Thread针对富士通芯片的网址在这里:
http://www.rt-thread.org/fm3
在上面也有针对MB9BF618的例程下载,如果需要MB9BF506的例程,可以联系我们
-
开源的,软硬件都开源的,东西都在github上
-
这些你可以参考NXP提供的例程。
-
现在都没有了,可以关注我们的其他硬件,例如ART或RealTouch
-
精美外壳照
-
然后是RealTouch裸板电路板正面和反面
-
这类小模块其实使用得还挺多的,后续考虑继续完善下去,包括上位机软件、web server配置等
-
你把usb host过来的u盘模拟成一个块设备,然后由DFS去装载它即可。
-
原帖由 soso 于 2012-4-20 09:11 发表
很精美 呵呵 :)
呵呵,精美很谈不上。只是在一步步的做,我们对M4还是寄予了很高的希望,也希望能够把更多的新技术应用在上面。如果可能,后续也可以在这边做做活动。
-
原帖由 rwogn 于 2012-4-19 14:50 发表
这个是开发板,还是电路板啊
带外壳的开发板,有些接口是直接露出来的
-
这个是给许继集团培训用的讲义,我找找是否有这段相关的视频,有的话也放出来。:)
-
原帖由 bluehacker 于 2012-3-24 23:19 发表
这个realtouch用的什么片子?stm32吗
呵呵,那天是您在QQ上和我聊关于邮箱的事情吧。这个目前是STM32F4,当然不排除以后使用其他的M4芯片。M4上我们感觉优势会更大一些,特别当使用了应用模块以后,大家就可以像一般写PC代码一样来些自己的程序了,有自己独立的main函数,函数、全局变量都是自己私有,不用担心与其他的程序冲突。
M3/M4上应用模块的特性我们会先在ART是应用。
-
仔细检查了代码,发现不是mp->block_size的问题,因为mp->block_size只会赋值一次后就不再使用。所以每次依然是按照block_size进行分配,但是当block_size不对齐时,会触发memory fault方面的错误。为了避免这个问题,svn 内核中已经对它进行修复了。谢谢你的反馈。
-
:congratulate: 谢谢soso,动作迅速啊
-
是的,就是这样的。不多load一次就得不到相应的值。
-
ucos你可以把它想象成一个裸核,如果真的要完成一个多功能的产品,那么需要自己花很多的功夫(移植一些代码、自行编写些代码),或者购买ucos的商业组件。
而RT-Thread,你可以认为它是MCU这个领域的Linux。因为它不仅仅是一个实时核心,也是一个功能丰富的软件平台。甚至能够支持完整的POSIX环境,运行独立的应用程序,这些也是传统RTOS不容易具备的。