曲径通幽论坛

标题: PC_VectSet & PC_VectGet [打印本页]

作者: beyes    时间: 2009-4-14 01:39
标题: PC_VectSet & PC_VectGet
一、功能
安装中中断向量
二、代码:
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));               /*返回中断向量指向的地址(中断服务程序的地址)*/





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2