打印

基于DSP的实时多任务嵌入式系统

[复制链接]
555|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Orchids|  楼主 | 2019-1-10 17:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于DSP的实时多任务嵌入式系统


1 引言
        随着电气化的不断发展,嵌入式系统的应用也在迅速的前进。作为嵌入式系统中的微控制器的基本含义是:在一块芯片上集成了中央处理单元、存储器、定时器\计数器及多种输入输出接口的比较完整的数字处理器。主要表现在直接面对控制对象,嵌入到具体的应用体中,能在现场可靠地运行,体积小,应用灵活,突出控制功能,特别是对外部信息的捕捉与丰富的I/O功能等。它的出现是大规模集成电路技术发展的产物。它广泛地应用于工业控制、通讯、智能化仪表等领域。而面向测控对象,嵌入到实际应用系统中,实现嵌入式应用的处理器称之为嵌入式系统。

      DSP 是针对实时数字信号处理而设计的数字信号处理器,由于它具有计算速度快、体积小、功耗低的突出优点,非常适合应用于嵌入式实时系统。自世界上第一片通用DSP 芯片TMS320C10 于1982年在美国TI公司产生以来,DSP 处理器便显示出强盛的生命力。短短二十多年,世界上许多公司便开发出各种规格的DSP 处理器,并使它们在通信、自动控制、雷达、气象、导航、机器人等许多嵌入式实时领域得到了广泛应用。现在数字信号处理器(DSP) 正越来越多地应用到各种场合。TMS320C28X系列的DSP 的低功耗特性,使得它特别适合于便携式设备。Flash 存储器具有功耗低、尺寸小且装配后可以编程的特性,也适合于便携式设备。目前Flash 存储器正在从单纯的EPROM 的替换件演变为许多电路系统中的不可缺少的组成部分。Flash 存储器已成为DSP 系统的一个基本配置,主要用来存放掉电后需要保存的数据。本文以TMS320C2812 和AT49BV162 为例介绍了DSP在嵌入式系统中扩展外部Flash 存储器的方法及其应用。

2 在嵌入式系统中的应用
        DSP/ BIOS内核是通过目标应用程序调用DSP/BIOS API来实现运行时间服务的。通常单个DSP/BIOS模块可以管理一个或多个相关种类的内核对象, 并可依据全局参量的设定来控制整个行为。一般来讲, DSP/BIOS可以归纳为:核执行线程, 硬件抽象, 设备独立I/ O, 内部线程通信和同步, 实时分析, 多系统服务六大功能类。本设计方案应用于铁路系统的运行,DSP作为整个系统设计中的核心,通过A/D转换器采集到的铁路上的制式、速度、频率等各种信息,利用DSP的快速数据处理功能对转换后的数字信息进行运算和判断,外加其控制功能和强大的扩展外部设备的功能把控制信号输出到前台的显示屏、打印机、控制台。这是DSP实时多任务内核在嵌入式系统中的一个应用实例。通过对火车运行系统进行从人工切换轨道制式到自动切换的技术改进,从而为火车提速打好基础。由于我国铁轨的建造制式繁多,在轨道切换时信息量较大,且这种变化由于铁路轨道的长短而不均匀改变。所以有必要在每一次制式信息改变的同时,DSP不但要进行制式的判断计算、控制信号的输出,还要对数据进行记录,而这种制式信息的记录不应随外界电压的变化而改变,因此就要用Flash进行存储数据。Flash记录的数据可供外部调用查看,也起到了黑匣子的作用。下面就介绍实时多任务中的一个方面如何在嵌入式系统的DSP外部进行Flash的扩展。

3 TMS320C2812 内部存储器的结构
      TI公司的TMS320C28X系列DSP 的内核为同一种CPU ,但是其内存与外围设备的配置不同。C28X存储器由三个独立的空间组成: 程序、数据和I/O 空间。不同的C28X器件其内存映象都为改进的哈佛结构,但片内存储器的大小和外部地址引脚数目不同。外部引脚及寄存器也影响内存的配置。TMS320C2812 的异步外设包括19根地址线、16根数据线和三根芯片选择线。三根芯片选择线映射到五个外部空间,分别是0、1、2、6、7区。区域0和区域1公用一根单独的芯片选择线,区域 6和区域 7公用一根单独的芯片选择线,每一个区域都可以对自己的等待状态、闸门信号设置和置位时间进行编程。每一个区域也能为是否扩展外设进行编程。可编程的等待状态、芯片选通和可编程的闸门时间使外部扩展寄存器和外围设备变得丰富多彩。如图1 所示。


图1 外围设备模块图表

对C2812 器件可以在外部总线上扩展外部存储器和Flash。其扩展外部内存的分页结构使得可以寻址多于64k 的空间。CPU 中的寄存器和相应的远寻址指令允许寻址程序空间的另外7 根地址线。而对数据空间的访问并不影响A 16~ A 22。各区域的物理地址如下:0x00 2000 Zone0,0x00 4000 Zone1,0x08 0000 Zone2,0x10 0000 Zone6,0x3F C000 Zone7。

4 TMS320C28X 与AT49BV162Flash 存储器的连接方法
   为了便于电路设计与调试, 选用ATMEL 公司的AT49BV162 系列Flash 芯片。因为AT49BV162和VC549一样同为3V 电源供电, 这就省去了数据和地址线的缓冲和电平变换, 所以Flash 器件选择了AT49BV162。Flash上电时处于读模式,外部命令可以使Flash处于编程或者擦除状态,Flash可以对每一个扇区进行保护。AT49BV162 的存储容量为16Mb, 提供两种类型字节传输模式,一种是16位的,可存储1,048,576 个字;另一种是8位的,可存储2,097,152个字。存储器可以分成71个扇区进行操作。还有CE和OE控制信号来避免其他线路上的干扰,这种使用单一电源来对芯片进行读取和编程的操作非常适合系统编程。为了增加芯片的灵活性,该Flash还包括了擦除等待和编程等待的功能,这一特点使擦除和编程在尚未完成读取和编程前一段的过程中被挂起,当READY/BUSY管脚或者是挂起位被置位时,继续执行。VPP提供了数据保护,当VPP的输入电压小于0.4V时,编程和擦除功能被禁止,当VPP的电压大于0.9V时,这些正常的功能才被允许。BYTE管脚控制Flash的数据结构,如果BYTE置为逻辑1,则Flash的数据结构是按字节传输,通过CE和OE来控制I/O0-I/O15的传输,否则按位传输。当CE和OE处于低电平,WE处于高电平时,AT49BV162可以像EPROM一样进行访问。存储单元地址里存储的数据由连接输出的地址线所决定。CE或者OE处于高电平时,输出则处于高阻状态。双重控制可以更有效的防止总线的竞争。如图2所示。

图2  Flash 模块图
Flash的地址线和DSP的地址线相连,Flash的数据线和DSP的数据线相连,DSP的ZONE2连到Flash的CE上来控制片选。这样内部数据可以存放在Flash里,当外部需要读取时,通过对Flash的读操作,再通过串口把数据发出去,这样不但减轻了内部存储空间的负荷,也保证了数据最大限度的存储。

5 AT49BV162 Flash 存储器的读写
    AT49BV162 是ATMEL 公司生产的Flash 存储器, 支持在系统编程。AT49系列的编程是一个简单的可重复的过程。将每种芯片的总存储量划分成为数个存储阵列(扇区),每次编程一个扇区。编程命令是一个3 总线周期指令。以两个解锁周期开始,紧接着一个编程建立命令, 最后是要编程的地址和数据。写完该地址和数据后,内置编程算法自动启动, 进行Flash 存储器编程。编程算法完成后, 进入读取数据状态。在这里通过DSP对Flash的控制完成对Flash的读写。用C语言完成如下:
5.1 对XINTF寄存器进行设置
XintfRegs.XTIMING2.bit.USEREADY = 0;   //XREADY unused
XintfRegs.XTIMING2.bit.XWRLEAD  = 1;   //LEAD   1  sysclock
XintfRegs.XTIMING2.bit.XWRACTIVE= 1;   //ACTIVE 2  syscolock
XintfRegs.XTIMING2.bit.XWRTRAIL = 1;   //HOLD   1  sysclock
XintfRegs.XTIMING2.bit.X2TIMING = 0;   // 1:1 lead/active/trial timing for Zone 2
XintfRegs.XTIMING2.bit.XSIZE = 3;   //XINTF bus width - must be written as 11b
XINTF的信号定时能协调外部特殊外设对信号时钟的要求,时间参数可以根据连接不同外设的区域来设置。
5.2 对Flash读写编程
unsigned int * ext_Flash = (unsigned int *) 0x100000; // address of Flash
void FlashWrite(unsigned int *Flashwtbuf,unsigned int start,unsigned int end)
{ unsigned int Flashwp;
for(Flashwp = start; Flashwp <= end; Flashwp++)
{     *(ext_Flash + Flashwp)=*(Flashwtbuf++) ;
}
}
void FlashRead(unsigned int *Flashrdbuf,unsigned int start,unsigned int end)
{ unsigned int Flashrp;
for(Flashrp = start; Flashrp <= end; Flashrp++)
{  *(Flashrdbuf++) = *(ext_Flash + Flashrp) ;
}
}

相关帖子

沙发
Orchids|  楼主 | 2019-1-10 17:41 | 只看该作者
基于DSP的实时多任务嵌入式系统

文档1.pdf

178.63 KB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

697

主题

993

帖子

4

粉丝