C语言程序设计及仿真调试-吉林大学课程中心.PPT

C语言程序设计及仿真调试-吉林大学课程中心.PPT

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

6、函数的重入 为了提高效率,C51没有提供这种调用堆栈,而是提供一种压缩栈。每个过程被给定同一个空间,用于存放局部变量。过程中的每个变量都存放在这个空间的固定位置。当递归调用这个过程时,会导致变量被覆盖。 在某些实时应用中,非重入函数是不可取的。因为,函数调用时可能会被中断程序中断,而在中断程序中可能再次调用这个函数,所以C51允许将函数定义成重入函数。 重入函数可被递归调用和多重调用, 而不用担心变量被覆盖, 因C51可模拟生成一个可重入变量堆栈 {随存储模式(small, compact, large)不同, 堆栈可在不同的存储器区(idata, pdata, xdata)}, 每次函数调用时的局部变量都会被单独保存。因为这些堆栈是模拟的,重入函数一般都比较大,运行起来也比较慢。 * 不常使用 6、函数的重入 由于一般可重入函数由主程序和中断调用(即递归调用), 所以通常中断程序使用与主程序不同的工作寄存器组。 另外,对可重入函数,在相应的函数前面加上开关#pragma noaregs,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。 所以对不依赖于寄存器组的函数可被其他使用了不同的寄存器组的多个函数调用。 * extern char func (); #pragma NOAREGS noaregfunc () { k = func () + func (); } #pragma AREGS aregfunc () using 3 { k = noaregfunc() + func (); } 不常使用 5.2.4 STC15F2K60S2单片机C51程序框架 #include “stc15.h” /* stc15.h为单片机寄存器定义头文件, 具体见附录C */ void delay(long delaytime); //声明子函数,子函数可以有返回值 void main(void) { //…此处可存放应用系统的初始化代码 while(1) //主程序循环 { //根据需要填入适当的内容 delay(100); //可以调用用户自定义的子函数 } } * // 各个子函数声明, 各个中断函数的实现 void delay(long delaytime) { while(delaytime0) delaytime--; //子函数的实现代码 } //---------各个中断函数的实现---------- void INT0_ISR(void) interrupt 0 //外部中断0服务子函数 { //根据需要填入程序代码 } void T0_ISR(void) interrupt 1 //定时器0中断服务子函数 { //根据需要填入程序代码 } void INT1_ISR(void) interrupt 2 //外部中断1服务子函数 { //根据需要填入程序代码 } void T1_ISR(void) interrupt 3 //定时器1中断服务子函数 { //根据需要填入程序代码 } * // 各个中断函数的实现 void UART1_ISR(void) interrupt 4 //串口1中断服务子函数 { //根据需要填入程序代码,注意中断请求标志的清零 } void ADC_ISR (void) interrupt 5 //ADC中断服务子函数 { //根据需要填入程序代码,注意中断请求标志的清零 } void LVD_ISR (void) interrupt 6 //低电压检测中断子函数 { //根据需要填入程序代码,注意中断请求标志的清零 } void PCA_ISR (void) interrupt 7 //PCA中断子函数 { //根据需要填入程序代码,注意中断请求标志的清零 } void UART2_ISR (void) interrupt 8 //串口2中断子函数 { //根据需要填入程序代码,注意中断请求标志的清零 } void SPI_ISR (void) interrupt 9 //SPI中断子函数 { //根据需要填入程序代码,注意中断请求标志的清零 } * //

文档评论(0)

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

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

1亿VIP精品文档

相关文档