硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2915|回复: 10
收起左侧

[μCOS-II] 裸奔下的串口容错处理机制在uCOS下的移植问题

[复制链接]

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2017-2-22 16:02:25 | 显示全部楼层 |阅读模式
裸奔情况下,利用时隙的简单原理,同时进行下面的操作:
1、从收到第1个字节数据开始,就不断的根据协议解析数据是否符合协议(中间有复杂的解析过程略过),如果解析正确,耗费时间肯定在50ms内
2、从收到第1个字节的时刻开始,延时50ms后,判断如果接收到的数据仍然没有处理完毕(肯定是之前第1步一直没有正确解析完毕,很有可能的是数据包里夹杂了乱数据),则把收到的数据全部清除
通过上面的两个处理步骤,正确的数据包会很快被解析出来执行;不正确的数据包(正确包里混杂其它乱数据,主要是在包头之前和之后)会在收到数据50ms后清除,这样就能保证即使是在通信发生混乱后,也能通过50ms的时隙代价重新建立正确的通信


那么现在要把上面的裸奔处理串口通信机制移植到uCOS系统下
做一个单向循环链表,有头指针和尾指针
1、串口接收中断的任务就是把接收到的数据通过移动头指针,不断的往链表里写,其它不管
2、开一个任务1,处理串口数据,当发现单向链表的头尾指针不重合之后就开始按照协议处理数据,处理完数据后,将头尾指针重合在一起
这里依然存在裸奔时面临的问题,就是杂乱数据的影响,也用时隙机制处理
3、开一个任务2,当监测到循环链表的头尾指针不重合后,延时50ms,如果发现头尾指针还不重合,说明任务1没有把数据解析处理完,则强制将头尾指针重合在一起


上面貌似把裸奔下的处理机制移植到了uCOS下,但是有个问题,任务1正处理数据呢,任务2把链表的头尾指针给强制重合了,在有系统的情况下这样处理是不是不太妥当?是不是该有个同步机制或者信号量啥的互相通知一下呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2017-2-23 10:07:36 | 显示全部楼层
uCOS不是有消息队列,直接拿来用就好了。
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
 楼主| 发表于 2017-2-23 11:09:24 | 显示全部楼层
你的意思是串口中断接收到数据之后,直接给负责串口处理的任务发消息传送数据?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2017-2-23 11:35:05 | 显示全部楼层

回 taobaofarmer 的帖子

taobaofarmer:你的意思是串口中断接收到数据之后,直接给负责串口处理的任务发消息传送数据? (2017-02-23 11:09) 
可以的。
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
 楼主| 发表于 2017-2-23 12:13:40 | 显示全部楼层
安富莱有这样的例程吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2017-2-23 16:44:05 | 显示全部楼层

回 taobaofarmer 的帖子

taobaofarmer:安富莱有这样的例程吗? (2017-02-23 12:13) 
没有哦。
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
 楼主| 发表于 2017-2-27 12:34:23 | 显示全部楼层
我按照这个架构写了下代码,在串口接收中断里:

u8  i;
i = USART2->DR;
OSMboxPost(sOS_Params.pEvent_Uart2Rx,  &i);

在串口处理函数里收消息:
msg = *(u8 *)(OSMboxPend(sOS_Params.pEvent_Uart2Rx, OS_TICKS_PER_SEC , &err));

确实收到了串口中断服务函数发来的消息,数据解析也是正确的
但是这里有个问题,OSMboxPost()函数发出的是个临时变量i的地址,能保证在OSMboxPend()函数接收到消息之前,串口没有接收到新数据,从而使i地址中的值被改变了吗?
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
 楼主| 发表于 2017-3-1 13:24:50 | 显示全部楼层
方式1:串口中断中用链表接收数据、任务中处理链表;方式2:串口中断接收到数据然后给任务发消息的方式各做了个实验,发现方式2的效率较低,处理串口数据的速度明显变慢,而且给操作系统加重了很大的负担,整体处理效率照比方式1不理想,这种方式不太可取,个人建议方式1
回复

使用道具 举报

32

主题

295

回帖

391

积分

高级会员

积分
391
发表于 2017-3-14 22:32:48 | 显示全部楼层
很好的帖子呀,我建议用方式1吧,方式2比较简洁,但是效率太低了
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2018-1-19 16:04:51 | 显示全部楼层
UCOS新手请教楼主,串口中断协议接收部分还是跟裸机处理一样,协议解析正确后发送邮箱给处理任务,这样是不是不符合UCOS系统用法?
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
 楼主| 发表于 2018-3-3 21:31:08 | 显示全部楼层
你可能不知道,中断处理里代码量要尽量的少,这是重要原则,必须尽快执行完中断,然后迅速把CPU控制权返还给应用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 12:03 , Processed in 0.202573 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表