TMS320C24x的C语言与汇编语言的接口技术
C语言与汇编语言的接口技术在DSP芯片中的应用
按照 c 语言 的规定 , 的参数是按从右 到左的次序压 函数
栈的。在 C 4 2x中函数 的返 回值存放在累加器 A C中。 C 对软 件栈 的维护是 函数 互调的关键 。函数 的参数 是通 过软 件栈传递 的, 函数的 出 口地址存 放在 软件栈 里, 函数用
可以由用户 自由决定其用途 。
2 3 函数 调 用 约 定 .
程, 这样就能够 做到 既 满足 实 时性要 求又 能实 现所需 的功 能, 同时兼顾 程序的可读性和编程效率 。
1 C语言与汇编语言接 口的基本方式
1 1 在 c语言 中嵌入汇编语句 . C 4 的 c语 言 也支持 am指令 , 2x g 可以用这条指令将一行 汇编代码嵌入 c程序 中。可是这样做要担很大的风险 , 些 这
汇 编代码很有可 能破 坏原来 的 C语 言环境 。在 绝大多数情
C语言 函数调用有一套严格 的规则 , 要实现 汇编语 言模 块 和 C语言模块之 问函数 的互相调用 , 必须遵从这些规则 。
况下 , 并不推荐用 这种方 式 , 但有 一种情况 例外。在 汇编语 言 中开 中断用 se N M 而 在 c e T , tI 语言 中却找不到简单而有效
语 言模块调用 。但 用户必 须 遵循相关 协议 自行 维护模块 的
人/ 口代码 , 出 管理堆栈。
2 C语 言 与 汇 编语 言接 口约 定
用步骤如下 :1在 主调 函数 的局 部帧后 将被调 函数的参 数 () 依次压栈 ; ) ( 程序指 针 (c 跳转到 被调 函数 的代码段 ;3 2 P) ()
一
主 第
TMS320C24x
Ke wor TM 32 C2 y ds 0 4x, l ngu e, s e bl a C a ag a s m e l ngu ge,nt r a e a i e f c
1 引 言
TMS 2 C 4 ( 3 0 2 x 以下 简 称 C 4 ) 美 国 TI 司 2x 是 公
种 典 型 应 用 实例 。 关键词 TM 3 0 4 C 语 言 汇 编 语 言 接 口 2 C2 x
I er ac nt f e Tec n ogy h ol ,ofC and As em bl s e Lan age f gu or TM S3 0 2 x 2 C 4
能 满 足要 求 。 用 这 种 方 法 时 , 户 必 须 遵 循 相 关 协 使 用
对 C2 x的 软 件 开 发 , 以 用 汇 编 语 言 , 可 以 4 可 也 用 C 语 言 实 现 。 作 为 一 种 低 级 语 言 , 编 语 言 的代 汇 码 执 行 效 率 高 、 行 速 度 快 , 以 充 分 发 挥 DS 运 可 P处
d ve op ng c e l i ont o pr r m s of T M S3 C24 rl og a 20 x. I t s ap r, i e f c a nd c nve i of n hi p e nt r a e w ys a o ntons t s t o he e w pr r m l ngua s r pr o e , a s ve al ypia e m pls og a a ge a e op s d nd e r t c l xa e usng hi i e f c i t s nt r a e tc e hnol gy ar o d d. o e pr vi e
DSP技术 第5章 TMS320C54x DSP的汇编语言程序设计
A B T FRCT
指令执行前 00 0000 1000H 00 0000 0000H
0400H 1
A B T FRCT
指令执行后 00 0000 1000H 00 001A 3800H 0400H 1
【例13】 MACR *AR3+,*AR4+,A,B
A B T FRCT AR3 AR4 数据存储器 0100H 0200H
表5.8 乘加和乘减指令
【例11】 MAC #345H,A,B
A B T FRCT
指令执行前 00 0000 1000H 00 0000 0000H 0400H 0
A B T FRCT
指令执行后 00 0000 1000H 00 000D 2400H 0400H 0
【例12】 MAC #345H,A,B
表达式可以是常数、符号,或者是由算术运算符 分开的一系列常数和符号。
有效表达式的值: -32 768~32 767 影响表达式的主要因素:
① 圆括号( )。圆括号内的表达式最先计算; ② 优不先能级用。大’括C号5{4x}汇或编中器括使号用[ ]代与替C语圆言括相号似( 的)。优
先级,优先级高的先计算;
0101H 0201H
DSP常用汇编语言指令简介
5. 控制指令举例
Example1:BIT0h,15 ;(DP = 6)把内存地址=300h 单元内容的最低位(BIT0)送给TC。 Example2:LDP #0h;使用立即数方式装载 数据页,也可以采用直接寻址和间接寻址方式装 载。 Example3:PUSH ;把累加器的低16位压入堆 栈。 Example4:SETC C;置进位C=1,也可以设置 以下的控制位为1或者为0,例如:CNF、INTM、 OVM、SXM、TC和XF。类似的指令还有: CLRC。
2. 工作寄存器等指令举例
Example4:ADRK #80h ;把当前工作寄存器内容 加一个立即数80h(注意立即数范围:00~FFh)。类 似的指令还有SBRK。 Example5:BANZ指令使用举例。例: MAR *, AR0 ;当前ARP=AR0 LAR AR1, #03h ;AR1内容赋值为03h LAR AR0, #60h ;AR0内容赋值为60h ZAC ; 累加器ACC清零 loop: ADD *+, AR1 ;把当前工作寄存器AR0指向 的内存单元数值加到ACC,然后AR0内容加1,当前工 作寄存器指针指向AR1 BANZ loop, *-AR0 ;判断AR0是否为0,否则程序 转到loop,同时AR0的内容减1。 南航自动化学院DSP技术应用实验 返回到第10页 室
南航自动化学院DSP技术应用实验 室
1. 累加器等指令举例
Example 1:ADD 1,1;(假设DP = 6),把 第6个数据页的第一个内存单元内容左移一 位加到累加器 Example 2:LACC *,4; (与SXM有关) Example 3:ROL;把累加器内容循环左移 Example 4:SACL *,0,AR7 ;把当前工作寄 存器指示内容左移0位送入累加器的低8位 Example 5:RPT #15 SUBC * ;累加器减去当前寄存 器指的内容,连续减16次,结果存累加器
TMS320LF240x MCU 附带的 C 语言和汇编语言代码使用入门spra755a
Contents 1 2 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Hardware Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2.1 LF2407 EVM Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2.2 eZdspE LF2407 Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Using the Code Composer GEL File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Overview of the Example Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Assembly Language Example Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 C Language Example Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
DSP技术 第6章 TMS320C54x DSP的CC++程序设计
2017年12月7日
DSP原理及应用
18
C语言数据结构
例如:
#define OK 0
均会以0代替
//定义符号常量OK,在程序中出现OK时 //定义符号常量ERROR,在出
#define ERROR -1
现ERROR时均会以-1代替
宏定义命令#define不是C语言的语句,因此不能 以分号结束。另外,预处理程序对符号常量的处理只是 简单的替换,不做语法检查。所以符号常量不占用存储 器的位置。
2017年12月7日 DSP原理及应用 9
下面是一般C语言程序的结构和组成框架。
//#include 包含语句定义程序中使用的函数库对应的 .h头文件 #include “函数库1” #include <函数库2> #include “函数库3” … //#define 定义程序中所有的宏替换 #define 宏替换名 替换内容 … //如果函数调用在函数定义之前,需要对函数进行声明 函数类型 函数名 (函数参数列表); …
#define NUMBER 1
2017年12月7日
DSP原理及应用
21
C语言数据结构
使用const关键字来定义整型常量、字符常量和字 符串常量。例如: const int Port1=0x0; //定义整型常量port1,并将其
初始化为0x0
const unsigned char s1=‘a’; //定义字符常量s1,
2017年12月7日
DSP原理及应用
27
C语言数据结构
例如: char m; short n; int p; long q;
等效于signed char m; 等效于signed short n; 等效于signed int p; 等效于signed long q;
TMS320C3X的汇编语言和C语言及混合编程技术
C 语言程序:
EXTERN FLOAT SINE[ ] %外部变量 FLOAT * PSIN= SINE; %设置一 指向此变量的指针 FlLOAT F; %定义一浮点变量 F F = PSIN[ 1] ; %F 的值为 1. 2
2. 3 函数
C 语言调用汇编语言定义的变量和函数 ( 1) C 语言调用定义在静态数据段 . BSS 的变量或
在编译时对每一变量的操作调整页面指针dp在编译时应用cl30编译器的mb可选项在连接时应用rts30l语言中定义了全局浮点变量语言中可按如下调用ldp在汇编外部变量externfloatsinefloat设置一指向此变量的指针flloat语言中可采用asm语句在线插入一行汇编语言在线汇编提供了能直接读写硬件的能力如读写中断控制允许寄存器等编译器并不检查和分析在线汇编语言插入在线汇编语言改变汇编环境或可能改变寄存器的使用编译器使用了部分寄存器作为保留寄存器汇编语言程序在使用这些寄存器之前应保留这些寄存器的返回时应恢复这些寄存器的值
C 源程序 . C 文件 ∋ Ac30 语法检查 ∋ Opt30 优化 ( 生成 . IF 文件 ) ∋ Cg30 汇编代码产生 , ( 生成 . ASM 文件 ) ∋ Asm30 编译生成目标文件 , ( 生成 . OBJ 文件 ) c 库文件 RTS30. LIB ∋ ∋ Rom30 转换为十六进制文件 图 1 C 语言开发 TMSC320C31 程序的过程
X( i ) H ( N - i)
∋
STF R2, Y %存储结果 B TOP %跳 转到 TOP 处 , 计算下一点
Lnk30 生成可执行文件 ( 生成 . OUT 文件 )
TMS320C3X 的许多 特点特别 适用 FFT 运 算。其 浮点运算能力防止整数运算的溢出问题、 操作数的调 整问题等。当 FFT 的数据以正常的次序传送 , FFT 的 最后结果次序是二进制位翻转次序, 为恢复变换的数 据存储 器 的 数 据 需 要交 换 , 对 这种 重 新 排 列, TM SC320C3X 不需要花费附加的周期 , 应用位翻转寻址方 式就可以 以正确 的次序 存取 FFT 的 变换 结果。 TM SC320C3X 强大的间接变址寻址方式可以方便地存取 FFT 蝶式迭代中的数据。应用块重复指令可大大减少 循环所花费的时间。限于篇幅不给出 FFT 变换的汇编 源程序。表 1 给出了 TMSC320C31 执行 FFT 所需要的 时间。
第4章 TMS320C54x汇编语言程序设计PPT课件
2020/8/17
6
⑤ 程序中注释是可选项。如果注释在第一列开始时,前面必 须标上星号“*”或分号“;”,在其他列开始的注释前面必须 以分号“;”开头;
⑥ 如果源程序很长,需要书写若干行,可以在前一行用反斜 杠字符(\)结束,余下部分接着在下一行继续书写。
2020/8/17
7
1.标号 所有汇编指令和大多数汇编伪指令都可以选用标号,供本程序或 其它程序调用。使用标号时应注意: ① 标号必须从语句的第1列写起,标号后可附加冒号“:” ;
2020/8/17
20
【例】 有效定义的表达式。
label1
label2 X goodsym1 goodsym3 goodsym4
.data .word .word .word .word .set .set .set .set
0 1 2 3 50h l00h + X label1 label2-label1
2020/8/17
23
4.2 堆栈的使用方法
当程序调用中断服务程序或子程序时,需要将程 序计数器PC的值和一些重要的寄存器值进行压栈保 护,以便程序返回时能从间断处继续执行。
’C54x提供一个用16位堆栈指针SP寻址的软件 堆栈。
当向堆栈中压入数据时,堆栈是从高地址向低地 址方向填入,堆栈指针SP先减1,然后将数据压入堆 栈。
2020/8/17
10
指令:
❖算术运算指令 ❖逻辑运算指令 ❖程序控制指令 ❖装入和存储指令
2020/8/17
11
伪指令
伪指令为程序提供数据、控制汇编过程。 伪指令在汇编时,不产生目标代码。
2020/8/17
12
3. 操作数
操作数是指指令中参与操作的数值或汇编伪指令定义的内容, 紧跟在助记符的后面,由一个或多个空格分开。
第五章 TMS320C54x DSP的汇编语言程序设计
二、汇编语言中的常数和字符串
常数、字符串和符号是汇编器能识别的数据项 ,是汇编指 令、伪指令和宏指令语句中操作数的基本组成部分。
1. 常数
◆ 汇编器支持6种类型的常数:二进制数、十进制数、八进制 数、十六进制数、字符常数和浮点常数。
2. 字符串
◆ 字符串是由双引号( “ ”)括起来的一 串字符 ,双引号是 字符串的一部分 。串的最大长度是变化的 ,并由每一个使 用字符串的伪指令定义 。字符串与字符常数不同 ,字符常 数代表一个单独的整数值 ,而字符串是字符的列表 。如: “simple ”。
首都师范大学信息工程学院
22
5 .4 汇编器
三、常用汇编伪指令 ◆ TMS320C54x DSP伪指令给程序提供数据和控制汇编过程。
◆ 具体实现以下任务:
(1)将数据和代码汇编进特定的段。 (2) 为未初始化的变量保留存储器空间。 (3)控制展开列表的形式。
(4)存储器初始化。 (5)汇编条件块。
操作
并行存储和相加/减 、并行存储和相乘 、其他加载和存储指令
首都师范大学信息工程学院
14
5 . 2 汇编语言的指令系统
一、指令系统中的符号和缩写 指令和操作码中的符号和缩写。
二、算术运算指令
算术运算指令可分为加法指令、减法指令、乘法指令、 乘加指令、乘减指令、双操作数指令和专用指令。 三、逻辑运算指令
NOP指令 ,还没有操作数。 4. 注释项 ◆ 注释项用来说明一条、几条指令或一段程序的功能 ,可以帮助用
户更快地理解程序 。对于编程者 ,应该重视注释的书写。 ◆ 注释从分号(; )开始 ,可以放在指令或伪指令的后面 ,也可以单
独占一行或数行。
首都师范大学信息工程学院
附录 TMS320C54X汇编语言指令系统
指令系统TMS320C54x指令系统共有指令130条,由于操作数的寻址方式不同,派生至205条。
按指令的功能,可以将C54x指令系统分成4类:算术运算指令、逻辑运算指令、程序控制指令、加载和存储指令。
下面分别对各类指令进行介绍。
Ⅰ、算术运算指令算术运算指令分为加法指令(ADD),减法指令(SUB),乘法指令(MPY),乘加指令(MAC),乘减指令(MAS),双数/双精度指令(DADD,DSUB)和特殊操作指令(ABDST,SQDST)。
1.加法指令加法指令共有13条,如表1.1.1所示。
表1.1.1 加法指令整数分有符号数和无符号数两种格式,表示有符号数时,其最高位表示符号,最高位为0表示其为正数,1表示为负数;无符号数其最高位仍做为数值位计算。
例如,有符号数能够表示的最大的正数为07FFFh,等于32767,而0FFFFH表示最大的负数–1;无符号数不能表示负数,它能够表示的最大的数为0FFFFh,等于十进制数的65535。
小数符号和上面整数的表示一样,但必须注意如何安排小数点的位置。
2.减法指令减法指令共有13条,见表1.1.2所示。
表1.1.2 减法指令3.乘法指令乘法指令共有10条,见表1.1.3。
表1.1.3乘法指令续表4.乘加和乘减指令乘加和乘减指令共有22条,见表1.1.4所示。
表1.1.4 乘加和乘减指令续表5.双操作数指令双操作数指令共有6条,见表1.1.5所示。
表1.1.5双操作数指令续表6.特殊应用指令特殊应用指令共有15条,见表1.1.6所示。
表1.1.6 特殊应用指令续表Ⅱ、逻辑运算指令逻辑运算指令包括与指令(AND),或指令(OR),异或指令(XOR),移位指令(ROL)和测试指令(BITF)。
1.与指令与指令共5条,见表2.2.1。
表2.2.1与指令2.或指令或指令共5条,见表2.2.2。
表2.2.2 或指令3.异或指令异或指令共5条,见表2.2.3。
表2.2.3 异或指令4.移位指令移位指令共6条,见表2.2.4。
TMS320C3xDSP的C和汇编语言混合编程及中断的C语言实现
1— 234(5 1— 234("
- 74U1V H G Q T ?@%( 6 ! 系统堆栈 ! 6 - 7W7X/XH G Q T ?@%5 6 ! 动态存储器 ! 6 ’- ’ ) 语言中断服务程序 ) 中断程序采用一个特殊的函数名,其格式为 如: 1— 23433 C 其中 33 代表 (( ! PP 之间的两位数, 1— 234(5 就是一个有效的中断函数名。 1— 234(( 是 ) 程 序的入口点, 它是专为系统复位中断保留的, 这个特 殊的中断程序用于系统的初始化和调用 XU23 Y Z 函 数。中断服务子程序与其他的函数类似,因为它可 以有局部变量和全局变量, 但是在说明中断程序时, 不能传递参数。 下面是一个 )’( 中断程序的例子 C 其 功能为采用中断方式从串行口 ( 输入一个样值,并 将这个样值从串行口输出。 9;2< 1— 234(# Y Z 6 ! 定义中断子程序 ! 6 G 234 <U4U [ 23<U4U J RE— @++ \ (*K) ] [ 6 ! 串行口输入 ! 6 RE— @++ \ (*KO ] J <U4U [ 6 ! 输出至串行口 ! 6 Q 需要说明的是: 上述程序中的: RE— @++ 为 R 6 E 口的起始地址。
! "# !
《国外电子元器件》 "$$" 年第 # 期
"$$" 年 # 月
编程序也可以调用 % 函数或访问 % 程序中定义的变 量。以下是互相访问变量的编程实例。 例 &: 在 % 程序中访问 ’()) 定义的汇编程序变量: 汇编程序: ’ ()) ’ ./0(+/ % 程序: 1231,4
汇编语言与C语言的接口技术
汇编语言与C语言的接口技术王有远 戴红星Interface Technique between Assembly Language and C LanguageWang Youyuan Dai Hongxing汇编语言没有高级语言要占用较大的存储空间和较长的运行时间等缺点,它的运行速度快是高级语言所不能比拟的。
可以说高级语言与汇编语言各有千秋。
有时我们采用高级语言编程速度达不到要求,全部采用汇编语言编程工作量又大,此时可以采用 混合编程,彼此相互调用,进行参数传递,共享数据结构及数据信息,是一种有效的编程方法。
这种方法可以发挥各种语言的优势和特点,充分利用现有的多种实用程序、库程序等使软件的开发周期大大缩短。
1 高级语言与汇编语言的接口需要解决的问题1、需要说明和建立调用者与被调用者间的关系被调用的过程或函数应预先说明为外部类型,如汇编子程序,应用PUBLIC说明其可被外部模块引用;调用程序则应预先说明要引用的外部模块名。
2、参数传递问题在汇编子程序之间通常采用寄存器作为参数传递的工具,汇编语言与高级语言程序间的参数传递,一般采用堆栈来传递,即调用程序将参数依次压入堆栈中,当被转调用程序后,再从堆栈中依次弹出参数作为操作数使用。
为此,必须了解各种语言的堆栈结构、生成方式和入栈方式等。
BA SIC、FORTRAN、PASCAL等语言其参数进栈顺序是与参数在参数表中出现的顺序相同,即从右到左;而C语言则相反。
2 C语言与汇编语言的接口2.1 C语言调用汇编子程序!在C程序中使用关键字 extern对函数作显式说明。
!参数传递顺序是按其在参数表中出现的顺序的反序被压入堆栈中,即第一个参数最后进入堆栈,它在栈中的地址最低。
!对不同的存储模式(极小、小、紧凑、中、大和巨)要选用不同的汇编语言格式,如C程序为小模式,汇编用近过程, C程序为大模式,汇编用远过程。
!汇编程序取C的参数。
远过程返回地址占四个字节, BP压入占二字节,所以第一个参数在B P+6所指向的单元。
第4章 TMS320C54x汇编语言程序设计
3.表达式 1) 运算顺序 影响表达式运算顺序的三个主要因素是:圆括号、 优先级和同级运算顺序。 圆括号内的表达式最先运算,不能用{ }或[ ]来代 替( )。 TMS320C54x汇编器的优先级使用与C语言类似, 优先级高的运算先执行。 表4-1给出了表达式中可用的 运算符及优先级。
TMS320C54x汇编语言程序设计 第4章 TMS320C54x汇编语言程序设计
TMS320C54x汇编语言程序设计 第4章 TMS320C54x汇编语言程序设计
2.常数初始化伪指令 常数初始化伪指令如表4-4所示。
TMS320C54x汇编语言程序设计 第4章 TMS320C54x汇编语言程序设计
表4-4 常数初始化伪指令
伪指令 句 法 保留确定数目的位 保留确定数目的位 初始化一个或多个字节 将单个值放入当前字的指定位域 设置16位无符号整型量 设置16位带符号整型量 作 用
TMS320C54x汇编语言程序设计 第4章 TMS320C54x汇编语言程序设计
1.标号 所有指令或大多数伪指令前面都可带有语句标号, 供本程序的其他部分或其他程序调用。标号是任选项, 标号后可以加也可以不加冒号(:)。标号必须从第一列 开始,其最多可长达32个字符(A~Z,a~z,0~9,_ 和$),但第一个字符不能是数字。引用标号时,标号 $) 的大小写必须一致,标号的值就是段程序计数器(SPC) 的当前值。若不用标号,则第一个字母必须为空格、 分号或星号(*)。
TMS320C54x汇编语言程序设计 第4章 TMS320C54x汇编语言程序设计
2.符号 符号用作标号、常数和替代符号。符号名可以是 长达200个字符的字母(A~Z,a~z)、数字(0~9)加上$ 或下划线(_)。第一个字符不能是数字,符号中间不能 有空格。符号分大小写,例如:Abc。
第5章TMS320C54x的汇编语言程序设计基础资料
2020年10月9日
DSP原理及应用
14
第5章 TMS320C54x的汇编语言程序设计 基础
5.2.1 COFF文件的基本单元
1. 段(sections)
5.1 汇编语言程序的编辑、汇编、链接过程
3. 链接
所谓链接,就是利用’C54x的链接器LNK500 ,根据链接器命令文件(.cmd)对已汇编过的一个或 多个目标文件(.obj)进行链接,生成输出文件 (.out)和存储器映像文件(.map) 。
常用的汇编器命令:
lnk500 %1.cmd
l%n1k.5c0m0d: 调 链用 接链 命接 令器文命件令名,该文件须指明目标文件、 输入文件、输出文件、链接选项和存储器配置要求等。
2020年10月9日
DSP原理及应用
20
第5章 TMS320C54x的汇编语言程序设计 基础
5.2.2 汇编器对段的处理
1. 未初始化段 未初始化段就是在’C54x存储器中的保留空间
,通常将它们定位在RAM区。 在目标文件中,这些段中没有确切的内容。 由这些段定义的空间仅作为临时存储空间,在
程序运行时,可以利用这些存储空间存放变量。 未初始化段分为默认的和命名的两种,分别由
链接器的任务:即分配存储单元,将目标文件中的段重 新定位到目标系统的存储器中,这一过程称为定位或分配。
2020年10月9日
DSP原理及应用
18
第5章 TMS320C54x的汇编语言程序设计 基础
3. 段与目标存储器的对应关系
目标文件中的段与目标存储器之间的关系
TMS320C24x的C语言与汇编语言的接口技术
TMS320C24x的C语言与汇编语言的接口技术
张文荣;潘俊民;邹勇波
【期刊名称】《微处理机》
【年(卷),期】2002(000)003
【摘要】对于TMS320C24x的控制程序的开发,采用C语言和汇编语言混合编程具有较高的效率.本文阐述了两种语言的接口方式和接口协议,并给出了采用这种接口技术实现混合编程的几种典型应用实例.
【总页数】3页(P30-32)
【作者】张文荣;潘俊民;邹勇波
【作者单位】上海交通大学信息与控制工程系,上海,200030;上海交通大学信息与控制工程系,上海,200030;上海交通大学信息与控制工程系,上海,200030
【正文语种】中文
【中图分类】TP3
【相关文献】
1.C语言与汇编语言的接口技术在DSP芯片中的应用 [J], 李润霞
2.汇编语言与C语言混合编程的接口技术 [J], 金微
3.关于汇编语言和C语言接口技术的研究 [J], 葛建梅
4.汇编语言与C语言的接口技术 [J], 杨红强;卢树强
5.汇编语言与C语言的接口技术 [J], 杨红强;卢树强
因版权原因,仅展示原文概要,查看原文内容请购买。
运用TMS320C54x汇编语言编写定点数运算、浮点数运算程.
一、定点数的运算在定点 DSP 芯片中,采用定点数进行数值运算,其操作数一般采用整数来表示。
一个整数的最大表示范围取决于 DSP 芯片所给定的字长,一般为 16位或 24位。
显然,字长越长,所能表示的数的范围越大, 精度也越高。
在字长固定的前提下, 所需要达到的精度越高, 那么所能表示的浮点数的范围就会越小。
DSP 芯片的数以 2的补码形式表示。
每个 16位数用一个符号位来表示数的正负, 0表示数值为正, l 则表示数值为负。
其余 15位表示数值的大小。
如:二进制数 0010000000000011b=8195二进制数 1111111111111100b= -4为了使得无论是无符号数还是符号数, 都可以使用同样的加法减法规则, 符号数中的负数用正数的补码表示。
对 DSP 芯片而言,参与数值运算的数就是 16位的整数。
但在许多情况下,数学运算过程中的数不一定都是整数。
那么, DSP 芯片是如何处理小数的呢?这其中的关键就是数的定标, 由程序员来确定一个数的小数点处于 16位中的哪一位。
通过设定小数点在 16位数中的不同位置, 就可以表示不同大小和不同精度的小数了。
数的定标有 Q 表示法和 S 表示法两种。
定点数的加减法运算较为简单,只需遵循二进制数加减法运算规则相加减即可。
如:两个 8位数具有相同的 Qn 格式,保证隐含的小数点对齐。
下图中两个 8位数相加, 有溢出。
溢出是由于字长有限运算结果超出数值的表示范围引起的。
定点数的乘法运算DSP 处理器都有硬件乘法器和乘法指令,可实现单周期乘法运算,二进制乘法运算包含一系列的移位和加法运算。
定点数乘法运算不要求相乘数有相同的 Qn 格式。
两个相乘数分别为 Qn 和 Qm 格式,字长为 N ,结果为 Q(n+m格式,字长为2N 。
如:以下两个相乘数分别为 Q7和 Q6格式, 8位字长。
两个定点小数作乘法运算,结果左移一位,保存高位得到运算结果,结果为 Qm (m nm 格式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
T M S 320C 24x 的C 语言与汇编语言的接口技术张文荣,潘俊民,邹勇波(上海交通大学信息与控制工程系,上海200030) 摘 要 对于T MS320C24x 的控制程序的开发,采用C 语言和汇编语言混合编程具有较高的效率。
本文阐述了两种语言的接口方式和接口协议,并给出了采用这种接口技术实现混合编程的几种典型应用实例。
关键词 TM 320C24x C 语言 汇编语言 接口Interface Technology of C and Assemble Language for TMS 320C 24xZhang Wenrong ,et al(Dep t .of I n f or mation and Control Engineering ,S hanghai J iaotong U niver sity ,S hanghai 200030) Abstract It is more effectiv e to use C language together w ith assemble lang uag e w hen developing control prog rams o f T MS320C24x.In this paper,interface w ays and conventions of these tw o prog ram languag es are pr opo sed,and several typical examples using this interface technolo gy are provided .Keywords T M 320C 24x ,C lang uag e ,assemble language ,interface1 引 言TM S320C24x (以下简称C24x )是美国T I 公司推出的高性能16位数字信号处理器(DSP),是专门为电机的数字化控制而设计的。
这种DSP 包括一个定点DSP 内核及一系列微控制器外围电路,将数字信号处理的运算能力与面向电机的高效控制能力集于一体,可以实现对各类电机进行复杂而有效的控制。
对C24x 的软件开发,可以用汇编语言,也可以用C 语言实现。
作为一种低级语言,汇编语言的代码执行效率高、运行速度快,可以充分发挥DSP 处理器的硬件性能,但其开发的工作量大,程序可读性差。
相比之下,C 语言具有可读性强、编程简单、调试方便等优点,适合编写结构和算法比较复杂的程序。
然而,对于电机数字化控制来说,用C 语言开发程序也有其明显的缺点:首先,C 语言代码有冗余,降低了执行效率,对于实时性要求很高的电机控制来说是不符合要求的;其次,C 语言无法实现某些底层的操作。
在实际应用中,可以将C 语言和汇编语言结合起来编程,扬长避短,发挥各自的长处,这样就能够做到既满足实时性要求又能实现所需的功能,同时兼顾程序的可读性和编程效率。
为此,必须了解C 24x 的C 语言与汇编语言的接口技术。
2 C 语言与汇编语言接口的基本方式对于C 24x 系统,C 语言与汇编语言的接口有两种基本方式。
(1)在C 语言中嵌入汇编语句C 24x 的C 语言也支持asm 指令,可以用这条指令将一行汇编代码嵌入C 程序中。
可是这样做要担很大的风险,因为编译器完全不对嵌入的汇编代码进行分析检查,也就是说这些汇编代码很有可能破坏原来的C 语言环境,从而导致不可预料的结果。
在绝大多数情况下,笔者并不推荐用这种方式。
但是,在汇编语言中开中断用setc INTM ,而在C 语言中却找不到简单而有效的方法,这时嵌入asm (“setc INTM ”)就是最佳的选择。
(2)连接独立的C 语言模块和汇编语言模块单独编写C 语言模块和汇编语言模块,将它们分别编译后连接成一个可执行目标文件。
这种方式通常用于以下情况:某段代码要求实时性很高或者涉及底层的硬件,C 语言无能为力,这时用汇编语言将其编写成函数的形式,并由C 语言模块调用,就能满足要求。
使用这种方法时,用户必须遵循相关协张文荣,男,24岁,硕士研究生,主要研究领域:电机变频调速收稿日期:2001-09-16第3期2002年8月微 处 理 机M ICROPROCES SORS No.3Aug.,2002议自行维护模块的入口、出口代码,管理堆栈。
3 C 语言与汇编语言接口约定C 24x 的C 语言支持A NSI C 标准。
由于汇编语言很灵活,而C 语言编程则需要一套完备的工作环境,因此两者混合编程时必须保证汇编语言模块不破坏C 环境,也就是说必须严格遵守以下一系列约定。
3.1 标识符命名约定C24x 的C 语言程序编译后,在所有的标识符(包括变量名和函数名)前自动加一个下划线“_”。
因此,如果需要C 语言模块和汇编语言模块共享同一个标识符,就必须符合以下规则:在汇编语言模块中,标识符要以“_”开头,并声明为全局型,如.bss _var,1 ;定义变量.g lobal _var ;声明为全局变量同时在C 语言模块中,以ex tern 修饰该标识符,如extern int var;3.2 寄存器使用约定C24x 系统有8个辅助寄存器(AR0~AR7)可供使用,在C 环境中这些寄存器都有明确的分工。
(1)AR1:Stack po inter (SP)软件栈的栈顶指针C 24x 只提供了大小为8个字的硬件栈,不能满足需要,因此,C 环境定义了一段特殊的存储器空间,作为所谓的软件栈。
软件栈的作用是分配局部变量、传递函数的参数、保存处理器的状态、保存临时结果等。
AR 1正是被用作指向该软件栈栈顶的专用指针。
(2)AR 0:Frame pointer (FP )帧指针AR0指向软件栈中函数局部数据空间的起始处。
(3)AR 2:Lo cal variable pointer (LVP )局部变量指针AR2存放局部变量的偏移量,与AR0(FP)一起对局部变量进行寻址定位。
(4)AR6、AR7:寄存器型变量在C 语言程序中用register 修饰的变量存放在AR 6、AR 7中。
(5)AR3~AR5:自由寄存器AR3~AR5没有特殊的约定,可以由用户自由决定其用途。
3.3 函数调用约定C 语言函数调用有一套严格的规则,要实现汇编语言模块和C 语言模块之间函数的互相调用,必须遵从这些规则。
按照C 语言的规定,函数的参数是按从右到左的次序压栈的。
在C24x 中函数的返回值存放在累加器ACC 中。
对软件栈的维护是函数互调的关键。
函数的参数是通过软件栈传递的,函数的出口地址存放在软件栈里,函数用到的局部变量也是在软件栈中分配的。
图1是一个典型的函数调用时软件栈的分配情况。
调用步骤如下: 在主调函数的局部帧后将被调函数的参数依次压栈; 程序指针(PC )跳转到被调函数的代码段; 保存出口地址;!保存主调函数局部帧指针;∀分配局部变量;#调用结束前将以上所有内容弹出软件栈。
图1 函数调用时软件栈分配情况4 C 语言与汇编语言的应用4.1 C 语言调用汇编语言函数有时用户可能会将一些常数或数据表存放在程序存储器中,而C24x 的C 语言无法直接访问程序存储器。
这时可以用汇编语言编写访问程序存储器的代码,由C 语言来调用。
下面给出具体实现的方法。
在C 模块中调用函数的格式如下:……unsigned a;a =readro m (0x 100);/*函数的参数是要访问的程序存储器地址,返回该地址的数据*/……确定了调用的格式,就能用汇编语言编写访问程序存储器的函数的实现代码了。
.g lobal _r eadrom ;将函数名声明为全局型的标识符_r eadr om:popd *+;将出口地址从硬件栈中弹出,放入软件栈中・31・ 3期张文荣等:T M S 320C 24x 的C 语言与汇编语言的接口技术sar AR0,*+;保存主调函数的FPsar AR1,*lar A R0,#2lar AR0,*0+,AR2;分配局部变量的存储单元,并保存新的FP,确定新的栈顶lar AR2,#0fffdh;设置LVP相对与FP的偏移量,这里是-3mar*0+;取得唯一一个参数的绝对地址,保存在A R2(LVP)中lacc*;取出参数lar A R2,#1;mar*0+;LV P定位到局部变量存储单元tblr*;从程序存储器读取数据,保存到局部变量中lacl*,AR1;把返回值存入ACCsbrk3;lar AR0,*-;把FP恢复为主调函数的FP,并将局部变量空间释放pshd*;出口地址重新压入硬件栈ret;函数返回4.2 汇编语言调用C语言函数C24x的汇编语言没有除法指令,可以调用C 语言函数来实现。
做法如下:在C语言模块中编写除法函数。
int division(int a,int b)/*函数的参数是被除数和除数,返回值是商*/{return a/b;}在汇编模块中可以这样调用上面的C函数:.g lobal_div ision;将函数名声明为全局型的标识符stack.set#200h;定义软件栈的起始地址.bss div idend,1;分配被除数存储单元.bss div isor,1;分配除数存储单元.bss quotient,1;分配商的存储单元……lar A R1,#stack;初始化SPmar*,A R1;当前辅助寄存器设为AR1lacl divisor;读取除数sacl*+;除数压栈lacl dividend;读取被除数sacl*+;被除数压栈;注意上面的压栈次序call_division;调用C语言的除法函数sacl quotient;从ACC中取出返回值,即商的值subk2;释放软件栈……4.3 用C语言处理中断C24x提供了多个中断,如INT1~INT6、NM INT等。
程序存储器空间0000h~003Fh是保留给中断向量的,每个中断向量占2字。
一旦发生中断,程序指针(PC)就指向相应的中断向量,并通过中断向量映射到相应的中断服务子程序。
比如, INT1的中断向量在0002h~0003h,在此地址写入一条跳转指令,跳转到IN T1的服务子程序,这样INT1中断产生时,PC指到0002h,执行跳转指令后就进入了服务子程序了。
C24x的C语言有inter rupt修饰符可以用来定义中断服务子程序,如v oid inter rupt INT1_Sevice()/*假设这是INT1的中断服务子程序函数*//*该函数必须用interrupt修饰,返回值类型是void,且不能有参数*/{……}仅仅这样还不够,因为还没有定义INT1的中断向量,所以要另写一个汇编语言模块来定义中断向量,如下.global_INT1_Sevice……0002h:b_INT1_Sevice……将以上的C语言模块和汇编语言模块分别编译后连接,就可以正确响应INT1中断了。