在线时间4 小时
UID147898
注册时间2009-8-30
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 322
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2012-2-19 02:48:16
|
显示全部楼层
RE:MQX上中断串口的优先级
谢谢安的回复。
还想请教一下, 如果只用MQX提供的驱动函数,上边的问题是否需要考虑?
我现在要实现一个Modbus网络转串口的功能,串口接受到的一桢数据要通过网口传出去。串口接到第一个字节时开始循环读串口,并且监视如果等了3.5毫秒不来下个字节就认为这一桢数据已经完整接收到。
为此我用了MQX的中断串口方式(ITTYA),用fstatus()查缓冲区是否有数据,然后用_io_read()取出数据。
while(fstatus(Handle_Serial_A)==0)// 等第一个字节,
{
RTCS_time_delay(5);
Timeout_Count++;
if(Timeout_Count>200)// 等1秒没收到第一个字节,设超时标记
{
Flag_Timeout=1;
break;
}
}
if(Flag_Timeout==0)// 上一步没超时
{
_task_stop_preemption();//禁止任务抢占
_time_get(&time);
End_Time=time.SECONDS*1000 + time.MILLISECONDS;;
Start_Time=End_Time;
while((End_Time-Start_Time)=MAX_PDU_LENGTH) break;
}
_task_start_preemption();// 允许任务抢占
实际运行时发现判断桢结束的字节间的间断时间要从3.5毫秒延长到15毫秒系统才能勉强工作,否则程序就过早判断桢结束而丢失数据。总觉得如果MQX处理中断得当不应该丢失数据,fstatus()和_io_read(),_time_get()等函数也不应该受其他任务影响,因为我已经用_task_stop_preemption() 禁止其它任务抢占了。
系统的time resolution是默认的5毫秒,所以系统处理不了3.5毫秒是可以理解的,但2x5毫秒应该能保证吧? 现在15毫秒还报错。 如果系统再运行其他任务可能要设成25毫秒超时才行。难道是_task_stop_preemption()不起作用?
和串口连的另一端是可靠的,那个系统我没有用MQX,发送数据保证不会有多于3.5毫秒的间隔,而且稳定工作好几年了。
谢谢 |
|