首页 Soft PlugIn RAN乱 Dev开发 Info资料 English WAP 留言 登陆 注册
-
Posted by Yippee | 评论(0) | 引用(0) | 阅读3429次
µC/OS-II UCOSII学习笔记3

今天继续学习 ,昨天  µC/OS-II UCOSII学习笔记2 ,今天继续,发现应该如此:


#define  VECT_TICK                    0x08       /* Vector number for 82C54 timer tick                 */

PC_TickISR   = PC_VectGet(VECT_TICK);                  /* Get MS-DOS's tick vector                 */

pvect = (INT16U *)MK_FP(0x0000, vect * 4);        /* Point into IVT at desired vector location     */

这样的话,0X08表示 PC系统 定时器中断,MK_FP是获得中断向量表。www.shengfang.org

计算机内存的前1024个字节(偏移量00000H到003FFH)保存着256个中断向量,每个中断向量占4个字节,前两个字节保存着中断服务程序的入口地址偏移量,后两个字节保存着中断程序的入口段地址,使用时,只要将它们分别调入寄存器IP及CS中,就可以转入中断服务程序实现中断调用。每当中断发生时,CPU将中断号乘以4,在中断向量表中得到该中断向量地址,进而获得IP及CS值,从而转到中断服务程序的入口地址,调用中断。这就是中断服务程序通过中断号调用的基本过程。在计算机启动的时候,BIOS将基本的中断填入中断向量表,当DOS得到系统控制权后,它又要将一些中断向量填入表中,还要修改一部分BIOS的中断向量。有一部分中断向量是系统为用户保留的,如60H到67H号中断,用户可以将自己的中断服务程序写入这些中断向量中。不仅如此,用户还可以自己更改和完善系统已有的中断向量。 系统级C语言程序设计

20H     8H       8 每1/18.2秒定时器发出的中断
void interrupt (*oldint)();    /*系统定时中断*/
 int count_down=0,count_other=0;  /*中断记时*/

void interrupt newint()  /*设置新的中断程序*/
{ count_down++;
  count_other++;
  oldint();
}

void intenable()        /*设置中断向量表,启动新的中断程序*/
{ oldint=getvect(0x1c);
  disable();
  setvect(0x1c,newint);
  enable();
}

void intrestore()         /*恢复中断向量*/
{ disable();
  setvect(0x1c,oldint);
  enable();
} 这是一个DOS下挂接0X1C中断的例子

应该类似如此吧:

disable()屏蔽中断的宏
原形:void disble(void)
功能:屏蔽中断,只允许从外部设备来的不可屏蔽中断(NMI)。
头文件:dos.h

enable()开硬件中断的宏www.shengfang.org
原形:void enable(void)
功能:开放中断,允许接受任何设备产生的中断。
头文件:dos.h

#define disable( ) __emit__( (char )( 0xfa ) )
#define _disable( ) __emit__( (char )( 0xfa ) ) /* MSC name */
#define enable( )  __emit__( (char )( 0xfb ) )
#define _enable( )  __emit__( (char )( 0xfb ) ) /* MSC name */

__emit__ 函数一般极少用到。其用法如下:www.shengfang.org

void _ _emit_ _(argument, . . .);www.shengfang.org

该函数为C++Builder 的一个内部函数,调用的参数为机器语言指令。它在编译的时侯,将机器语言指令直接嵌入目标码中,不必借助于汇编语言和汇编编译程序。
如果想使用__emit__ 函数,必须熟悉80x86处理器的机器语言指令。如果调用的参数是错误机器语言指令,则程序将非正常运行,并很容易导致死机。

void enable(void) {
 __emit__(0xFB); /* STI */
}
void disable(void) {
 __emit__(0xFA); /* CLI */
}

STI    置中断允许位. PUSHF  标志入栈.
        POPF    标志出栈. CLI    清中断允许位.

#if      OS_CRITICAL_METHOD == 1
#define  OS_ENTER_CRITICAL()  asm  CLI                /* Disable interrupts                            */
#define  OS_EXIT_CRITICAL()   asm  STI                /* Enable  interrupts                            */
#endif

#if      OS_CRITICAL_METHOD == 2
#define  OS_ENTER_CRITICAL()  asm { PUSHF; CLI }        /* Disable interrupts                            */
#define  OS_EXIT_CRITICAL()   asm  POPF               /* Enable  interrupts                            */
#endif


字体:

Permanant URI永久地址 http://www.shengfang.org/blog/p/ucosii3xx.php
Trackback URI引用地址 http://www.shengfang.org/blog/tb.php?tb_id=1122541347

2005年7月28日17:02星期四  [Dev开发] 追踪此文的RSS
提示:
此文还没有评论。

称呼:    登陆   注册
   不注册,但记住我的信息
邮件:
(非必须)
评论: [UBB代码帮助]
粗体 斜体 下划线 链接 水平线 引用



验证码: 请输入你看见的数字
关闭UBB      提交时自动将内容复制到剪贴板

公告
Fire and Motion!

统计信息
[Yippee]||[统计]||日志:1858
在线: 12||用户: 2577 [列表]
今日:401||到访:2886465
Rss:897745||评论:1605

最新日志

最新评论

友情链接

日历
2008 - 08
     12
3456789
10111213141516
17181920212223
24252627282930
31      

最新引用

搜索

归档

杂项
Get RSS Feed (Version 2.0)
Get Atom Feed (Version 0.3)
编码:  UTF-8