为什么在写中断oracle 函数 pragma时要写#pragmaCODE

查看: 8335|回复: 3
请教【#pragma vector=IRQV 这句话是什么意思,帖子里有详细情况】
我在写AMR[LPC21XX系列]的&&中断&&程序的时候
每次在写中断函数时,都要有一句
/////////////////////////
#pragma vector=IRQV
/////////////////////////
#pragma vector=IRQV&&/////////////////////////////////////////////这一行有什么用? 里面的vector是不是和程序里定义的vector对应的?
__irq __arm void irq_handler (void)
void (*interrupt_function)();
/////////////////////////////////为何还要定义unsigned int vector 呢?
&&vector = VICVectA& &&&//获得中断向量
&&interrupt_function = (void(*)())
&&if(interrupt_function != NULL)
& &&&//调用中断指向的函数
& & VICVectAddr = 0;& && &//清除在VIC中的中断
我看了配置文件里【LPC2102.h】是这么定义的
#define IRQV& && && && &0x18&&/* Normal interrupt& && && && && && & */
//////////////////////////////////////////////
请高手告诉我这句话是什么意思? 为什么在写中断服务程序的时候都要有这一行呢? 中断服务程序为什么还要在 unsigend int vector呢?
本人也正在学习ARM,对此也有同样问题,期待 大虾&&解答啊…………
顶个……%……
回复【楼主位】njlz0707mm
-----------------------------------------------------------------------
刚才试了下,将程序里面的vector换成别的标识符,如v,结果编译出错。
然后将#pragma vector里面的改回vector,中断服务程序里面的写成v,编译通过,下载进开发板,运行成功。
因此,我“猜”,#pragma后面的是一个固定形式的参数,而服务程序里面的只是为了将中断向量地址取出的作用,,,
个人观点,期待验证、纠正…………
问题已搞懂
IAR for arm 中断处理写法
启动文件中:(默认启动文件也是这样)
& && & org 0x18
& && & ldr pc,[pc,#-0xFF0] ; 直接跳转到用户中断处理函数
直接写用户中断函数
& && & __irq __arm void Tmr0_IntOnMR0_isr(void)
& && && && && && & ............
& && && && && &}
& && && & __irq __arm void Tmr1_IntOnMR0_isr(void)
& && && && && && & ............
& && && && && &}
启动文件中:(默认启动文件也是这样)
& && & org 0x18
& && & ldr pc,=irq_handler& && &&&;跳转到公共中断处理函数,再分支到具体功能的中断处理函数中
& && & __irq __arm void irq_handler (void)& && &&&//公共中断处理函数,检查VICVectAddr是否为空
& && && &void (*interrupt_function)();
& && && && & vector = VICVectA& &&&// Get interrupt vector.
& && && && & interrupt_function = (void(*)())
& && && &if(interrupt_function != NULL)
& && && && & {
& && && && &interrupt_function();& &// Call vectored interrupt function.
& && && && & }
& && && && & else
& && && && & {
& && && && &VICVectAddr = 0;& & // Clear interrupt in VIC.
& && && && & }
具体功能的中断处理函数
& && &void Tmr0_IntOnMR0_isr(void)
& && && && && && & ............
& && && && && &}
& && && & void Tmr1_IntOnMR0_isr(void)
& && && && && && & ............
& && && && && &}
& && & 使用#pragma vector不管启动文件如何写法,
& && & #define IRQV& && && & 0x18
& && & #pragma vector=IRQV
& && & __irq __arm void irq_handler (void)
& && & void (*interrupt_function)();
& && &vector = VICVectA& &&&// Get interrupt vector.
& && &interrupt_function = (void(*)())
& && &if(interrupt_function != NULL)
& && && &interrupt_function();& &// Call vectored interrupt function.
& && &else
& && && &VICVectAddr = 0;& & // Clear interrupt in VIC.
& && & 具体功能的中断处理函数
& && &void Tmr0_IntOnMR0_isr(void)
& && && && && && & ............
& && && && && &}
& && && & void Tmr1_IntOnMR0_isr(void)
& && && && && && & ............
& && && && && &}
阿莫电子论坛, 原"中国电子开发网"MCC18中断写法_中华文本库
第1页/共2页
PIC18系列的低优先级中断入口地址在0x0018地址,下面的代码是在入口地址处放置一个向量函数,这个向量函数里就是一个内嵌汇编的GOTO 指令,GOTO 到低优先级的中断服务函数InterruptHandlerLow 。
//----------------------------低优先级中断入口-----------------------------------
1 #pragma code InterruptVectorLow = 0x18 //用#pragma伪指令定义一个名字叫InterruptVectorLow 的段,并把这个段放到0x18地址起始的代码空间
InterruptVectorLow (void )
//低优先级中断向量函数
InterruptHandlerLow
//内嵌汇编指令
8 #pragma code
//这里不是多余的,它是告诉连接器回到默认的代码段,如果不加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。而LKR 文件里定义了向量区最多到0x29地址,所以如果没加此行通常会报错
10 #pragma interruptlow InterruptHandlerLow
//这里使用interruptlow 这个关键词来声明
InterruptHandlerLow 这个函数是低优先级中断服务函数,用了关键词后,这个函数将会由编译器自动产生基本的现场保护,并且这个函数的返回将是使用RETFIE 返回的。
InterruptHandlerLow (void )
/* 低优先级服务函数的代码写在这里*/
PIC18系列的高优先级中断入口地址在0x0008地址,下面的代码是在这个入口地址处放置一个向量函数,这个向量函数里就是一个内嵌汇编的GOTO 指令,GOTO 到高优先级的中断服务函数InterruptHandlerHigh 。
第1页/共2页
寻找更多 ""#pragma CODE_SEG __NEAR_SEG NON_BANKED - 智能车制作 - Powered by Discuz!
智能车制作
标题: #pragma CODE_SEG __NEAR_SEG NON_BANKED
作者: oo7ak47666& & 时间:
标题: #pragma CODE_SEG __NEAR_SEG NON_BANKED为什么在写中断函数时要写#pragma CODE_SEG __NEAR_SEG NON_BANKED这句话,标示代码不在分页区?
知其然而不知其所以然啊~~~~大家帮帮忙啊~~
作者: cqqjliyuan& & 时间:
写#pragma CODE_SEG&&XX 表示把下面的程序放到XX代码段&&至于为什么要放到NON_BANKED代码段
我想是只有放在这个段里面 才能将中断号与中断向量联系起来 也就是硬件决定的
作者: oo7ak47666& & 时间:
cqqjliyuan
作者: 刚刚& & 时间:
作者: zhouhong& & 时间:
作者: feisikaer_2010& & 时间:
作者: wt& & 时间:
作者: nonfreedom& & 时间:
作者: shuxinxiaozi& & 时间:
3q啊,呵呵。我试着把它们注释掉,结果link error!╮(╯▽╰)╭
作者: 挑战者& & 时间:
作者: 灯火楼台& & 时间:
作者: shadow& & 时间:
百度上有说明!
作者: jiang1101& & 时间:
作者: jiang1101& & 时间:
作者: & & 时间:
意思把中断代码放在64K寻址范围内,效率高。16位机寻址能力为64K。
作者: & & 时间:
意思把中断代码放在64K寻址范围内,效率高。16位机寻址能力为64K。
作者: 4621& & 时间:
作者: hefeixuexi& & 时间:
谢谢哈!知道了
作者: beandy& & 时间:
作者: 梧桐1209& & 时间:
作者: 梧桐1209& & 时间:
FLASH里非分页工作机制
& &FLASH一共为128K,一页是16K,那么应该有8页才是,但是实际只有6个分页。有2个非分页放在4000-7FFF,和C000-FFFF两个逻辑地址窗里。那么,当程序的寻址在64K之内(2^16=64K,16位机的寻址能力是64K)时,就不用分页了,直接使用那两个非分页的数据。实际上,3E页 3F页是可见的,其实他们就是那2个非分页的映射。因此,使用非分页FLASH,就不须设置PPAGE寄存器,直接使用逻辑地址即可。
很直观地看出,把这两个可以直接使用逻辑地址的页面设为NON_BANKED, 那么中断函数放在NON_BANKED里,就可以把函数放在64K的寻址程序段中。这么一来,进中断就方便多了,效率也高很多。
作者: feisi_kaer& & 时间:
呵呵 对头!
作者: renzhejiajia& & 时间:
作者: 飞思& & 时间:
这要还是要从FLASH分页和非分页的区别说起。
& & 下面详细说一说,FLASH里非分页和分页的使用。 要明白一点,分页是不可见的,要用的时候PPAGE参与寻
& &FLASH里非分页工作机制
& &FLASH一共为128K,一页是16K,那么应该有8页才是,但是实际只有6个分页。有2个非分页放在4000-7FFF
,和C000-FFFF两个逻辑地址窗里。那么,当程序的寻址在64K之内(2^16=64K,16位机的寻址能力是64K)时,
就不用分页了,直接使用那两个非分页的数据。实际上,3E页 3F页是可见的,其实他们就是那2个非分页的映
射。因此,使用非分页FLASH,就不须设置PPAGE寄存器,直接使用逻辑地址即可。
& &这点我们可以从以下看出:
/* non-paged FLASHs */
& && &ROM_4000& && &= READ_ONLY& &&&0x4000 TO& &0x7FFF;
& && &ROM_C000& && &= READ_ONLY& &&&0xC000 TO& &0xFEFF;
& && &NON_BANKED,& & INTO ROM_C000/*, ROM_4000*/;
& & 很直观地看出,把这两个可以直接使用逻辑地址的页面设为NON_BANKED, 那么中断函数放在NON_BANKED里
,就可以把函数放在64K的寻址程序段中。这么一来,进中断就方便多了,效率也高很多。
本文来自CSDN博客,转载请标明出处:
作者: & & 时间:
作者: lrbdh& & 时间:
作者: 加速度& & 时间:
作者: chuan0506& & 时间:
我也不知道
作者: a& & 时间:
作者: dich& & 时间:
这要还是要从FLASH分页和非分页的区别说起。
& & 下面详细说一说,FLASH里非分页和分页的使用。 要明白一点,分页是不可见的,要用的时候PPAGE参与寻
& &FLASH里非分页工作机制
& &FLASH一共为128K,一页是16K,那么应该有8页才是,但是实际只有6个分页。有2个非分页放在4000-7FFF
,和C000-FFFF两个逻辑地址窗里。那么,当程序的寻址在64K之内(2^16=64K,16位机的寻址能力是64K)时,
就不用分页了,直接使用那两个非分页的数据。实际上,3E页 3F页是可见的,其实他们就是那2个非分页的映
射。因此,使用非分页FLASH,就不须设置PPAGE寄存器,直接使用逻辑地址即可。
& &这点我们可以从以下看出:
/* non-paged FLASHs */
& && &ROM_4000& && &= READ_ONLY& &&&0x4000 TO& &0x7FFF;
& && &ROM_C000& && &= READ_ONLY& &&&0xC000 TO& &0xFEFF;
& && &NON_BANKED,& & INTO ROM_C000/*, ROM_4000*/;
& & 很直观地看出,把这两个可以直接使用逻辑地址的页面设为NON_BANKED, 那么中断函数放在NON_BANKED里
,就可以把函数放在64K的寻址程序段中。这么一来,进中断就方便多了,效率也高很多。
作者: JudeScorpio& & 时间:
cqqjliyuan 发表于
写#pragma CODE_SEG&&XX 表示把下面的程序放到XX代码段&&至于为什么要放到NON_BANKED代码段
我想是只有放在 ...
欢迎光临 智能车制作 (/)
Powered by Discuz! X3.2pic18中断处理_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
pic18中断处理
你可能喜欢 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
[精品]AVR中的中断函数名
下载积分:280
内容提示:[精品]AVR中的中断函数名
文档格式:DOC|
浏览次数:55|
上传日期: 03:46:58|
文档星级:
全文阅读已结束,如果下载本文需要使用
 280 积分
下载此文档
该用户还上传了这些文档
[精品]AVR中的中断函数名
关注微信公众号

我要回帖

更多关于 中断函数 的文章

 

随机推荐