请问各位高手,信号量如何对应到信号量实例?
/*
2 * 程序清单:动态信号量
3 *
4 * 这个例子中将创建一个动态信号量(初始值为0 )及一个动态线程,在这个动态线程中
5 * 将试图采用超时方式去持有信号量,应该超时返回。然后这个线程释放一次信号量,并
6 * 在后面继续采用永久等待方式去持有信号量, 成功获得信号量后返回。
7 */
8 #include <rtthread.h>
9 #include "tccomm.h"
10
11 /* 指向线程控制块的指针*/
12 static rtthreadt tid = RTNULL;
13 /* 指向信号量的指针*/
14 static rtsemt sem = RTNULL;
15 /* 线程入口*/
16 static void threadentry(void* parameter)
17 {
18 rterrt result;
19 rttickt tick;
20
21 /* 获得当前的OS Tick */
22 tick = rttickget();
23
24 /* 视图持有一个信号量,如果10个OS Tick依然没拿到,则超时返回*/
25 result = rtsemtake(sem, 10);
26 if (result == -RTETIMEOUT)
27 {
28 /* 判断是否刚好过去10个OS Tick */
29 if (rttickget() - tick != 10)
30 {
31 /* 如果失败,则测试失败*/
32 tcdone(TCSTATFAILED);
33 rtsemdelete(sem);
34 return;
35 }
36 rtkprintf("take semaphore timeout\n");
37 }
38 else
39 {
40 /* 因为并没释放信号量,应该是超时返回,否则测试失败*/
41 tcdone(TCSTATFAILED);
42 rtsemdelete(sem);
43 return;
44 }
45
46 /* 释放一次信号量*/
47 rtsemrelease(sem);
48
49 /* 继续持有信号量,并永远等待直到持有到信号量*/
50 result = rtsemtake(sem, RTWAITINGFOREVER);
51 if (result != RTEOK)
52 {
53 /* 返回不正确,测试失败*/
54 tcdone(TCSTATFAILED);
55 rtsemdelete(sem);
56 return;
57 }
58
59 /* 测试成功*/
60 tcdone(TCSTATPASSED);
61 /* 删除信号量*/
62 rtsemdelete(sem);
63 }
64
65 int semaphoredynamicinit()
66 {
67 /* 创建一个信号量,初始值是0 */
68 sem = rtsemcreate("sem", 0, RTIPCFLAGFIFO);
69 if (sem == RTNULL)
70 {
71 tcstat(TCSTATEND j TCSTATFAILED);
72 return 0;
73 }
74
75 /* 创建线程*/
76 tid = rtthreadcreate("thread",
77 threadentry, RTNULL, /* 线程入口是threadentry, 入口参数是RTNULL */
78 THREADSTACKSIZE, THREADPRIORITY, THREADTIMESLICE);
79 if (tid != RTNULL)
80 rtthreadstartup(tid);
81 else
82 tcstat(TCSTATEND j TCSTATFAILED);
83
84 return 0;
85 }
86
87 #ifdef RTUSINGTC
88 static void tccleanup()
89 {
90 /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断*/
91 rtentercritical();
92
93 /* 删除线程*/
94 if (tid != RTNULL && tid->stat != RTTHREADCLOSE)
95 {
96 rtthreaddelete(tid);
97
98 /* 删除信号量*/
99 rtsemdelete(sem);
100 }
101
102 /* 调度器解锁*/
103 rtexitcritical();
104
105 /* 设置TestCase状态*/
106 tcdone(TCSTATPASSED);
107 }
108
109 int tcsemaphoredynamic()
110 {
111 /* 设置TestCase清理回调函数*/
112 tccleanup(tccleanup);
113 semaphoredynamicinit();
114
115 /* 返回TestCase运行的最长时间*/
116 return 100;
117 }
118 /* 输出函数命令到finsh shell中*/
119 FINSHFUNCTIONEXPORT(tcsemaphoredynamic, a dynamic semaphore example);
120 #else
121 /* 用户应用入口*/
122 int rtapplicationinit()
123 {
124 semaphoredynamicinit();
125
126 return 0;
127 }
128 #endif |