C语言和汇编语言程序混合编程方法及中断处理方法-Read.PPT

C语言和汇编语言程序混合编程方法及中断处理方法-Read.PPT

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言和汇编语言程序混合编程方法及中断处理方法-Read

第6章 C语言和汇编语言程序混合编程方法及中断处理方法 6.1 C语言和汇编语言程序混合编程方法 数据类型 寄存器变量 6.1.1 在C语言中嵌入汇编语言程序 在C语言中嵌入单条汇编语句 6. 在C语言中嵌入 实现某一完整功能的多条汇编语句 (1)调用函数时堆栈的使用情况 (2)C语言调用子程序的规范 子程序的操作 说明 6.1.2 分开编写C语言和汇编语言程序 2.在C语言程序中访问汇编语言程序的变量 3.在汇编语言程序中访问C语言程序变量 6.2 用C语言处理DSP中断 如果一个引起中断的外设事件发生且相应的中断使能位被置1,则会产生一个从外设到中断控制器的中断请求。 从几个外设来的外设中断请求(PIRQ)在中断控制器处“或”产生一个到CPU的中断请求(INTn)。 如果一个外设中断请求PIRQ在CPU对INTn应答后的一个周期内仍然有效时,则另一个中断请求脉冲INTn也会产生。 而CPU总是响应优先级高的外设中断请求。 CPU应答外设中断时,从PIVR寄存器中读取相应中断的向量,并产生一个转到该中断服务子程序入口的向量。 用C语言实现可屏蔽中断程序的两种方法 : 通过软件识别中断标志的方法。 优点:实现中断程序代码少、易于理解。 2. 通过外围中断向量寄存器PIVR的值识别中断。 实现:用C语言中的SWITCH在中断服务程序,在中断程序入口处,根据PIVR的值来判断发生的中断是否为需要的中断。 例1:用软件识别中断标志的方法实现捕捉单元4的中断(CAP4INT)。 1. 建立一个复位和中断向量文件vectors.asm: .title vectors.asm .ref _c_int0,_nothing,_capint ;定义符号 .sect .vectors reset: b _c_int0 ;复位向量 INT1: b _nothing INT2: b _nothing INT3: b _nothing INT4: b _capint ;当发生int4中断时,程序跳转至“capint”所标志的中断服务程序。 INT5: b _nothing INT6: b _nothing ;当发生其它级别的中断时,直接跳转至nothing所标志的中断服务程序 * 在用C语言开发DSP应用程序时,需要对DSP的底层资源进行操作的场合。 用C语言编写相应的代码有一定的难度; 某些操作C语言根本就无法实现(如对OVM、CNF等位的操作)。 asm(需要嵌入的汇编语句) // 系统初始化子程序 void initial( ) { asm( setc SXM); // SXM位置1,抑制符号位扩展 asm( clrc OVM); // OVM位清0,累加器中结果正常溢出 asm( clrc CNF); // CNF位清0,B0被配置为数据存储空间 } 2. 访问I/O空间 3. 访问数据空间 预先定义如: volatile unsigned int *IMR=(volatile unsigned int *)0X0004; volatile unsigned int *IFR=(volatile unsigned int *)0X0006; 实例中: { *IMR=0X0; *IFR=0X0FFFFH; … } 4. 存储器模式 5. 系统堆栈 把需要嵌入的多条汇编语句编制成一个子程序,并在其入口和出口处遵循C语言的调用规范进行一些必要的操作,就可以方便地在C语言中调用汇编语言程序 。 在C语言中调用汇编语言程序编写的子程序时,应特别注意使用的堆栈不是DSP的硬件堆栈,而是.CMD文件定义的软堆栈。 1)主程序的操作 ① 主程序把需要向子程序传递的参数按反序压入堆栈(最右边的参数最先被压入堆栈,最左边的参数最后被压入堆栈); ② 主程序调用子程序; ③ 在子程序返回前,ARP已设置为AR1; ④ 当子程序调用完毕后,主程序要弹出先前压入堆栈的传递参数。 操作语句:SBRK n (n是主程序向子程序传递的参数的个数) 注意:ARP已经由编译器自动设置为AR1。 在子程序的入口处,假设ARP已经被设置为AR1(由C编译器自动完成的)。 从硬件堆栈中弹出返回地址,再把它压入软件堆栈; 将主程序的数据结构指针FP压入堆栈; 若在子程序中要改变AR6或者AR7,需要把它们压入堆栈; 分配局部数据结构; 执行子程序的实际任务代码; 如果子程序有返回值,则把此返回值放入累加器中; 设置ARP为AR1; 解除分配的局部数据结构; 如果保存了AR6和AR7,则

文档评论(0)

jinchenl + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档