当82C59A工作于_________方式时,需要在中断服务完成后发中断结束命令。
时间: 2024-04-02 17:34:31 浏览: 81
当82C59A工作于“非自动结束方式”时,需要在中断服务完成后发送“中断结束命令”(EOI)给8259A,以通知8259A中断服务已经完成,可以重新接受中断请求了。在“非自动结束方式”下,中断控制器不会自动发送EOI命令,需要由程序员在中断服务程序中手动发送EOI命令。而当82C59A工作于“自动结束方式”时,则不需要手动发送EOI命令,中断服务程序执行完成后,中断控制器会自动发送EOI命令。
相关问题
A、B两台PC机利用辅串口进行点-点双工通信(不用联络线),A机发送、接收均采用查询方式,B机发送采用查询方式,接收采用中断方式。要求一帧字符7个数据位,2个停止位,偶校验,通信速率为2400波特(分频系数为0030H)。 ① 画出两台计算机RS232C口间的连线,并标明端子名称和端子号。 ② 用对端口直接编程的方法为A机编写8250初始化程序段。 ③ 用对端口直接编程的方法编写B机8250初始化程序段。 ④ 现通过A机发送一个字符 'E' 给B机。为A机写出使用查询方式发送的程序段。 ⑤ 针对于B机,编写子程序将其接收字符的中断服务程序SERVICE的入口地址写入中断向量表中。
①连线图如下:
A机 B机
TxD----------------------RxD
RxD----------------------TxD
GND----------------------GND
其中,A机的串口端口名称和端子号为COM1,B机的串口端口名称和端子号为COM2。
② A机8250初始化程序段如下:
```
MOV AL, 00H ; 复位芯片
OUT 3F8H, AL ; 发送初始化命令
MOV AL, 80H ; 设置波特率发生器
OUT 3F8H, AL ; 发送波特率高字节
MOV AL, 30H ; 设置波特率发生器
OUT 3F9H, AL ; 发送波特率低字节
MOV AL, 03H ; 设置帧格式:7个数据位,2个停止位,偶校验
OUT 3F8H, AL ; 发送帧格式命令
RET ; 初始化结束返回
```
③ B机8250初始化程序段如下:
```
MOV AL, 00H ; 复位芯片
OUT 2F8H, AL ; 发送初始化命令
MOV AL, 80H ; 设置波特率发生器
OUT 2F8H, AL ; 发送波特率高字节
MOV AL, 30H ; 设置波特率发生器
OUT 2F9H, AL ; 发送波特率低字节
MOV AL, 03H ; 设置帧格式:7个数据位,2个停止位,偶校验
OUT 2F8H, AL ; 发送帧格式命令
MOV AL, 01H ; 开启接收中断
OUT 2F9H, AL ; 发送中断控制命令
RET ; 初始化结束返回
```
④ A机使用查询方式发送字符 'E' 的程序段如下:
```
CALL INIT_A ; 初始化A机串口
MOV DX, 3F8H ; 设置串口端口地址
MOV AL, 'E' ; 准备发送的字符
WAIT_SEND:
IN AL, DX+5 ; 查询发送缓冲区状态
AND AL, 20H ; 判断发送缓冲区是否为空
JZ WAIT_SEND ; 如果不为空则等待
OUT DX, AL ; 发送字符
RET ; 发送结束返回
```
其中,INIT_A 为A机的串口初始化程序入口地址。
⑤ B机接收中断服务程序SERVICE的入口地址写入中断向量表中的程序段如下:
```
MOV AX, SEG SERVICE ; 获取SERVICE子程序所在的段地址
MOV DS, AX ; 将段地址保存到DS寄存器中
MOV AX, OFFSET SERVICE ; 获取SERVICE子程序的偏移地址
MOV WORD PTR [09*04], AX ; 将偏移地址写入中断向量表中
MOV WORD PTR [09*04+2], DS ; 将段地址写入中断向量表中
MOV AL, 0B8H ; 开启串口接收中断
OUT 21H, AL ; 发送中断控制命令给主芯片
MOV AL, 00000100B ; 开启串口接收中断
OUT 2F8H+1, AL ; 发送中断控制命令给8259A从芯片
IRET ; 返回
```
其中,SERVICE 是B机的串口接收中断服务程序的入口地址。
编写一段程序,使用系统调用函数fork( )创建两个子进程,再用系统调用函数signal( )让父进程捕捉信号SIGINT(用kill命令来触发),当捕捉到中断信号后,父进程用系统调用函数kill( )向两个子进程发出信号,子进程捕捉到父进程发来的信号后,分别输出下列信息后终止
在C语言中,你可以编写如下的程序来实现这个功能:
```c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#define HANDLE_SIGNAL(sig) \
do { \
printf("Parent caught signal %d, sending SIGINT to children\n", sig); \
pid_t child_pid = waitpid(-1, NULL, WNOHANG); \
if (child_pid > 0) { \
kill(child_pid, SIGINT); \
printf("Sent SIGINT to child process with PID %d\n", child_pid); \
} \
} while (0)
void handler(int signum) {
HANDLE_SIGNAL(signum);
}
int main() {
// Register the signal handler for SIGINT
signal(SIGINT, handler);
// Fork two child processes
pid_t pid1 = fork();
if (pid1 == 0) {
printf("Child process 1 started, PID: %d\n", getpid());
// Child process does its work and exits after some time
sleep(5);
printf("Child process 1 exiting...\n");
_exit(0); // Use _exit instead of exit to avoid a core dump in the parent
}
pid_t pid2 = fork();
if (pid2 == 0) {
printf("Child process 2 started, PID: %d\n", getpid());
// Same as child process 1
sleep(5);
printf("Child process 2 exiting...\n");
_exit(0);
}
// Wait for one of the children to finish before continuing
wait(NULL);
return 0;
}
```
在这个程序中,我们首先注册了一个SIGINT信号处理函数`handler`。当父进程接收到SIGINT信号时,它会调用`HANDLE_SIGNAL`函数,通过`waitpid`等待其中一个孩子结束并发送SIGINT给它们。然后,每个孩子在接收到SIGINT后将输出相关信息并退出。
阅读全文