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

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


13.1.4 asm语句

TMS320C2x/C2xx/C5x的C编译器可以在编译器输出的汇编语言中直接嵌入汇编语言指令。这种能力是C语言的扩展—

—asm语句。asm语句能够实现一些C无法实现的功能。

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

asm(" clrc INTM");

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

对于嵌入的汇编指令,编译器不会进行语法检查, 编程者必须确认嵌入的指令合理有效。使用asm指令的时候应小心不要破坏C语言的环境。如果C代码中插入跳转指令和标识符可能会引起不可预料的操作结果。能够改变块或其它影响汇编环境的指令也可能引起麻烦。 对带asm语句的代码使用优化器时要特别小心。尽管优化器不能删除asm指令,但它可以重新安排asm 指令附近的代码顺序,这样就可能会引起不期望的结果。

13.1.5 访问I/O空间

I/O空间地址声明

要在程序中访问io空间地址,必须首先用关键字

“ ioport”对要访问的地址进行定义。

语法:ioport type porthex_num

ioport 声明io空间端口变量的关键字;

type 变量类型,可以为char, short, int或

unsigned int;

type 变量类型,可以为char, short, int或

unsigned int;

porthex_num 端口号,port后面接16进制数字。

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

ioport unsigned int port10;

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

注:声明io空间地址必须在C文件起始声明,不允许

在函数中使用ioport声明io空间地址。


----------------------- Page 14-----------------------

I/O空间地址访问

访问用ioport关键字声明的I/O端口变量和访问一般变量没有区别。

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

ioport unsigned int port10; /* 访问I/O端口10h的变量 */

int func ()

{

...

port10 = a; /* 写 a到端口 10h */

...

b = port10; /* 读取端口10h的值到 b */

} /***********************************************************/

I/O端口变量的使用不仅仅局限于赋值,和其他变

量同样也可以应用于其它的表达式。

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

call (port10); /* read port 10h and pass to call */

a = port10 + b; /* read port 10h, add b, assign to a */

port10 += a; /* read port 10h, add a, write to port 10h */

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

程序中访问的任何一个IO地址都必须在C语言程序

起始处用ioport关键字声明!

13.1.6 访问数据空间

访问数据空间不需要对要访问的单元预先声明,访问是通过指针的方法

实现的。

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

unsigned int org,cnt,block,offset,tmp,i;

org = *(unsigned int *) 0x8000;

cnt = *(unsigned int *) 0x8001;

block = *(unsigned int *) 0x8002;

offset = *(unsigned int *) 0x8003;

for (i=0; i<cnt; i++)

tmp = *(unsigned int *) (org + i);

*(unsigned int *) (org + offset +i) = tmp;

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

cnt = *(unsigned int *) 0x8001;

block = *(unsigned int *) 0x8002;

offset = *(unsigned int *) 0x8003;

for (i=0; i<cnt; i++)

tmp = *(unsigned int *) (org + i);

*(unsigned int *) (org + offset +i) = tmp;

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

*(unsigned int *) (org + offset +i) = tmp;

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


13.1.7 中断处理

(1)中断处理方法

(1)中断处理方法

查询法

程序通过查询中断标志位来判断是否有中断发生,并 进行相应的处理。

优点:流程易于控制,不会发生中断嵌套的问题,一 般也不会发生丢失中断的问题。

缺点:中断实时性差。

回调法

为中断指定一个回调函数,即中断服务程序。将中断服务程序的入口地址放在中断向量处。

优点:中断实时性好,程序结构简洁,类似于windows操作系统下事件驱动的编程方式。 缺点:处理不好容易造成中断嵌套或丢失中断。


(2)回调法处理中断的一般性问题

中断服务函数可以和一般函数一样访问全局变量、分配局部变量和调用其它函数等。 进入中断服务函数,编译器将自动产生程序保护所有必 要的寄存器,并在中断服务函数结束时恢复运行环境。

c_int0是保留的复位中断处理函数,不会被调用,也不需要保护任何寄存器。 要将中断服务函数入口地址放在中断向量处以使中断服务函数可以被正确调用。中断服务函数要尽量短小,避免中断嵌套等问题。


(3)用C编写中断服务函数

有两种方式定义中断服务函数:a)任何具有名为c_intd 的函数(d为0到9的数),都被假定为一个中断程序,c_int0函数留作系统复位中断用。 b)利用中断关键词interrupt进行定义。举例如下:

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

void c_int1 ()

{

......

}

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

interrupt void isr ()

{

......

} /***********************************************************/

{

......

}

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

interrupt void isr ()

{

......

}

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

返回列表