EDN首页   博客首页

4

关于投票
usb转并口适配器问题
    目前,USB总线接口已经横扫了计算机外围接口,一统天下。在这种形势下,以前很多并口仿真器都被淘汰掉了,对于电子爱好者来说,这不是一件好事情,因为USB仿真器要比并口贵很多。

    我手头就有好几个并口下载线,例如单片机的、FPGA的都需要用到并口。所以我一直想自己DIY一个并口,通过USB扩展并口功能,这个东东也就是USB转并口适配器。目前市场上有这样的东西,但是基本都只支持打印机,支持并口的输出模式,但是双向通信就不行了。后来,我google了一把,发现了很多非常有用的东东,国外有两个开源站点,发布了适配器的设计:

1、http://www-user.tu-chemnitz.de/~heha/bastelecke/Rund%20um%20den%20PC/USB2LPT/index.html.en。该开源项目虚拟了一个并口,硬件实现很简单,基于ez-usb,该芯片内置了USB控制器,可以实现USB通信,另外内置了一个52单片机,可以虚拟并口行为。在PC端需要一个适配器的驱动,该驱动实现USB总线上虚拟并口,提供给应用程序一个虚拟并口。驱动程序采用DDK编写,所有材料都可以从该站点获取。

2、http://www.ixo.de/info/usb_jtag/。该开源项目没有虚拟并口,直接就是一个USB JTAG,可以作为FPGA的下载电缆使用。硬件部分也为一个ez-usb,实现USB通信,另外通过EPM7064完成JTAG时序。在驱动部分,可以直接采用quartus提供的usb驱动,当然在固件程序设计的时候需要与该驱动程序匹配。另外,该开源项目还支持其他的综合器。从效率上来讲,usb_jtag项目可能要好一点。目前,市面上有很多usb-jtag,很多硬件系统都十分相似,说不定都来源于此。

系统分类: 接口电路
用户分类: 无分类
标签: 接口电路
来源: 原创
发表评论 阅读全文(747) | 回复(0)

3

关于投票
嵌入式系统中内存管理方法

    内存管理在嵌入式系统中是一个比较重要的问题,如果处理不好内存资源的管理,那么系统的鲁棒性将会大大降低,更严重的话系统将会无法正常运行。过去我在DSP平台上开发过tcp/ip协议栈,遇到过此类情况,所以在此我想对嵌入式系统中的内存管理方法进行总结,重点说明为什么不能在嵌入式系统中应用malloc函数。

 

malloc在嵌入式系统中应用的问题

       在嵌入式系统中采用静态内存分配的方法比较可靠,但是,很多应用需要进行内存的动态分配。提起动态内存分配,大家不约而同的会想到malloc函数,该函数是C语言中定义的标准内存分配函数,一般的C语言编译器都会提供该函数,例如在嵌入式应用中常用的编译开发环境Keil CCCS以及ADS都会提供此类内存分配函数。

 

       编译器提供的malloc内存分配函数的实现基于堆算法。动态内存区域是一个堆空间,分配内存时总是从堆的头部向后查找,分配一块满足大小的一段空间,释放资源时检查是否可以与堆空间中的临近空闲资源合并成大块,如果可以合并,那么堆空间中的连续资源将会增加,否则将会产生一个新块链接在堆空间中的链表中。用于内存管理的堆空间链表示意如下图:

    在系统初始化时,动态分配的堆空间为一整块资源,随着内存资源的不断分配、释放,堆空间将会被不断切分,切分成很多细粒度的空闲块资源。当堆空间被切分成很多小块时,系统就不可能再为大块需求分配资源了。虽然细粒度的块聚合起来能够满足应用需求,但是,堆算法已经无能为力了,就会出现malloc分配失败的情况。

 

       从堆算法的本质出发,我们就可以认识到malloc在嵌入式系统中应用存在的问题。当系统长时间运行之后,内存资源将会变得越来越零散,运行之初大块的内存已经不复存在,可能只剩下很多小块的资源。所以在大块内存需求的情况下,系统将会出错,所以系统的鲁棒性将会随着系统运行时间的增长而下降。因此,在嵌入式应用中不建议使用malloc进行内存分配。

 

内存分配的堆算法参考程序:rar

 

小型嵌入式系统中的内存管理方法

       小型嵌入式系统中经常采用分块的内存管理方法。其思想比较简单,即将内存资源分成若干块,当需要内存资源时,获取一个块资源,使用完毕之后再将块资源释放,归还给系统。采用分块算法的一个问题是:如何确定块大小?因为系统中的应用对块大小需求不一样,如果块过大,那么利用率下降,如果块过小,那么无法满足分配需求。

 

       针对该问题,提出了块资源池的概念,每个池中的块大小都不一样。应用提出内存资源需求后,系统根据需求到合适的池中得到资源块;释放资源时,再将资源块释放到对应的池中。在实际的uc/os操作系统中,就采用了这种块资源算法的内存管理方法。虽然,分块算法在效率上不是十分高效,存在块内碎片,但是,对于简单、小型的嵌入式应用,这种管理算法已经足够了。

 

大型嵌入式系统中的内存管理方法

       目前,最有效的内存管理方法是虚拟内存技术,通过虚拟内存技术可以将逻辑内存和物理内存分开,程序运行在逻辑内存空间,对于每个任务而言都能看到一个很大的内存空间,逻辑内存和实际的物理内存通过页表进行动态映射。由于虚拟内存技术涉及到页表的映射查找,所以如果采用纯软件的手段,那么实现效率将十分低下,因此往往需要硬件的加速。这个硬件加速单元就是MMUmemory management unit),其本质上就是一个lookup table。因此,采用虚拟内存技术的嵌入式系统都需要CPU集成MMU,否则该套机制很难实现。

      

       关于虚拟内存技术的具体原理或者Linux中的实现可以查看其它文献,或者等待本站的后继Blog~~
 

系统分类: 嵌入式
用户分类: 嵌入式系统设计
标签: 嵌入式操作系统
来源: 原创
发表评论 阅读全文(368) | 回复(0)
总共 , 当前 /