曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 7516|回复: 0
打印 上一主题 下一主题

PC_VectSet & PC_VectGet

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2009-4-14 01:39:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、功能
安装中中断向量
二、代码:
void PC_VectSet (INT8U vect, void (*isr)(void))
{
#if OS_CRITICAL_METHOD == 3                     
    OS_CPU_SR  cpu_sr;
#endif  
    INT16U    *pvect;
  
  
    pvect    = (INT16U *)MK_FP(0x0000, vect * 4);     /*pvect 指向欲安装的中断向量位置*/
    OS_ENTER_CRITICAL();
    *pvect++ = (INT16U)FP_OFF(isr);                   /*保存中断服务程序的偏移地址*/
    *pvect   = (INT16U)FP_SEG(isr);                   /*保存中断服务程序的段地址*/
    OS_EXIT_CRITICAL();
}
说明:
unsigned FP_OFF(void far *farptr)---用来取远指针farptr的偏移量
unsigned FP_SEG(void far *farptr) ---用来没置远指针farptr的段值
void far *MK_FP(unsigned seg,unsigned off)---根据段seg和偏移量off构造一个far指针
三、PC_VectGet()
void *PC_VectGet (INT8U vect)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif  
    INT16U    *pvect;
    INT16U     off;
    INT16U     seg;
  
  
    pvect = (INT16U *)MK_FP(0x0000, vect * 4);        /*指向中断向量所在地址*/
    OS_ENTER_CRITICAL();
    off   = *pvect++;                                 /* Obtain the vector's OFFSET                    */
    seg   = *pvect;                                   /* Obtain the vector's SEGMENT                   */
    OS_EXIT_CRITICAL();
    return (MK_FP(seg, off));               /*返回中断向量指向的地址(中断服务程序的地址)*/
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 11:35 , Processed in 0.058571 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表