搜索
bottom↓
回复: 3

谁给讲讲,信号量,操作啊,(手册,82页)

[复制链接]

出0入0汤圆

发表于 2011-4-25 11:02:06 | 显示全部楼层 |阅读模式
问题:
  196 sem = rt sem create("sem", 1, RT IPC FLAG FIFO);  为什么这个信号量的值要设为1

  为什么生产和消费,都有,
  rt_sem_take();
  rt_sem_release();
函数.

  没看明白,怎么发一个信号,怎么接收一个信号



/* 生产者线程入口*/
135 static void thread entry(void* parameter)
136 {
137 rt bool t result;
138 rt uint8 t data buffer[BUFFER ITEM];
139
140 while (1)
141 {
142 /* 持有信号量*/
143 rt sem take(sem, RT WAITING FOREVER);
144 /* 从环buffer中获得数据*/
145 result = rb get(&working rb, &data buffer[0], BUFFER ITEM);
146 /* 释放信号量*/
147 rt sem release(sem);
148
149 if (result == RT TRUE)
150 {
151 /* 获取数据成功,打印数据*/
152 rt kprintf("%s\n", data buffer);
153 }
154
155 /* 做一个5 OS Tick的休眠*/
156 rt thread delay(5);
157 }
158 }
159
160 /* worker线程入口*/  
161 static void worker entry(void* parameter)
162 {
163 rt bool t result;
164 rt uint32 t index, setchar;
165 rt uint8 t data buffer[BUFFER ITEM];
166
167 setchar = 0x21;
168 while (1)
169 {
170 /* 构造数据*/
171 for(index = 0; index < BUFFER ITEM; index++)
172 {
173 data buffer[index] = setchar;
174 if (++setchar == 0x7f)
175 setchar = 0x21;
176 }
177
178 /* 持有信号量*/
179 rt sem take(sem, RT WAITING FOREVER);
180 /* 把数据放到环形buffer中*/
181 result = rb put(&working rb, &data buffer[0], BUFFER ITEM);
182 /* 释放信号量*/
183 rt sem release(sem);
184
185 /* 放入成功,做一个10 OS Tick的休眠*/
186 rt thread delay(10);
187 }
188 }
189
190 int semaphore buffer worker init()
191 {
192 /* 初始化ring buffer */
193 rb init(&working rb, working buffer, BUFFER SIZE);
194
195 /* 创建信号量*/
196 sem = rt sem create("sem", 1, RT IPC FLAG FIFO);
197 if (sem == RT NULL)
198 {
199 tc stat(TC STAT END j TC STAT FAILED);
200 return 0;
201 }
202
203 /* 创建线程1 */
204 tid = rt thread create("thread",
205 thread entry, RT NULL, /* 线程入口是thread entry, 入口参数是RT NULL */
206 THREAD STACK SIZE, THREAD PRIORITY, THREAD TIMESLICE);
207 if (tid != RT NULL)
208 rt thread startup(tid);
209 else
210 tc stat(TC STAT END j TC STAT FAILED);
211
212 /* 创建线程2 */
213 worker = rt thread create("worker",
214 worker entry, RT NULL, /* 线程入口是worker entry, 入口参数是RT NULL */
215 THREAD STACK SIZE, THREAD PRIORITY, THREAD TIMESLICE);
216 if (worker != RT NULL)
217 rt thread startup(worker);
218 else
219 tc stat(TC STAT END j TC STAT FAILED);
220
221 return 0;
222 }
223

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-4-25 23:33:09 | 显示全部楼层
楼主可以去看一下ucos-ii里对sem的解释。

take不一定会立即返回,可能使当前线程挂起然后执行别的线程;
等到别的线程release之后,内核再切换到调用take的线程那里。

出0入0汤圆

 楼主| 发表于 2011-4-26 16:15:18 | 显示全部楼层
谢谢楼上的回答,现在我明白了.

哪个任务,获得了信号量,它就可以对信号量表示的资源进行操作, 如果它不释放信号量,别的任务就不能得到该信号量。
等待该信号量的任务会被挂起.

出0入0汤圆

发表于 2011-4-27 21:50:58 | 显示全部楼层
楼上理解的对
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表