你反过来应用
你可以在中断中发送一个信号,这样你就中断中就不用等待了
我在中断里就收信号量
用这个函数
msg = (CPU_INT08U *)OSMboxAccept(AppUserIFMbox);
为什么一直是零呢
可否建立个优先级高的任务,在任务中收信号量
可否建立个优先级高的任务,在任务中收信号量,
接到sem后,剥夺现有任务开始你要求的操作.
想这样做,你只有建立一个轮询任务了
直接查询信号。
我说的意识你是没有听明白。
比如捕捉一个信号,你可以开捕捉中断,然后在中断中用:OSSemPost。
你再定义一个任务是这样的格式:
task()
{
for (;;)
{
msg=OSSemPend
}
}
我是这样做的 请看我的程序:
中断函数:(可以正常进入)
static void App_Spurious_ISR1 (void) //@ "ICODE"
{
CPU_INT08U key=2;
OS_CPU_SR cpu_sr;
EXTI_ClearFlag(EXTI_Line0);
OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
OSIntNesting++;
OS_EXIT_CRITICAL();
OSMboxPost(AppUserIFMbox, (void *)key);//发送信号量
OSIntExit();
}
任务(不是最高级的)
:
static void AppTaskUserIF (void *p_arg)
{
CPU_INT08U *msg;
CPU_INT08U err;
//CPU_INT32U nstate;
CPU_INT32U pstate;
(void)p_arg;
AppDispScr_SignOn();
OSTimeDlyHMSM(0, 0, 1, 0);
nstate = 1;
pstate = 1;
while (DEF_TRUE) {
msg = (CPU_INT08U *)(OSMboxPend(AppUserIFMbox, OS_TICKS_PER_SEC / 10, &err));
if (err == OS_NO_ERR) {
nstate = (CPU_INT32U)msg;
}
switch (nstate) {
case 2:
LED_On(0);
OSTimeDlyHMSM(0, 0, 1, 50);
break;
}
}
}
为什么接受的信号量不对,应该说是0 而不是我中断里 发送的2
这个和AppUserIFMbox的定义有关系吗
楼上能帮我看看什么原因吗