基于TMS320C62X DSP的混合编程研究
时间:07-12
来源:作者:蒋建国, 李福翠
点击:
根据运动矢量参数进行移位使其对准字访问的核心代码的程序为:
MVK .S2 0xFFFC,temp ;获得地址的LSB位
ADD .L1X pSrc,offset,pSrc ;参考块第一个元素的地址
AND .L2X pSrc,temp,tmp_pSrc ;字对准访问的地址
AND .S1 0x0003,pSrc,rshiftA ;用两个LSB位得
;到了需右移几个字
SUB .L1 0x04,rshiftA,lshiftA ;需左移几个字
MPY .M1 rshiftA,8,rshiftA ;需右移的#bit数
MPY .M1 lshiftA,8,lshiftA ;需左移的#bit数
作为一个说明C语言与汇编程序混合编程的设计例子,采用并行汇编实现了这个函数的优化。这里只给出部分汇编程序:
.text ;将该段汇编代码安排在.text
段,当然通过在C语言中用
#program_section也可以将其安排在其它自己命名的段中。
.global mc_case_a ;函数名,用.def或.gloal对其进行
声明,使得C代码调用该函数
_mc_case_a: ;标号,是C调用函数和汇编
被调用函数的接口处
……
.asg B10,ocsr
.asg B11,rw_4
STW .D2 ocsr,*stack--[1] ;被调用函数用到了B10~B15,A10
STW .D2 r_w4,*stack--[1] ;~A15的寄存器,则需对它们保护
MVC .S2 CSR,ocsr
AND .S2 -2,ocsr,ocsr
MVC .S2 ocsr,CSR ;关闭某些中断 ……
loop:
LDW .D2 *tmp_pSrc++[src_width1],r_w1
;读取第一个字
LDW .D1 *pSrc++[1],r-w2 ;读取第二个字
LDW .D1 *pSrc++[src_width2],r-w3 ;读取第三个字
SHRU .S2 r_w1,rshiftB, r-w1
SHL .S1 r_w3,lshiftA, r_w3
SHL .S2X r_w2,rshiftB,r_w4
SHRU .S1 r_w2,rshiftA, r_w2
OR .L2 r_w1,r_w4, r_w1
OR .L1 r_w1,r_w3,r_w2 ;这几步作了图a中的操作过程
STW .D2 r_w1,*pDst++[2]
STW .D1 r_w2,*tmpDst++[2] ;存储取得的两个字
B .S2 loop ;延迟跳转到标号loop处,实现循环 ……
LDW .D2T2 *++stack[1],r_w4
LDW .D2T2 *++stack[1],ocsr ;对被调用函数中自己保护的寄存器作恢复处理
MVC .S2 ocsr, CSR ;恢复中断环境
B .S2 B3 ;返回到调用函数处
……
在TI CCS上用其库函数CLOCK()对这个算法的C语言程序和并行汇编程序分别进行了性能测试。在纯C语言中,运动矢量对4的偏移量的余数为0 时,约为33个指令周期, 余数为1时约为93个指令周期, 余数为2 时约为 51个指令周期,余数为3 时约为 93个指令周期,平均约耗时 67个周期。而将其用并行汇编代码编写,其周期数恒定为33个指令周期。33个指令周期的执行时间,对于这个函数基本上是达到了函数的最大优化。
由此可见,程序的核心算法的代码用并行汇编程序编写,而主体的C语言程序则以函数调用的形式调用这些核心算法的并行汇编函数,是提高程序代码执行效率的一种有效方法。
参考文献
1 TMS320C6000 CPU and Instruction Set Reference Guide. Texas Instruments Incorprated,2000
2 TMS320C600 Programmer’s Guide. Texas Instruments Incorporated, 2001
3 MS320C6000 Optimizing Compiler User’s Guide. Texas Instruments Incorporated,2001
4 任丽香,马淑芬,李方慧. TMS320C6000系列DSPs的原理与应用.北京:电子工业出版社,2000.7
5 钟玉琢, 王 琪, 贺玉方.基于对象的多媒体数据压缩编码国际标准-MPEG-4及其校验模型.北京:科学出版社,2000
MVK .S2 0xFFFC,temp ;获得地址的LSB位
ADD .L1X pSrc,offset,pSrc ;参考块第一个元素的地址
AND .L2X pSrc,temp,tmp_pSrc ;字对准访问的地址
AND .S1 0x0003,pSrc,rshiftA ;用两个LSB位得
;到了需右移几个字
SUB .L1 0x04,rshiftA,lshiftA ;需左移几个字
MPY .M1 rshiftA,8,rshiftA ;需右移的#bit数
MPY .M1 lshiftA,8,lshiftA ;需左移的#bit数
作为一个说明C语言与汇编程序混合编程的设计例子,采用并行汇编实现了这个函数的优化。这里只给出部分汇编程序:
.text ;将该段汇编代码安排在.text
段,当然通过在C语言中用
#program_section也可以将其安排在其它自己命名的段中。
.global mc_case_a ;函数名,用.def或.gloal对其进行
声明,使得C代码调用该函数
_mc_case_a: ;标号,是C调用函数和汇编
被调用函数的接口处
……
.asg B10,ocsr
.asg B11,rw_4
STW .D2 ocsr,*stack--[1] ;被调用函数用到了B10~B15,A10
STW .D2 r_w4,*stack--[1] ;~A15的寄存器,则需对它们保护
MVC .S2 CSR,ocsr
AND .S2 -2,ocsr,ocsr
MVC .S2 ocsr,CSR ;关闭某些中断 ……
loop:
LDW .D2 *tmp_pSrc++[src_width1],r_w1
;读取第一个字
LDW .D1 *pSrc++[1],r-w2 ;读取第二个字
LDW .D1 *pSrc++[src_width2],r-w3 ;读取第三个字
SHRU .S2 r_w1,rshiftB, r-w1
SHL .S1 r_w3,lshiftA, r_w3
SHL .S2X r_w2,rshiftB,r_w4
SHRU .S1 r_w2,rshiftA, r_w2
OR .L2 r_w1,r_w4, r_w1
OR .L1 r_w1,r_w3,r_w2 ;这几步作了图a中的操作过程
STW .D2 r_w1,*pDst++[2]
STW .D1 r_w2,*tmpDst++[2] ;存储取得的两个字
B .S2 loop ;延迟跳转到标号loop处,实现循环 ……
LDW .D2T2 *++stack[1],r_w4
LDW .D2T2 *++stack[1],ocsr ;对被调用函数中自己保护的寄存器作恢复处理
MVC .S2 ocsr, CSR ;恢复中断环境
B .S2 B3 ;返回到调用函数处
……
在TI CCS上用其库函数CLOCK()对这个算法的C语言程序和并行汇编程序分别进行了性能测试。在纯C语言中,运动矢量对4的偏移量的余数为0 时,约为33个指令周期, 余数为1时约为93个指令周期, 余数为2 时约为 51个指令周期,余数为3 时约为 93个指令周期,平均约耗时 67个周期。而将其用并行汇编代码编写,其周期数恒定为33个指令周期。33个指令周期的执行时间,对于这个函数基本上是达到了函数的最大优化。
由此可见,程序的核心算法的代码用并行汇编程序编写,而主体的C语言程序则以函数调用的形式调用这些核心算法的并行汇编函数,是提高程序代码执行效率的一种有效方法。
参考文献
1 TMS320C6000 CPU and Instruction Set Reference Guide. Texas Instruments Incorprated,2000
2 TMS320C600 Programmer’s Guide. Texas Instruments Incorporated, 2001
3 MS320C6000 Optimizing Compiler User’s Guide. Texas Instruments Incorporated,2001
4 任丽香,马淑芬,李方慧. TMS320C6000系列DSPs的原理与应用.北京:电子工业出版社,2000.7
5 钟玉琢, 王 琪, 贺玉方.基于对象的多媒体数据压缩编码国际标准-MPEG-4及其校验模型.北京:科学出版社,2000
- Linux标准趋向统一(11-12)
- 巴西的新电视机顶盒采用意法半导体(ST)的最先进的解码器技术(03-24)
- 视频跟踪算法在Davinci SOC上的实现与优化(10-06)
- 展望未来 多核DSP技术不仅仅是小把戏(04-03)
- 嵌入式软件工程师必须知道的:volatile的作用(05-01)
- Linux 时钟管理(06-13)