首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

哈工大DSP精品讲义!!!(连载)

(4)C语言编写中断处理函数注意事项:

中断处理函数必须是void类型,而且不能有任何输入参 数。

进入中断服务程序,编译器只保护与运行上下文相关的寄存器,而不是保护所有的寄存器。中断服务程序可以

任意修改不被保护的寄存器,如外设控制寄存器等。

要注意IMR、INTM等中断控制量的设置。

中断处理函数可以被其他C程序调用,但是效率较差。多个中断可以共用一个中断处理函数,除了c_int0。

使用中断处理函数和一些编译选项冲突,注意避免对包含中断处理函数的C程序采用这些编译选项。

含中断处理函数的C程序采用这些编译选项。

13.2 C语言与汇编语言混合编程

C语言编写DSP程序对底层的了解要求较低,流程控制灵活,开发周期短。程序可读性、可移植性好,程序修改、升级方便。某些硬件控制功能不如汇编语言灵活,程序实时性不理想,很多核心程序 可能仍然需要利用汇编语言来实现。

13.2.1 C语言与汇编语言混合编程的方式

C语言调用汇编语言编写的函数 使用内嵌汇编语句(asm语句) C语言访问汇编语言变量 手动修改C语言程序编译后生成的汇编代码


13.2.2 存储器模式

TMS320C2x/C2xx/C5x的C语言编译器将存储器分为两个线性的空间: 程序存储器 存储可执行代码 数据存储器 存储各种变量和堆栈编译器将存储器以分段(section)的方法分配和管理,用户以不同的方式分配存储器,可以形成不同的系统配置。连接器将各个块连接在一起形成最终输出的存储器结构。

已初始化的段:

.text 包含所有可执行代码和浮点型常量 Page 0

.cinit 包含初始化变量和常量表 Page 0

.const 包含字符串常量,以及以const修饰的全局或静态变

量的声明和初始化 Page 1

.switch 包含switch语句的分支跳转地址表 Page 0 未初始化的块:

.bss 为全局和静态变量保留空间 Page 1

.stack 为系统软件堆栈分配空间 Page 1

.system 为动态分配的内存保留空间,可以被calloc、

malloc、realloc函数使用 Page 1

13.2.3 系统堆栈

系统堆栈分为硬件堆栈和软件堆栈。

DSP内部程序控制逻辑部分包含一定大小的堆栈,通常称为

硬件堆栈,可以用来保存若干个分支、跳转、函数调用或中

断服务程序的返回地址,也可以用来保存其它变量。

通过系统配置可以另外生成一定大小的软件堆栈,用来:

分配局部变量

传递函数参数

保存处理器状态

保存函数返回地址

保存临时结果

保存寄存器内容

堆栈从低端地址向高端地址生成。编译器利用两个辅助寄存

器来管理堆栈:

AR1 堆栈指针(SP, stack pointer),指向当前堆栈顶。

AR0 帧指针(FP, frame pointer),指向当前帧的起始点,每一个函数都会在堆栈顶部建立一个新的帧, 用来保存局部或临时变量。

C语言环境自动操作这两个寄存器。如果编写用到堆栈的汇编语言程序,一定要注意正确使用这两个寄存器。 用-stack连接选项可以指定软件堆栈的大小,用C编写DSP程序一定注意保留足够的堆栈空间!

注意:编译器不会检查堆栈溢出情况,堆栈溢出会破坏DSP 运行环境,导致程序失败。编写DSP程序和配置DSP存储器资源要注意防止堆栈溢出的发生。

注意:编译器不会检查堆栈溢出情况,堆栈溢出会破坏DSP运行环境,导致程序失败。编写DSP程序和配置DSP存储器资源要注意防止堆栈溢出的发生。

13.2.4 动态分配内存

TMS320C2x/C2xx/C5x C语言可调用malloc、calloc或realloc 函数动态申请内存,申请的内存将分配在.system块。动态分配的内存只能通过指针进行访问。将大数组通过这种方式来分配可以节省.bss块的空间。通过连接器的-heap选项可以定义.system块。

/***************************************************/

unsigned int *data;

data =(unsigned int *) malloc (100 * sizeof (unsigned int));

/***************************************************/

13.2.5 寄存器规则

TMS320C2x/C2xx/C5x运行环境对寄存器的使用有严 格的要求,如果编写涉及到寄存器的汇编程序,必须严格遵守这些规则,否则可能造成系统工作异常。 寄存器规则规定了编译器如何使用寄存器,和寄存 器在函数调用的过程中如何进行保护。

调用保存(save on call),调用其它函数

的函数负责保存这些寄存器的内容。 入口保存(save on entry),被调用的函

数负责保存这些寄存器的内容。

注:无论是否使用优化编译,都必须遵守这些寄存器规则。


寄存器的使用和保护

寄存器 用途 调用时保护

AR0 帧指针(FP) Yes

AR1 堆栈指针(SP) Yes

AR2 局部变量指针(LVP) No

AR3-AR5 表达式运算 No

AR6-AR7 寄存器变量 Yes

Accumulator 表达式运算/返回值 No

AR6-AR7 寄存器变量 Yes

Accumulator 表达式运算/返回值 No

状态寄存器(ST0、ST1)单元

单元 名称 假定值

ARP 辅助寄存器指针 1

C 进位标志 -

DP 数据页 -

OV 溢出标值 -

OVM 溢出模式 0

PM 乘法移位模式 0

SXM 符号扩展模式 -

TC 测试模式 -

返回列表