历史上的今天

今天是:2024年09月23日(星期一)

正在发生

2019年09月23日 | UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机

发布者:ShimmeringStar 来源: eefocus关键字:UART0  串口编程  OS—II 手机看文章 扫描二维码
随时随地手机看文章

一.潜在的危机

1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂。尤其是接收状态为被动状态时,只能靠串行口中断来接收数据。

2.在进行串行通信时,双方遵循相同的通信协议。由于波特率不变,因此相邻两次串口中断的间隔时间基本固定。

3.在以下两种情况时会使接收过程出现错误:

(1)第一种情况是系统关中断的最长时间大于相邻两次串行接收中断的间隔时间,这时将可能导致遗漏一次中断,造成数据丢失。

(2)实时操作系统内核的关中断的最长时间是已知的,通常很短,它不是问题关键。

(3)系统关中断的最长时间往往是由用户软件造成的,例如:我们编写的中断服务函数过于复杂,导致系统为了处理中断服务函数而导致关中断时间过长。

(4)第二种情况是在串口程序正在运行期间有一个比它优先级更高的中断程序中断了串口程序。从而造成数据丢失。

(5)在这里提一个概念:把不能响应串口接收中断的这段时间称为“死区”。因此解决问题的关键是:死区时间不能比相邻两次串口中断的间隔时间长。


二.如何解决危机

l  任务在访问比较耗时的共享资源时不要采用关中断的方式(改成互斥信号量)。

l  ISR要尽可能简短,将可以剥离的工作转交关联任务去完成。

(此处的设计方式和Linux中把中断分为上半部分,和下半部分的原理有着同工异曲的含义)

采用上面的方法来缩短死区时间。

另一中方法是:

加长相邻两次串口接收中断的间隔时间。

l  方法一:降低波特率,这个方法简单,但因此也导致通信效率的下将。其次,一般在进行串口编程时,波特率一般是固定的。因此此方法一般不太适用。

l  方法二:在波特率不变的情况下减少中断次数,达到加长相邻两次串口接收中断间隔时间的效果。

ARM芯片的串口具有16字节的缓冲区,可以设置每接收1,4,8,14字节产生一次中断。如果设置每接收8字节中断一次,则比1字节中断一次要延长8倍的中断间隔时间。

Tiger-John说明:

l  在使用有数据缓冲功能的串口编程后,比较容易满足相邻两次串口接收中断的间隔时间大于死区时间的条件,但仍然存在潜在的危险。

想要可靠的避免这场危机:必须要满足以下条件

(1)相邻两次串口接收中断的间隔时间必须大于系统死区时间

(2)接收缓冲区的空闲时间必须足够存放在“死区”时间内接收到的新数据。

 若设置每接收8字节中断一次,则空闲空间也为8字节。由于死区时间比中断间隔时间短,故接收的新数据必然少于8字节,才不会出现数据丢失现象。

即在满足中断间隔时间大于“死区”时间的前提下,将中断条件设置为接收缓冲区的1/2,则死区时间接近中断间隔时间,接收过程是可靠的。


关键字:UART0  串口编程  OS—II 引用地址:UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机

上一篇: UART0串口编程(一):通信协议设计;RS232标准
下一篇:各种ARM仿真器接口图

推荐阅读

   虽然嘴上说着不买,但是苹果就是有魔力让你乖乖掏腰包。恰逢iPhone XS首销日,我们就来分析一下,使用老款iPhone的你,有没有必要升级到最高售价破万元的iPhone XS系列。如果真的有必要升级,又到底该买哪款呢?  iPhone X“定义了未来十年”不值得升级  iPhone X自发布伊始就被苹果称为“定义未来十年的手机”,所以我们可以将它理解为一款...
(文章来源:第一财经) 在第21届中国国际工业博览会上,更安全、更小巧、更灵活的协作机器人成为展会的一大主题,外资和自主品牌纷纷推出新款协作机器人,并将其应用到汽车、3C、食品、机械加工等领域。 作为制造业皇冠顶端的明珠,中国工业机器人市场在保持多年高速增长之后,迎来了销量拐点。根据中国机器人产业联盟统计与国际机器人联合会初步汇总...
最近这段时间,小枣君反复给大家介绍了全光网络(AON,All-Optical Network)。 我们知道,光网络是现代通信网络的基石,是基础设施中的基础设施。 如果没有强大的光网络进行支撑,包括8K视频、VR/AR、智慧工厂、智慧城市、智慧交通在内的大带宽、低时延应用场景,都无法完美实现。5G、F5G,也会变成浮云。 目前,光网络正在坚定不移地朝着全光网的方向发...
导读:新加坡科学家开发出了一种特殊装置,可以防止锂离子存储过程中树突的形成。他们创造的附加层作为代表负极的界面,与正极交换锂离子。新加坡南洋理工大学的科学家们开发出了一种新型技术,可以防止锂离子电池内部短路。短路仍是电池制造商需要克服的一个主要障碍,因为锂离子设备如果被损坏或制造不当就会起火。研究小组解释说,导致这些短路的原因是...

史海拾趣

问答坊 | AI 解惑

《ARM嵌入式系统开发典型模块》

《ARM嵌入式系统开发典型模块》…

查看全部问答∨

可以播放RM/RMVB的硬盘播放器

提供RM/RVMB硬盘播放器方案 RM播放器方案,RMVB播放器方案,硬盘播放器方案,广告机方案,RM播放方案,RM/RMVB播放方案 详细介绍    1、流媒体视频播放:全码率支持RM/RMVB格式,网络流媒体视频音频电视化。 2、影视播放:支持绝大部分视 ...…

查看全部问答∨

电路分析

大家来分享电路基础教程。…

查看全部问答∨

这个怎么理解

#if FLASH_F2812 // All sectors on an F2812 - Sectors A - J #define SECTOR_F2812  (SECTORA|SECTORB|SECTORC|\\                        SECTO ...…

查看全部问答∨

电子设计1000例

电子设计1000;例…

查看全部问答∨

nand flash挂载问题

Wince6.0下,想用nandflash做永久性存储设备。 但是只有当注册表设置成AutoPart=1和AutoFormat=1时,对nandflash进行分区和格式化,才能在my device里看到nandflash的分区。如果不进行分区和格式化,只是设置AutoMount=1,就看不到nandflash的分区 ...…

查看全部问答∨

ActivateDeviceEx()动态加载DLL疑问?

我调用ActivateDeviceEx函数动态加载编写的DLL驱动程序。 ActivateDeviceEx()对应的是XXX_Init()函数,可是调用ActivateDeviceEx函数时,不但执行了XXX_Init()函数,打印输出显示还执行了XXX_Open(),XXX_Close()函数。(我在这些函数中都加了打印 ...…

查看全部问答∨

LPC2119遇到的问题

我用LPC2119做一个数据采集器,用CAN通讯,用EEPROM存储参数。 现在我要实现两个不能同时运行的功能函数: 1)通过串口对EEPROM通过SPI设置参数,函数为ComCommunity(); 2)将采集到的数据通过CAN传递出去,函数为CanCommunity(); 由于(1)不 ...…

查看全部问答∨

老外教你画PCB的seminar

Design Strategies for PCB DecouplingView Details Who: Signal Integrity Engineers Power Integrity Engineers Digital Designers What:Learn new design strategies for PCB decoupling analysis; including new methods ...…

查看全部问答∨

MPS430 5438 串口

串口的校验位 数据位 停止位 不需要初始化吗? 是不是默认就是none 、8、1啊?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved