程序需要从串口接收一包数据,解析之后开始多任务的运行。
用的是CC1100无线,并做成了串口收发的模块,通过串口就可以进行收发。
因此PC通过串口无线发送一包数据,ARM端也是通过无线接收到数据,然后串口传给ARM,因此数据处理在ARM串口中断中。
在GUI中做了一个AutoRun的按钮,按下之后开始多任务的运行,现在的要求就是通过上位机无线发送一个开始命令,就开始多任务运行。
AutoRun按钮的处理如下:
case GUI_ID_BUTTON1: //StartAutoRun按钮 task_ptr=0; //任务序列从第0个开始执行
OSTaskResume(APP_TASK_TASKAGV2_PRIO); //恢复AGV任务
OSTimeDly(50);
OSTaskResume(APP_TASK_TASKAGV1_PRIO);
break;
按下按钮,可以正常开始运行。
大致的前提情况是这个样子的。
我想了三个办法:
1.直接在串口中断处理函数中调用AutoRun的处理代码
void USART1_IRQHandler(void) {
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //无线接收到AGV发送的信息
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
task_ptr=0; //任务序列从第0个开始执行
OSTaskResume(APP_TASK_TASKAGV2_PRIO); //恢复AGV任务
OSTimeDly(50);
OSTaskResume(APP_TASK_TASKAGV1_PRIO);
}
}
不成功,没有反应,不知道是不是中断中不能调用ucos的函数?或者是卡死在终端里了?
2.模拟发送给GUI一个按下AutoRun的消息
依然是在串口中断处理函数中,加入以下语句:
Message.MsgId = WM_NOTIFY_PARENT;
Message.Data.v = WM_NOTIFICATION_RELEASED;
Message.hWinSrc = GUI_ID_BUTTON1; //AutoRun按钮
WM_SendMessage(_hDialog[1], &Message); //发给AutoRun按钮所在的父窗口
不成功,ARM端直接就死机了,不知道是不是模拟按键的消息不是这么发的?
3.在中断中置位一个标志位,然后发送一个消息到AutoRun按钮所在窗口,在这个消息下处理
中断中置位AutoRun_Flag标志位:AutoRun_Flag=1;
然后发送一个消息: WM_MESSAGE Message; Message.MsgId = MSG_UPDATE_AGVS;
WM_SendMessage(_hDialog[1], &Message);
WM_InvalidateWindow(_hDialog[1]); //这个消息是发送成功的,以前用过
在窗口回掉函数中处理:
case MSG_UPDATE_AGVS:
if(AutoRun_Flag==1)
{
AutoRun_Flag=0;
task_ptr=0; //任务序列从第0个开始执行
OSTaskResume(APP_TASK_TASKAGV2_PRIO); //恢复AGV任务
OSTimeDly(50);
OSTaskResume(APP_TASK_TASKAGV1_PRIO);
}
依然会死机
求大神知道啊!
|