TA的每日心情 | 开心 2018-11-19 09:39 |
---|
签到天数: 2 天 连续签到: 1 天 [LV.1]初来乍到
|
楼主 |
发表于 2016-5-9 20:50:59
|
显示全部楼层
THREAD_EXAMPLE2
比起THREAD_EXAMPLE1,THREAD_EXAMPLE2的注释就详细了许多。从注释上看,我们上一楼做的整体结构的分析是正确的。让我们再重新看下这8个结构:
1. 包含头文件
2. 预编译开关
3. 三个参数 设定栈长宽字节、优先级字节、时间片字节的长度
4. 定义线程
5. 定义线程栈
6. 定义线程入口函数 线程的主要功能在这里实现
7. 定义应用入口函数 系统调用此应用,从而对线程进行处理
8. 定义main函数
逐个比上个例子比较,可以看到,在第三项参数多了一倍,也就是说多了一组的线程参数,这个例子中使用了多个线程,这一点在第4项中可以看到。
在第4项中,我们可以看到定义了3个线程,分别是led点亮线程,led熄灭线程,与led控制线程。
接下来是第5项,分别对三个线程的入口函数进行了声明。当然这里也是这个例子演示的重点的地方。仔细看这三个线程会发现,led点亮线程和led熄灭线程的入口函数都只是一个功能,以替换上一例子的亮灯命令和灭灯命令。而led控制线程则替代了上一例子的LED线程。让我们看一看两个函数的具体差异。
上一例中,led入口函数实现实现3个led的依次亮灭,是用延时+对应指示灯亮/灭实现的,与无系统的程序的循环一样。在本例中,led控制线程的入口函数里已经看到了对线程的操作,
/* 激活Led设备点亮线程 */ //这里对亮灯线程进行激活,对应现象可以看到led点亮
state = TclActivateThread(&ThreadLedOn, &error);
TCLM_ASSERT((state == eSuccess), "");
TCLM_ASSERT((error == TCLE_THREAD_NONE), "");
/* 控制线程延时1秒 */ //这里把led控制线程延时1s,但在这个时间里led控制线程失去作用?待测试
state = TclDelayThread(&ThreadCTRL, TCLM_SEC2TICKS(1), &error);
TCLM_ASSERT((state == eSuccess), "");
TCLM_ASSERT((error == TCLE_THREAD_NONE), "");
/* 休眠Led设备点亮线程 */ //这里休眠了led点亮线程,从现象上看,这里不会有任何变化
state = TclDeactivateThread(&ThreadLedOn, &error);
TCLM_ASSERT((state == eSuccess), "");
TCLM_ASSERT((error == TCLE_THREAD_NONE), "");
/* 激活Led设备熄灭线程 */ //这里激活了led熄灭线程,从现象上看,led就熄灭了
state = TclActivateThread(&ThreadLedOff, &error);
TCLM_ASSERT((state == eSuccess), "");
TCLM_ASSERT((error == TCLE_THREAD_NONE), "");
/* 控制线程延时1秒 */ //这里把led控制线程延时1s,但在这个时间里led控制线程失去作用?待测试
state = TclDelayThread(&ThreadCTRL, TCLM_SEC2TICKS(1), &error);
TCLM_ASSERT((state == eSuccess), "");
TCLM_ASSERT((error == TCLE_THREAD_NONE), "");
/* 休眠Led设备熄灭线程 */ //这里休眠了led熄灭线程,从现象上看没有变化
state = TclDeactivateThread(&ThreadLedOff, &error);
TCLM_ASSERT((state == eSuccess), "");
TCLM_ASSERT((error == TCLE_THREAD_NONE), "");
以上仍然是在循环体内,是led控制线程的大循环。
而接下来的用户入口函数则对三个线程进行初始化,对三个线程的最初状态进行设置。我们可以看到,在这里只有led控制线程是被激活的,led亮灯线程和led灭灯线程是被休眠的。 |
|