Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
关于多值信号量使用的一个问题
发布于 2020-04-05 17:08:47 浏览:886
订阅该版
* 本帖最后由 mjxust 于 2020-4-5 17:56 编辑 * 在做一个多值信号量实验的时候发现一个问题,默认多值信号量的值为5,那么我先进行释放信号量操作的情况下,比如先释放3次,那么这个值就会增加到8;这个时候再进行申请信号量,那么结果就是信号量被申请到的最大值变成了8,而不是默认的5,那么我想问问,这个是不是我使用多值信号的方法有问题?如果是,那么正确的方法是什么? 代码想实现的东西是按键1申请信号量,按键2释放信号量,分别用2个线程处理。 以下是我的代码: #include "./key/bsp_key.h" #include "./sem_cnt/sem_cnt.h" #include "rtthread.h" static rt_thread_t receive_thread = RT_NULL; static rt_thread_t send_thread = RT_NULL; static rt_sem_t test_sem = RT_NULL; static void receive_thread_entry(void* parameter); static void send_thread_entry(void* parameter); int Sem_cnt_Init(void) { test_sem = rt_sem_create("test_sem", 5, RT_IPC_FLAG_FIFO); if (test_sem != RT_NULL) rt_kprintf("¼ÆÊýÐźÅÁ¿´´½¨³É¹¦£¡
"); receive_thread = /* Ï߳̿ØÖÆ¿éÖ¸Õë */ rt_thread_create( "receive", /* Ïß³ÌÃû×Ö */ receive_thread_entry, /* Ïß³ÌÈë¿Úº¯Êý */ RT_NULL, /* Ïß³ÌÈë¿Úº¯Êý²ÎÊý */ 512, /* Ïß³ÌÕ»´óС */ 3, /* Ï̵߳ÄÓÅÏȼ¶ */ 20); /* Ïß³Ìʱ¼äƬ */ if (receive_thread != RT_NULL) rt_thread_startup(receive_thread); else return -1; send_thread = /* Ï߳̿ØÖÆ¿éÖ¸Õë */ rt_thread_create( "send", /* Ïß³ÌÃû×Ö */ send_thread_entry, /* Ïß³ÌÈë¿Úº¯Êý */ RT_NULL, /* Ïß³ÌÈë¿Úº¯Êý²ÎÊý */ 512, /* Ïß³ÌÕ»´óС */ 2, /* Ï̵߳ÄÓÅÏȼ¶ */ 20); /* Ïß³Ìʱ¼äƬ */ if (send_thread != RT_NULL) rt_thread_startup(send_thread); else return -1; } static void receive_thread_entry(void* parameter) { rt_err_t uwRet = RT_EOK; while(1) { if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON ) { uwRet = rt_sem_take(test_sem,0); rt_kprintf( "test_sem->value=%d
",test_sem->value ); if ( RT_EOK == uwRet ) rt_kprintf( "KEY1±»µ¥»÷£º³É¹¦ÉêÇ뵽ͣ³µÎ»¡£
" ); else rt_kprintf( "KEY1±»µ¥»÷£º²»ºÃÒâ˼£¬ÏÖÔÚÍ£³µ³¡ÒÑÂú£¡
" ); } rt_thread_delay(20); //ÿ20msɨÃèÒ»´Î } } static void send_thread_entry(void* parameter) { rt_err_t uwRet = RT_EOK; while (1) { if( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON ) { uwRet = rt_sem_release(test_sem); rt_kprintf( "test_sem->value=%d
",test_sem->value ); if ( RT_EOK == uwRet ) rt_kprintf ( "KEY2±»µ¥»÷£ºÊÍ·Å1¸öÍ£³µÎ»¡£
" ); else rt_kprintf ( "KEY2±»µ¥»÷£ºµ«ÒÑÎÞ³µÎ»¿ÉÒÔÊÍ·Å£¡
" ); } rt_thread_delay(20); //ÿ20msɨÃèÒ»´Î } } 以下是调试信息: *****LED_GPIO_Config**** *****Key_GPIO_Config**** \ | / - RT - Thread Operating System / | \ 3.1.3 build Apr 4 2020 2006 - 2019 Copyright by rt-thread team ==========main========== led1_thread=800002c0 led2_thread=80000568 key_thread=80000810 receive任务接收到消息在串口回显 消息队列创建成功! 这是一个[野火]-i.MX RT-RTT二值信号量同步实验! 同步成功则输出Successful,反之输出Fail 信号量创建成功! 这是一个[野火]-i.MX RT-RTT计数信号量实验! 车位默认值为5个,按下K1申请车位,按下K2释放车位! 计数信号量创建成功! test_sem->value=6 KEY2被单击:释放1个停车位。 test_sem->value=7 KEY2被单击:释放1个停车位。 test_sem->value=8 KEY2被单击:释放1个停车位。 test_sem->value=7 KEY1被单击:成功申请到停车位。 test_sem->value=6 KEY1被单击:成功申请到停车位。 test_sem->value=5 KEY1被单击:成功申请到停车位。 test_sem->value=4 KEY1被单击:成功申请到停车位。 test_sem->value=3 KEY1被单击:成功申请到停车位。 test_sem->value=2 KEY1被单击:成功申请到停车位。 test_sem->value=1 KEY1被单击:成功申请到停车位。 test_sem->value=0 KEY1被单击:成功申请到停车位。 test_sem->value=0 KEY1被单击:不好意思,现在停车场已满! test_sem->value=0 KEY1被单击:不好意思,现在停车场已满! 下载附件 [sem_cnt.c](https://oss-club.rt-thread.org/uploads/202004/05/171118je8f5vhefznehn64.attach)
查看更多
3
个回答
默认排序
按发布时间排序
Intefire
2020-04-12
这家伙很懒,什么也没写!
>信号量每释放一次数值加1,使用上没有问题 --- 加入我先释放,再使用,这样就会有问题了,要防止这样的情形。
撰写答案
登录
注册新账号
关注者
0
被浏览
886
关于作者
Intefire
这家伙很懒,什么也没写!
提问
1
回答
1
被采纳
0
关注TA
发私信
相关问题
1
请教cpu使用率分析
2
选择FreeRTOS, 还是RT-Thread。
3
thread heap stack overflow ?
4
rtt消息队列delay问题
5
释放被删除线程的内存地方在哪里啊
6
请教:各线程结束后,释放其中的内存的连续性问题
7
STM32F103中断关于信号量、邮箱问题
8
RTT中的线程栈大小如何控制
9
关于线程由执行态变为挂起态的代码实现,,,
10
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部