Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
为啥释放不出来信号量?帮忙看看程序
发布于 2013-03-05 11:57:12 浏览:3596
订阅该版
```extern void rt_hw_key_init(void); static struct rt_semaphore static_sem; ALIGN(RT_ALIGN_SIZE) static rt_uint8_t led_stack[ 1024 ]; static struct rt_thread led_thread; static void led_thread_entry(void* parameter) { unsigned int count=0; rt_err_t result; rt_tick_t tick; rt_hw_led_init(); while (1) { // rt_sem_release(&static_sem); //:shock: ①处 result = rt_sem_take(&static_sem, RT_WAITING_FOREVER); if (result != RT_EOK) { rt_kprintf("take a static semaphore, failed. "); rt_sem_detach(&static_sem); return; } rt_kprintf("take a staic semaphore, done. "); rt_sem_detach(&static_sem); /* led1 on */ #ifndef RT_USING_FINSH rt_kprintf("led on, count : %d ",count); #endif count++; rt_hw_led_on(0); rt_thread_delay( RT_TICK_PER_SECOND/2 ); /* sleep 0.5 second and switch to other thread */ /* led1 off */ #ifndef RT_USING_FINSH rt_kprintf("led off "); #endif rt_hw_led_off(0); rt_thread_delay( RT_TICK_PER_SECOND/2 ); } } static void key_thread_entry(void *parameter) { rt_time_t next_delay; struct rtgui_event_kbd kbd_event; /* init keyboard event */ RTGUI_EVENT_KBD_INIT(&kbd_event); kbd_event.mod = RTGUI_KMOD_NONE; kbd_event.unicode = 0; while (1) { next_delay = 50; kbd_event.key = RTGUIK_UNKNOWN; kbd_event.type = RTGUI_KEYDOWN; if ( key_down_GETVALUE() == 0 ) { rt_kprintf("key_down "); kbd_event.key = RTGUIK_DOWN; rt_sem_release(&static_sem); // :shock: ②处 } if ( key_up_GETVALUE() == 0 ) { rt_kprintf("key_up "); kbd_event.key = RTGUIK_UP; } if ( key_right_GETVALUE() == 0 ) { rt_kprintf("key_right "); kbd_event.key = RTGUIK_RIGHT; } if ( key_left_GETVALUE() == 0 ) { rt_kprintf("key_left "); kbd_event.key = RTGUIK_LEFT; } if (kbd_event.key != RTGUIK_UNKNOWN) { /* post down event */ // rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); // next_delay = 10; // /* delay to post up event */ // rt_thread_delay(next_delay); /* post up event */ // kbd_event.type = RTGUI_KEYUP; // rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); } GPIOB->ODR ^= GPIO_Pin_5; /* wait next key press */ rt_thread_delay(next_delay); } } static char key_stack[1024]; static rt_thread_t key_tid; struct rt_thread key; void rt_hw_key_init(void) { rt_err_t result; GPIO_Configuration(); /* key_tid = rt_thread_init("key", &key_thread_entry, RT_NULL, 1024, 11, 30); */ rt_thread_init(&key, "key", //consumer key_thread_entry, RT_NULL, (rt_uint8_t*)&key_stack[0], sizeof(key_stack),11,24); if (result == RT_EOK) { rt_thread_startup(&key); } } int rt_application_init() { rt_thread_t init_thread; rt_err_t result; result = rt_sem_init(&static_sem, "ssem", 0, RT_IPC_FLAG_FIFO); if (result != RT_EOK) { rt_kprintf("init dynamic semaphore failed. "); return -1; } rt_hw_key_init(); /* init led thread */ result = rt_thread_init(&led_thread, "led", led_thread_entry, RT_NULL, (rt_uint8_t*)&led_stack[0], sizeof(led_stack), 11, 30); if (result == RT_EOK) { rt_thread_startup(&led_thread); } init_thread = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048, 8, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread); return 0; } ``` 我本意是通过按键释放信号量,指示灯收到后动作。结果奇怪了!按键线程已经工作,并且按key_down键能够串口输出key_down 但运行过②处的rt_sem_release(&static_sem); 后static_sem的value并没有+1;所以LED不动作。但是在LED线程中①处的rt_sem_release(&static_sem); 使能后,LED线程能够正常运行,不能满足我的要求。KEY的现场动态 静态添加都试过 均失败! 点解?
查看更多
7
个回答
默认排序
按发布时间排序
aozima
2013-03-05
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
``` rt_sem_detach(&static_sem); ``` 点解?
eliucheng
2013-03-05
这家伙很懒,什么也没写!
脱离信号量对象。 注释掉效果一样,因为压根就没执行到那里!等不到信号量!
eliucheng
2013-03-05
这家伙很懒,什么也没写!
在LED中释放再持有就OK 在key中释放失败 持有的话直接FINSH输出错误 [2013:03:05:15:33:42][接收] ``` | / - RT - Thread Operating System / | 1.2.0 build Mar 4 2013 2006 - 2012 Copyright by rt-thread team psr: 0x61000000 pc: 0x0800184c lr: 0x0800187b r12: 0x00000000 r03: 0x00000000 r02: 0x00000000 r01: 0x20000b64 r00: 0x20000744 hard fault on thread: key thread pri status sp stack size max used left tick error -------- ---- ------- ---------- ---------- ---------- ---------- --- tidle 0x1f ready 0x00000040 0x00000100 0x00000040 0x00000020 000 tshell 0x14 ready 0x00000040 0x00000800 0x00000040 0x0000000a 000 led 0x0b ready 0x00000040 0x00000400 0x00000040 0x0000001e 000 key 0x0b suspend 0x00000040 0x00000400 0x00000070 0x00000018 000 init 0x08 close 0x00000068 0x00000800 0x00000068 0x00000013 000 ``` Help!Help!Help!Help!Help!Help!Help!Help!Help!Help!Help!Help!Help!Help!Help!Help!
bernard
2013-03-05
这家伙很懒,什么也没写!
不会你执行到detach的代码,然后奔掉了吧
grissiom
2013-03-06
这家伙很懒,什么也没写!
什么 BSP?RTT 是什么版本,源代码有没有改动?…… 奇怪的是 key 线程的状态是 suspend,而 hardfault 却是发生在 key 上……
bernard
2013-03-06
这家伙很懒,什么也没写!
>什么 BSP?RTT 是什么版本,源代码有没有改动?…… > >奇怪的是 key 线程的状态是 suspend,而 hardfault 却是发生在 key 上…… --- 我估计就是因为semaphore有问题了(例如detached),这个时候再去持有,那么会先把key thread状态设置成suspend,然后再进行semaphore操作,但是semaphore是错的,所以最终hard fault。
撰写答案
登录
注册新账号
关注者
0
被浏览
3.6k
关于作者
eliucheng
这家伙很懒,什么也没写!
提问
8
回答
13
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部