|
本帖最后由 wangpengcheng 于 2014-9-5 21:30 编辑
上一个帖子,我简单的做了两个任务,并顺利运行,运行结果用串口输出了,看起来还是蛮COOL的,这次,我想用个信号量,将两个任务进行同步!
先引入信号量的概念:信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。
我理解是这样的,它相当于一个计数器,发送的一端给计数器加-,而接收的一端从计数器里相应进行减一,但是它注定是一个非负数,如果减到0,那么就没得减了。
那么在MQX中,信号量的接口都有哪些呀?呵呵,在lwsem.h文件中找到了:
- extern _mqx_uint _lwsem_create(LWSEM_STRUCT_PTR, _mqx_int);
- extern _mqx_uint _lwsem_create_hidden(LWSEM_STRUCT_PTR, _mqx_int);
- extern _mqx_uint _lwsem_destroy(LWSEM_STRUCT_PTR);
- extern bool _lwsem_poll(LWSEM_STRUCT_PTR);
- extern _mqx_uint _lwsem_post(LWSEM_STRUCT_PTR);
- extern _mqx_uint _lwsem_test(void **, void **);
- extern _mqx_uint _lwsem_wait(LWSEM_STRUCT_PTR);
- extern _mqx_uint _lwsem_wait_ticks(LWSEM_STRUCT_PTR, _mqx_uint);
- extern _mqx_uint _lwsem_wait_for(LWSEM_STRUCT_PTR, MQX_TICK_STRUCT_PTR);
- extern _mqx_uint _lwsem_wait_until(LWSEM_STRUCT_PTR, MQX_TICK_STRUCT_PTR);
复制代码
看看也没几个呀,呵呵,是的,就这么简单啦,先看看这些函数主要功能:
_lwsem_create 创建轻量级信号量
_lwsem_destroy 撤销轻量级信号量 ------------------相当于释放空间
_lwsem_poll 提升轻量级信号量(非阻塞) --------------------这个我也没用过,呵呵,不知道什么意思
_lwsem_post 传递轻量级信号量 ----------------------------发送
_lwsem_test 测试轻量级信号量组件 ------------------------测试用的,不管它啦
_lwsem_wait 等待轻量级信号量 ----------------------------死等,直到出现需要的信号量
_lwsem_wait_for 为轻量级信号量等待指定的时钟滴答周期 --------------------------按时钟滴答等待
_lwsem_wait_ticks 为轻量级信号量等待指定的时钟滴答数 ----------------------------按时钟滴答等等
_lwsem_wait_until 等待轻量级信号量直到指定的时钟滴答数结束 --------------------------在一定的时间段内等待信号量
嗯,我承认,后面那三个条件等待我至今没有用过!(其实我也就用MQX做了一个比较小的项目 )不过不影响啊,今天我说的这个还是比较简单,还用不到那个!
看完函数,我想做个过程,大概是这样的,还是上次那个例程,我让Hello任务发个信号量给Yes任务,让Yes任务回应!
好了,首先定义一个Apple信号量,当然要是全局变量,因为我两个任务都要使用呢:
然后在Hello任务中,我让他拿一个苹果给别人,代码如下:
- /*TASK*-----------------------------------------------------
- *
- * Task Name : hello_task
- * Comments :
- * This task prints " Hello World "
- *
- *END*-----------------------------------------------------*/
- void hello_task
- (
- uint32_t initial_data
- )
- {
- (void)initial_data; /* disable 'unused variable' warning */
- //创建信号量,注意后面那个参数是信号量的初始值
- _mqx_uint result = _lwsem_create(&Apple, 0);
- if (result != MQX_OK) {
- printf("\nCreating write_sem failed: 0x%X", result);
- _mqx_exit(0);
- }
- int i;
- for(i = 0; ;i++)
- {
- printf("Hello,An apple for you!\n");
- //信号量发送
- _lwsem_post(&Apple);
- _time_delay(1000);
- }
- }
复制代码
注意:在信号量创建的时候信号量的初始值,如果初始化需要有信号量存在,那么,初始值可根据你的需要赋值。如果不需要,那就写0。以前有个同事,初始化信号量的时候给写了个1,然后进程总是不稳定,我们查了一星期才找到这个原因,所以这块一定要注意!
好了,送苹果的一方已经搞定了,那么我们再看看收苹果的一方,收到当然要谢谢啦:
- void yes_task(uint32_t para)
- {
- int i;
- for(i = 0; ;i++)
- {
- _lwsem_wait(&Apple); //信号量等待
- printf("thanks!\n", i);
- }
- }
复制代码
呵呵,跟以前不一样了,把延时1秒给去掉了,加了个信号量等待!
可以啦,现在看下运行结果如何:
看到没,Hello任务给一次,yes任务就谢谢一次,多友好啊!
很简单吧,我已经让两个任务之间有了关系了!其实还有其它类似信号量的元素在OS中,以后再说吧!
我只是举了个最简单的例子,信号量的应用网上有一个最经典的生产消费者的例子,可以看一下,真的很经典!
例程:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|