您的位置 首页 知识

关于DSP编程的几个关键问题

在实际通信应用中,一个突发之后,程序必须为下一个突发作准备。因此一般采用串口的DMA多帧方式进行发送,在中断处理程序中或停止发送或加载数据

1 McBSP(Multichannel Buffered Serial Port)串口运用DMA中的多帧(Multi-Frame)方法通讯的中止处理

在实践通讯运用中,一个突发之后,程序有必要为下一个突发作预备。因而一般选用串口的DMA多帧方法进行发送,在中止处理程序中或中止发送或加载数据。但在串口以DMA方法传输数据时却有一些问题要评论。首要DMA的传输同步事情应设为McBSP的传输事情即XEVT,这样一字节传输后会主动预备另一字节(McBSP的READY上升沿触发DMA传输)。中止发生时意味着一个块已传完,这时DMA 的使能主动封闭,McBSP的READY将一向坚持高状况。可是在下一次突发传输直接使能DMA时却发动不了传输(信任会有许多人遇到此类问题)。这是由于无法发生McBSP触发发动所需的READY上升沿。处理方法是在中止程序中先封闭McBSP的发送,使READY=0,随后在程序中发送使能DMA,再翻开McBSP的发送即可。如先翻开McBSP的发送后翻开DMA,也是不会作业的。由于McBSP的READY现已由0变到1了,无法再发生READY上升沿。

2 封闭DMA与封闭McBSP的差异

在通讯范畴,为了充分运用DSP的片上外设资源,常常运用DMA把从串口来的数据或要发的数据放入缓冲区,再处理。对DMA而言,只需其在数据缓冲区的指针指向了中止应发生的方位,就发生中止。但此刻最终一个数据仅仅进入了McBSP而并未真实宣布去,所以在传送完毕的中止程序中只能封闭DMA不能封闭McBSP。由于此刻McBSP的发寄存器DXR中还有一个字没有宣布。

3 McBSP串口装备的要害时序

主要是寄存器SPCR2 的装备:在坚持RRST、XRST、FRST各位为0的条件下,装备好其它串口操控寄存器。等候至少2个CLKR/T时钟以确保DSP内部的同步。

(1)能够向DXR装载数据或使能DMA。

(2)使能GRST(GRST=1)(假如需求DSP内部发生采样时钟)。

(3)使能RRST或XRST,留意此刻要确保SPCR中仅有此一位发生改动。

(4)使能FRST(FRST=1)(假如需求DSP内部发生帧同步)。

(5)等候2个R/T CLK时钟周期后,收或发端便会有用。

4 汇编言语程序中的变量

汇编言语程序中的共用变量应在文件中界说,如.def carry.汇编言语程序中运用的局部变量不需界说,可直接声明,例如 trn_num .word 00h。假如在两个asm文件中有两个都没有界说的同名变量,则编译程序会以为他们不是同一变量。在汇编程序的最初应有.mmregs宏句子。它一方面表明对默许界说的承认(ah,bh,trn等),另一方面能够对所用寄存器从头界说。如:

.mmregs

DMPREC .set 54h 界说DMA优先和使能寄存器地址在54h

DMSA .set 55h

DMSDN .set 57h

DXR10 .set 23h 界说串口1的发送寄存器地址在23h

5 ST1寄存器中CPL位的影响

CPL位是编译方式操控位,它表明在相对直接寻址时选用哪种指针。当CPL=0时,运用页指针DP;当CPL=1时,运用仓库指针SP。实践运用中二者没什么不同,但运用SP寻址的程序更易读。在程序中常常运用CPL=1。

6 指令的歧义

6.1 比较下面指令

STLM B,AR4 把bl内容送入寄存器AR4 (×)

STLM B,*AR4 把bl内容送入寄存器AR4(√)??

前者实践履行的是把bl内容送入一个体系用的缓冲区,后者也可用:

MVDM BL,AR4 把bl内容送入寄存器AR4 (√)?

其他易导致歧义的句子还有:

LD AR5,A 把AR5的内容送入寄存器A (×)

LDM AR5,A 把AR5的内容送入寄存器A(√)??

ANDM #0x107e,AR4;把#107e加到寄存器 AR4 (×)

ANDM #0x107e,*AR4; 把#107e加到寄存器 AR4 (√)???

仅对某些寄存器有用的指令:

MVDD * AR2+,*AR3+ 把以AR2为地址的内容拷入AR3的地址中

此类指令用作数据块搬移特别有用,但仅对AR2、AR3、AR4、AR5有用。

易错句子中对程序运转损害最大的是:

ST #0 (bsp0_out_sign)

;bsp0_out_sign 是一个变量名?(√)?

STM #0,bsp0_out_sign

;此句子被编译为STM #0,PMST或STM #0,IMR (×)

这种句子会导致程序运转中的随机毛病,且极难发现。

6.2 流水抵触

剖析以下程序:

STM to-dce-buff, AR4

LDM AR4,B

ADD A,B ;B=AR4+AL

MVDM BL,AR4 ;AR4=to-dce-buff+AL

实践上,上段程序得不到AR4=to-dce-buff+AL 的成果。这是由于DSP一般选用深度为3~6级的流水结构,发生了无法处理的抵触,所以它不能被正确履行。处理的方法是在赋值和引证之间刺进一条或几条其他的指令,或NOP句子即可。

7 汇编与C言语混合编程的要害问题

7.1 C程序变量与汇编程序变量的共用

为了使程序更易于接口和维护,能够在汇编程序中引证与C程序同享的变量:

.ref_to_dce_nun ,to_dte_num,_to_dce_buff,_to_dte_buff

在汇编程序中引证而在C程序可直接界说的变量:

unsigned char to_dte_buff[BUFF_SIZE];

//DSP发向PC机的数据

int to_dte_num; //缓冲区中寄存的有用字节数

int to_dte_store; //缓冲区的寄存指针

int to_dte_read; //缓冲区的读取指针

这样通过链接就可完结对应。

7.2 程序进口问题

在C程序中,程序的进口是main()函数。而在汇编程序中其进口由 .cmd 文件中的指令决议,如:-e main_start;程序进口地址为main_start。这样,混合汇编出来的程序得不到正确成果。由于C到ASM的汇编有默许的进口c-int00,从这开端的一段程序为C程序的运转做预备作业。这些作业包含初始化变量、设置栈指针等,相当于体系壳不能跨过。这时可在 .cmd文件中去掉句子:-e main_start。如仍想履行某些汇编程序,能够C函数的方式履行,如:

main_start(); //其间含有其他汇编程序

但条件是在汇编程序中把_main_start作为首地址,程序以rete结束(作为可调用的函数)的程序段,并在汇编程序中引证_main_start,即 .ref mainstart。

7.3 移位问题

在C言语中把变量设为char型时,它是8位的,但在DSP汇编中此变量仍被作为16位处理。所以会出现在C程序中的移位成果与汇编程序移位成果不同的问题。处理的方法是在C程序中,把移位成果再用0X00FF去与一下即可。

7.4 仓库问题

在汇编程序中对仓库的依靠很小,但在C程序中分配局部变量、变量初始化、传递函数变量、保存函数回来地址、维护暂时成果功用都是靠仓库完结。而C 编译器无法查看程序运转时仓库能否溢出。所以应尽量多给仓库分配空间。C编译器的默许巨细为1KB。在程序不正常跑飞时应留意查看是否仓库溢出。

7.5 程序跑飞问题

编译后的C程序跑飞一般是对不存在的存储区拜访形成的。首要要查.MAP文件并与memery map图比照,看是否超出规模。假如在有中止的程序中跑飞,应要点查在中止程序中是否对所用到的寄存器进行了压栈维护。假如在中止程序中调用了C 程序,则要查汇编后的C程序中是否用到了没有被维护的寄存器并供给维护(在C程序的编译中是不对A、B等寄存器进行维护的)。

8 指令文件的编写

在修改 .cmd文件时编译连接器默许:page 0便是ROM区,page 1便是RAM区。下列段有必要放在ROM区。

.text load=PROG PAGE 0 程序段

.const load=data PAGE 0 常数段

.cinit load=dtta PAGE 0 初始化段

.switch load=data PAGE 0 switch指令常数表

值得留意的是尽量不要用FILL选项,一旦进行填充会使生成的.out文件增大乃至超越内部的存储空间而无法Bootload。

9 Bootload问题

一般都选用从EPROM引导,但一般很费脑筋。下面介绍一下可为54X系列DSP内部引导程序辨认的EPROM存储结构,如表1所示。

倘若现已生成了 .out文件,生成时有必要带有芯片,此处为MS320VC5409,版别参数如:asm500 init_54x-v548)。

.hex文件与EPROM的存储空间相对应,其生成的参数由.cmd文件决议。下面以实例介绍.cmd文件中的参数编写及含义。

cdpd.out 将cdpd.out 文件转化成.hex文件

-SWWSR 7fffh 将外部设备的等候时间设为7个等候状况

-BSCR 0f800h 设置4K为一页,页面切换时刺进1个等候状况

-o cdpd.hex 转化成cdpd.hex文件

-i intel格局

-boot 把一切的程序块装入EPROM

-bootorg 8000h 从EPROM存储器的8000h处开端写入程序内容

-memwidth 8 体系数据宽度转为8位,以防止生成2个文件

-romwidth 8 ;EPROM数据宽度为8位

-e 0840h ;从0840h开端履行程序

-map wfcdpd.mxp ;生成EPROM存储器占用映射

这时生成的cdpd.hex能够直接写入EPROM。需求阐明320C5409的外部RAM规模是从8000h~FFFFh,所以设首地址为8000h。可是对C54X系列而言,其转化有个BUG,即它总是不能在0XFFFF处写入从外部EPROM存储器装载的开端地址,只好自己填入。对本例而言在0XFFFE处写0X80,在0XFFFF处写0X00。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/292891.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部