做了3个任务, 两个任务采集网口数据 Task_TcpClient1( void * p_arg ) Task_TcpClient2( void * p_arg )
另一个任务采进行MODBUS 通讯,
把网口的通讯任务优先级设置为5, MODBUS任务优先级设置为4, 网口的数据可以不用实时响应,
但是MODBUS必须实时响应
函数如下
网口采集1
void Task_TcpClient1( void * p_arg )
{
OS_ERR err;
(void)p_arg;
while (DEF_TRUE)
{ //任务体,通常写成一个死循环
ucKLTCPFrame[6]=0x01;
xMBTCPPortSendResponse( ucKLTCPFrame, 12 );
do_tcp_client();
OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err ); //相对性延时1000个时钟节拍(1s)
}
}
网口采集2
void Task_TcpClient2( void * p_arg )
{
OS_ERR err;
(void)p_arg;
while (DEF_TRUE)
{ //任务体,通常写成一个死循环
ucKLTCPFrame[6]=0x02;
xMBTCPPortSendResponse( ucKLTCPFrame, 12 );
do_tcp_client_1();
OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err ); //相对性延时1000个时钟节拍(1s)
}
}
MODBUS任务
void Task_Modbus ( void * p_arg )
{
OS_ERR err;
CPU_SR_ALLOC();
(void)p_arg;
while (DEF_TRUE)
{ //任务体,通常写成一个死循环
if(Uart2_rev_flag == 0x01)
{
Uart2_rev_flag = 0x00;//接收一帧数据标志清零
OS_CRITICAL_ENTER(); //进入临界段,避免串口打印被打断
ParseRecieve();//MOBUS处理函数
GPIO_ResetBits(GPIOA,GPIO_Pin_1);//485接收使能,关闭发送使能
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//允许接收中断
OS_CRITICAL_EXIT(); //退出临界段
}
// OSTimeDlyHMSM(0, 0,0,50,OS_OPT_TIME_HMSM_STRICT,&err); //延时阻塞50ms
// OSSched();
// OSTimeDly ( 10, OS_OPT_TIME_PERIODIC, & err ); //周期性延时5000个时钟节拍(5s)
}
现在现象 modbus任务中 把延时函数 加上 防止的时候 modbus数据 有时候能采集到, 但是 非常慢, 有时候发送的数据根本没有接收到
如果把延时函数换成 OSSched(); 任务切换,可以实时响应, 但是,网口的数就采集不到了, 请教下各位有啥情况
|