title
收藏本站
联系站长
关于本站
首页 信息发布 产品宣传 论坛交流 学习文章 技术人生 项目源码 技术资料 人才收录
 今天是: 2010年7月10日 星期 六
欢迎光临!单片机群号:25930265(新) 71062262 21829895 64584393 26583231(只限加一群)  
热门文章推荐


当前位置:首页>>>单片机学习文章>> ecos增值包应用举例---视频监控终端
ecos增值包应用举例---视频监控终端方案
作者:md9给他留言 [转载] 字体:
发表于:
2009-12-13 10:37:49
想用GPRS传输视频图像的话,必须高强度压缩,比如:MP4或者H.264,否则根本不实用。 
GPRS最好使用套餐,而且要防范乱收费,比如:WAP流量什么的。 
GPRS传CIF压缩图像可以做到15帧-60帧/秒,比较连续了,不过要做速率自适应调整,还有断线检测,无线信道的TCP要重写。 
关于在各种介质上提高TCP速率的分析  2006/03/13 
    TCP的传输速率取决于重传延时,只要尽量避免重传,就能提高传输速度。TCP通过CRC检错和错误重传机制实现可靠传输。TCP传输速度 = 有效传输字节数 / 传输时间 。在传输字节数相同的情况下,减少传输时间就可以提高速度。 
    传输时间由CPU处理时间、传输往返时间、重传消耗时间三部分组成。 
    其中,CPU处理时间一般可以忽略不计,因为现代的CPU单条指令执行时间是ns或us量级的,而TCP定时器是200ms量级的,即使代码量膨胀上万倍,所消耗的时间与TCP定时器时间比起来也微乎其微。 
     
    传输往返时间是指从发出数据到接收到应答所耗费的时间,这个时间不能避免,不过,通过采用滑动窗技术,可以在一个往返时间内传输更多的数据,比停等协议显著提高了速度。在信号质量好的信道内,不妨将接收对告窗口设置得大些(如65535),这样,在接收到应答前,可以传输更多数据。另外,延迟200ms应答可以积攒更多数据,一次性发出,减少小数据包造成的头部开销浪费,这个延迟是有益的。 
     
    重传是由于拥塞丢包、误码丢包、坏包、超时引起的,这是影响TCP传输速度最主要的原因,应尽量避免。虽然TCP是面向连接的协议,但它不像电路交换那样拥有信令通道,可以获得完备的链路信息。TCP不清楚当前链路情况,只能通过事后观察现象,试探或者推测出相关信息,例如往返时间,拥塞情况,链路恢复,丢包等等。这种“马后炮”式的做法势必造成不必要的时间浪费,此时事先预防比事后补救要有效得多。比如:事先开辟一个大的缓冲区按顺序缓存收到的有效包,再组装成一大块连续的数据块发送到应用层,这样就避免了人为地丢弃乱序包造成的丢包重传,而且即使在出现坏包的情况下也不用重传所有已经有效到达的数据包。不过,因为增加了排序组装、包缓冲区、内存管理代码,所以内存的占用量肯定会增大。 
     
    标准的BSD TCP协议栈是很早以前在铜线网络上实现的,现在出现了很多新的传输介质,他们的特性对TCP传输速度有显著影响: 
     
    (1)无线网络 
        无线网络因其可移动特性,应用越来越多,如GPRS、CDMA、载波等。它的特点是误码率高,带宽小。当越区切换或者信号不好时可能会造成误码丢包,但是标准的BSD协议栈假设所有的丢包都是由于拥塞引起的,这在低误码率的铜线网络上是成立的,但在无线网络里,频繁的误码丢包会造成拥塞窗长时间保持在小窗口状态,即使无线信道恢复正常,拥塞控制算法仍然限制发送速率,尽管此时并没有发生拥塞。因此,在无线介质上的TCP协议栈要修正标准BSD协议栈的已经失效的假设,使其保持激进的发送策略,充分榨取宝贵的无线带宽,同时保持小的额外开销。改进方法...... 

    (2)卫星通道 
        卫星通道的特点是延迟大,误码率低,带宽大。TCP若想保持高速,必须增大发送窗口,避免重传。比如:发送了10K数据,多次重传花费了5秒的时间,那么传输速率只有区区2K。避免重传的一个有效方法是预防性重发,一个包发好几遍,减小出错概率,不过带宽浪费大,反正卫星通道的带宽很大,用带宽换速度也划算。 

    (3)高速光纤网络 
        高速光纤网络的特点是误码率极低,带宽极大。按理说误码率低的话,标准TCP协议应该能很好地工作,不过,即使是误码率极低的情况,也还是会有出现误码的时候,此时,问题来了。丢包时,标准TCP会启动拥塞控制,它的恢复速度在高带宽低误码下显得过于保守,虽然相对损耗比例比较小,但绝对带宽损失大(会损失几十兆带宽),对于想榨干带宽利用率的我们来说,这是不能忍受的。此时需要增加更激进的快速恢复算法,用空间换时间。 
    (4)铜线网络 
        标准BSD协议栈就是在铜线网络上开发的,铜线网络的特点是误码率低,带宽大。TCP假设一切丢包都由拥塞引起。拥塞控制会影响效率,但能保证公平性,最终实现整体效率最高。 
    TCP协议的速度还与任务划分有关,应该合理地安排TCP任务的优先级,使其能够获得充足的时间片。 
    ecos增值包提供了多线程调度、文件系统、TCP/IP协议栈、图形用户界面等完整功能,裁减配置能力强,特别适合中高端嵌入式应用开发。税控机、行驶记录仪、视频监控终端、网络传输设备等都可以考虑使用ecos平台简化设计,减少代码量。 
     
    下图是一个视频监控终端示意图: 
     
     
                        键盘、烟雾/温度/红外传感器、I/O输出控制 
                          ------------------------------- 
                          |       DMA/中断              |--------->蓝牙模块 
    四路视频输入--------->| SAA7111     视音频          |--------->以太网Ethernet 
    一路音频输入/输出---->| A/D、D/A   编解码器   MCU   |--------->GPRS、CDMA串口 
                          |                    RTC      |--------->WiFi 
                          ------------------------------- 
                          硬盘/CF卡/SD卡/USB存储设备 
     
    此系统包括四路视频输入(一路选通,支持CMOS摄像头、PAL/NTSC/用户自定义制式);一路音频输入输出;多种大容量存储外设,满足配置文件和视频文件存储;输入输出I/O设备;各种传感器探测;网络通信部分,满足远近距离音视频传输。 
    系统内部由A/D、D/A转换器,视音频编解码器,MCU子系统组成。 
     
    对于这么一个小系统,使用ecos增值包来设计是非常方便的。 
     
    存储设备:直接挂装文件系统,mount /hd、/cf、/sd、/usb,然后利用标准的文件操作函数读写各种介质上的数据。(项目进度可控) 
     
    输入输出设备:采用《第二讲硬件IO操作》和《第三讲ecos中断操作》可以非常容易地实现输入输出控制。键盘中断结构直接抄模板,I/O操作使用宏,便于移植。(项目进度可控) 
     
    网络传输设备:采用《第六讲串口操作》,将GPRS/CDMA的MODEM串口挂装到/dev/ser1上,ecos自动枚举串口,会自动识别出MODEM串口和各种版本的16C55x工业标准,编译时已经配置好是否需要RAM缓冲区及其大小(带缓冲区的自动基于中断驱动),用户只要操作抽象的串口文件即可。ecos自带完整协议栈,支持PPP、UDP、TCP,用户只要使用标准的socket编程(多播、组播、RTP/RTCP)即可。(项目进度可控) 
     
    A/D、D/A设备:视频数据量大,采用DMA能大大减少压栈、出栈操作,提高效率。中断操作参考《第三讲》。SAA7111采用I2C接口,操作复杂,适宜使用C++编程,参考《第十三讲 宏、汇编、C和C++混合编程》。抽象I2C、EEPROM和SAA7111为C++对象: 
     
//====================================================== 
    class CIICBus 
    { 
    private: 
        //for video iic 
        //for eeprom iic 
         
    public: 
        CIICBus(int who ); 
         
        void  SCLOut( IIC_LEVEL Level ); 
void  SDAOut( IIC_LEVEL Level ); 
IIC_LEVEL  SCLIn( void ); 
IIC_LEVEL  SDAIn( void ); 
void  BusDelay( int Count ); 

BOOL  CheckBusState( void ); 
void  BusStart( void ); 
void  BusRepeatStart( void ); 
void  BusStop( void ); 
void  WriteByte( unsigned char Data ); 
void  ReadByte( unsigned char &Data ); 
BOOL  GetAck( void ); 
void  SetAck( IIC_LEVEL ); 
        static void  Init(); 
        static void  Lock(); 
        static void  Unlock(); 
    }; 
//====================================================== 
    class CEeprom : public CIICBus 
    { 
    private: 
cyg_mutex_t hMutex; 
    public: 
CEeprom();  //:CIICBus( 0 ) { BusStop(); } 
    public: 
void Init(); 
int Write( unsigned char *buf, unsigned char pos, unsigned char size ); 
        int Read( unsigned char *buf, unsigned char pos, unsigned char size ); 
    }; 
//====================================================== 
    class CSAA7111 : public CIICBus 
    { 
    private: 
#ifdef __ECOS__ 
        //寄存器地址 
#endif 
    protected: 
        unsigned int  m_BusTimeout; 
     
    public: 
        CSAA7111( unsigned int DelayConst = 10, unsigned int BusTimeout = 3 ) 
        :CIICBus(1), m_BusTimeout( BusTimeout )   {}   

#ifdef __ECOS__ 
        void  Reset( void ); 
        void  PowerSave( BOOL Enable ); 
        void  ForbidOutput( BOOL Enable );  // operate CE, not FEI# 
#endif 

    public: 
        BOOL  Initialize( void ); 
        BOOL  WriteReg( unsigned char Reg, unsigned char Data ); 
        BOOL  ReadReg( unsigned char Reg, unsigned char &Data ); 
        BOOL  SetVideoSource( int CamNo ); 
        BOOL  GetVideoSource( int &CamNo ); 
        BOOL  CheckVideoSingal( ); 
        void  SetBusTimeout( unsigned int BusTimeout  ) { m_BusTimeout = BusTimeout; } 
        void  GetBusTimeout( unsigned int &BusTimeout ) { BusTimeout = m_BusTimeout; } 
    }; 
     
    对象化的SAA7111操作接近人类的思维习惯,初始化、读写寄存器、设置视频源、检测视频信号等思路非常清晰。利用《第十二讲 多目录下makefile的通用写法》中介绍的宏定义可以根据实际情况调节代码,如“#ifdef __ECOS__”。 
     
    视音频编解码器:采用自行设计的ASIC芯片HJV进行H.264视频压缩,视频编码器寄存器种类繁多,采用面向对象的设计方法可以保证代码质量。 
     
    class CHJVCodec 
    { 
    private: 
        // HJ602 status 
        // Video input 
        // Display generation 
        // Video output 
        // Codec operation 
        // Chip operation 
        // video buffer management 
    public: 
        void WriteDecBuf 
        void WriteDecBuf 
        int ReadDecBuf 

    private: 
        void ValueBitrate 
        void ValueChunkThreshold 

    public: 
        CHJVCodec 

        // Chip IO 
#ifdef _ECOS_ 
        void ReadReg 
        void WriteReg 
        void WriteRegNoMask 
        void ReadDram 
        void ReadDram 
        void WriteDram 
        void WriteDram 
        void Vstrm_Out 
        void GetStatus 
        int CheckHW 
#endif 
        void ReadTLB 
        void WriteTLB 
        void RegDump 

        // Chip Initialization 
#ifdef _ECOS_ 
        void HwReset 
        void SwReset 
#endif 
        void Initialize 
        void InitReg 
        void InitTLB 

// Clock Setting 
void SetClock 
void PowerSave 

        // Video Input 
        void SetViControl 
        void SetViFilter 
        void SetViSource 
        void SetViTvFormat 
        BOOL SetViScaling 
        BOOL SetEncImgSize 
        void SetDecImgSize 

        // Codec Operation 
        void SetIPFrame 
        void SetAlgorithm 
        void EncFastUpdate 
        void SetEncVideoMode 
        void SetEncPolicy 
        void SetEncBitRate 
        void SetStatisticsCtl 
        void SetMBFresh 

        // Display Generation 
        void SetDeBlock 
        void SetPipSrc 
        void SetPipBorder 
        void SetPipPos 
        void SetPipScaling 
        void SetPipBitmapSize 
        void SetPipMirror 
        void MainMirror 
        void SetOSDCtl 
        void SetFrameBufSize 
        void SetDispScaling 
        void SetDispUpdate 
        void ManualUpdate 

        // Display Interface 
        void SetVoTvFormat 
        void SetRGBDAC 
        void SetDvOut 
        void SetDoubleImgSize 
        void SetPixelFetch 
        void SetDispTiming 
        void SetDispMode 
        void SetDispLayout 

        // Chip Operation 
#ifdef _ECOS_ 
        void SetOperationMode 
#endif  
        void SetHwIntLoop 

        // Member data retrievel 
        void GetDramSize 
        void GetClock 
        void GetViSource 
        void GetViControl 
        void GetViFilter 
        void GetViScaling 
        void GetEncImgSize 
        void GetDecImgSize 
        void GetIPFrame 
        void GetAlgorithm 
        void GetEncVideoMode 
        void GetEncPolicy 
        void GetEncBitRate 
        void GetStatisticsCtl 

        void GetDeBlock 
        void GetPipCtl 
        void GetMirror 
        void GetOsdCtl 
        void GetFrameBufSize 
        void GetDispUpdate 
        void GetVoCtl 
        void GetOperationMode 
        void GetHwIntLoop 

        void SetEncodeMode 
        void StartEncoding 
        void SetVideoFormat 
        void SetFrameRate 
        void SetEncQuality 
        void SetIFrameInterval 
        void ResetBuffer 
    }; 
     
    经过H.264和g.723.1/g.729压缩的视音频数据加上H.245控制经H.223合路,就可以实现串型码流的音频、视频、数据同时传输,Windows上的DirectX可以直接解码此音视频流数据。ecos库里带有H.264、MP4、MP3、G系列音视频编解码库,但软件运行太慢,即使DSP也显得芯片面积太大了,这里使用一小颗视音频编解码ASIC芯片。不过合路时的数据量仍然很大,对MCU速率有较高要求。 
    因为网络传输速率可变,所以需要实时调整视频源编码速率,以保证视频的连续实时,此时,要用到《第十讲 时间管理》里介绍的时间相关函数辅助计算编码速率,按照码源速率控制算法控制数据生成。 
    在访问一些临界资源时要采用《第十一讲 同步原语》介绍的同步函数进行控制。 
    好了,这只是ecos增值包的一个简单应用例子,介绍它的目的主要是让使用者明白文档中各章节的讲解是如何与实际项目联系起来的。以后再介绍行驶记录仪的方案、路由器方案、VPN/防火墙方案等。 
    总之,ecos是一个不错的平台,学习和使用ecos增值包很有益处。 
(本文引自www.mcujl.com/article.asp?conID=493)


---------------------------------------------------------------------------------------------------
[打印文章] [关闭本页] [返回顶部]
本网站部分资料转自网上,如有侵权请来信告明,我们会尽快删除  | 网站地图
Copyright @ 2007-2010 深圳单片机交流网.版权所有
网站创办者:詹长亮,周发辉,李林盛
网站支持:zcl843@163.com QQ:380476830 13723787271詹长亮