tms320lf2407--第一个具有控制功能的汇编程序
0赞
发表于 2011/5/20 19:23:14
阅读(9696)
之前介绍了TI的TMS320LF2407处理器,今天给出它的一个汇编程序。先给出汇编程序的主要原因是DSP2407这个处理器主频最高只有40M,频率较低,偏上资源也不是很丰富;而应用领域又是在工业方面对实时性要求较高的场合。因此有必要介绍下他的汇编编程。
下面是牛人总结的汇编语言的特点
了解和使用汇编语言有以下一些优点:
说明程序是如何与操作系统、处理器接口的;
说明数据是如何表示并存储在存储器与外部设备上的;
阐述处理器是如何访问与执行指令的,以及指令是如何访问与处理数据的;
阐述程序是如何访问外部设备的。
另外,使用汇编语言的理由是:
说明数据是如何表示并存储在存储器与外部设备上的;
阐述处理器是如何访问与执行指令的,以及指令是如何访问与处理数据的;
阐述程序是如何访问外部设备的。
另外,使用汇编语言的理由是:
能够直接访问与硬件相关的存储器或I/O端口;
能够不受编译器的限制,对生成的二进制代码进行完全的控制;
能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;
能够根据特定的应用对代码做最佳的优化,提高运行速度;
能够最大限度地发挥硬件的功能;
用汇编语言编写的程序比用高级语言编写的程序所要求的存储空间与执行时间将显著减少;
汇编语言使程序员可以完成技术性非常强的任务;而使用高级语言,即使可能做到,恐怕也会非常困难;
虽然大多数软件专家是用高级语言开发新的应用软件的(那样做,程序会比较容易编写的维护),但是对于执行时间要求比较苛刻的部分,常常还要用汇编语言来重新编写;
常驻程序(当其他程序运行的时候,常驻在存储器中的程序)和中断服务例行程序(处理输入与输出的程序)几乎都是用汇编语言开发的。
汇编语言的缺点
能够不受编译器的限制,对生成的二进制代码进行完全的控制;
能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;
能够根据特定的应用对代码做最佳的优化,提高运行速度;
能够最大限度地发挥硬件的功能;
用汇编语言编写的程序比用高级语言编写的程序所要求的存储空间与执行时间将显著减少;
汇编语言使程序员可以完成技术性非常强的任务;而使用高级语言,即使可能做到,恐怕也会非常困难;
虽然大多数软件专家是用高级语言开发新的应用软件的(那样做,程序会比较容易编写的维护),但是对于执行时间要求比较苛刻的部分,常常还要用汇编语言来重新编写;
常驻程序(当其他程序运行的时候,常驻在存储器中的程序)和中断服务例行程序(处理输入与输出的程序)几乎都是用汇编语言开发的。
汇编语言的缺点
虽然汇编语言有诸多的优点,同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:
编写的代码非常难懂,不好维护;
很容易产生Bug,难于调试;
只能针对特定的体系结构和处理器进行优化;
开发效率很低,时间长且单调。
很容易产生Bug,难于调试;
只能针对特定的体系结构和处理器进行优化;
开发效率很低,时间长且单调。
现在开始:
首先是cmd文件,对内存进行分段。TMS320LF2407有544字节的DRAM,2K字节SRAM,32K字节flash存储器;并指定程序的各部分的存储位置。
MEMORY
{
PAGE 0 : VECS : origin = 0h , length = 040h /* VECTORS */
ENCPT : origin = 40h , length = 4 /* 用于2407A 的加密字 */
PROG : origin = 44h , length = 0FFC0h /* PROGRAM */
{
PAGE 0 : VECS : origin = 0h , length = 040h /* VECTORS */
ENCPT : origin = 40h , length = 4 /* 用于2407A 的加密字 */
PROG : origin = 44h , length = 0FFC0h /* PROGRAM */
PAGE 1 : MMRS : origin = 0h , length = 060h /* MMRS */
B2 : origin = 0060h , length = 020h /* DARAM */
B0 : origin = 0200h , length = 0100h /* DARAM */
B1 : origin = 0300h , length = 0100h /* DARAM */
DATA : origin = 8000h , length = 8000h /* XDM */
}
B2 : origin = 0060h , length = 020h /* DARAM */
B0 : origin = 0200h , length = 0100h /* DARAM */
B1 : origin = 0300h , length = 0100h /* DARAM */
DATA : origin = 8000h , length = 8000h /* XDM */
}
/*--------------------------------------------------------------------*/
/* SECTIONS ALLOCATION */
/*--------------------------------------------------------------------*/
SECTIONS
{
.vectors : { } > VECS PAGE 0 /* Interrupt vector table */
.Encrypt : { } > ENCPT PAGE 0 /* 加密段 */
.text : { } > PROG PAGE 0 /* Code */
.data : { } > PROG PAGE 0 /* Initialization data tables */
.mmrs : { } > MMRS PAGE 1 /* Memory mapped registers */
.bss : { } > B2 PAGE 1 /* Block B2 */
.blk0 : { } > B0 PAGE 1 /* Block B0 */
.blk1 : { } > B1 PAGE 1 /* Block B1 */
.blk2 : { } > B2 PAGE 1 /* Block B2 */
.blk3 : { } > DATA PAGE 1 /* External data memory */
}
/* SECTIONS ALLOCATION */
/*--------------------------------------------------------------------*/
SECTIONS
{
.vectors : { } > VECS PAGE 0 /* Interrupt vector table */
.Encrypt : { } > ENCPT PAGE 0 /* 加密段 */
.text : { } > PROG PAGE 0 /* Code */
.data : { } > PROG PAGE 0 /* Initialization data tables */
.mmrs : { } > MMRS PAGE 1 /* Memory mapped registers */
.bss : { } > B2 PAGE 1 /* Block B2 */
.blk0 : { } > B0 PAGE 1 /* Block B0 */
.blk1 : { } > B1 PAGE 1 /* Block B1 */
.blk2 : { } > B2 PAGE 1 /* Block B2 */
.blk3 : { } > DATA PAGE 1 /* External data memory */
}
然后是主程序,对处理器进行初始话,最后进入无线循环。
.global start ; 定义全局标号
.text
start:
nop
LDp #4 ; 直接寻址,装载DP值,页指针指向片内数据区DARAM B0
SPlk #1,1 ; 绝对地址201H开始的四个单元存1,2,3,4
Splk #2,2 ;
Splk #3,3 ;
Splk #4,4 ;
Splk #7,AR3
Splk #300h,AR1
; 以下使用间接寻址将201H开始的4个单元的数
; 转存到300H开始的4个单元
lar ar0,#201h ; 源起始地址存在辅助寄存器0
lar ar1,#300h ; 目的起始地址存在辅助寄存器1
lar ar2,#3 ; 循环计数值为移动数-1
mar *,ar0 ; 设置当前辅助寄存器为ar0
loop1: ; 开始循环搬移数据
lacc *+,ar1 ; 将当前辅助寄存器(ar0)所指向的数据内存单元的值装载到acc
; ar0加1,设置当前辅助寄存器为ar1
sacl *+,ar2 ; acc低16位存放到当前辅助寄存器(ar1)指定的单元
; ar1加1,设置当前辅助寄存器为ar2
banz loop1,ar0 ; 当前辅助寄存器(ar2)如果不等于0则
; 当前辅助寄存器(ar2)减1,转loop1
xh:
b xh ; 空循环
.end
这是一个最小的可以运行的程序实例,完整的程序还需要中断矢量表以及寄存器定义等。这些将在后面详述。
.text
start:
nop
LDp #4 ; 直接寻址,装载DP值,页指针指向片内数据区DARAM B0
SPlk #1,1 ; 绝对地址201H开始的四个单元存1,2,3,4
Splk #2,2 ;
Splk #3,3 ;
Splk #4,4 ;
Splk #7,AR3
Splk #300h,AR1
; 以下使用间接寻址将201H开始的4个单元的数
; 转存到300H开始的4个单元
lar ar0,#201h ; 源起始地址存在辅助寄存器0
lar ar1,#300h ; 目的起始地址存在辅助寄存器1
lar ar2,#3 ; 循环计数值为移动数-1
mar *,ar0 ; 设置当前辅助寄存器为ar0
loop1: ; 开始循环搬移数据
lacc *+,ar1 ; 将当前辅助寄存器(ar0)所指向的数据内存单元的值装载到acc
; ar0加1,设置当前辅助寄存器为ar1
sacl *+,ar2 ; acc低16位存放到当前辅助寄存器(ar1)指定的单元
; ar1加1,设置当前辅助寄存器为ar2
banz loop1,ar0 ; 当前辅助寄存器(ar2)如果不等于0则
; 当前辅助寄存器(ar2)减1,转loop1
xh:
b xh ; 空循环
.end
这是一个最小的可以运行的程序实例,完整的程序还需要中断矢量表以及寄存器定义等。这些将在后面详述。