




已阅读5页,还剩52页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计报告姓名:傅海平班级:0711班学号:U200714587指导老师:郑然老师完成日期:2010-03-1目录1.设计目的与意义32.设计内容32.1基础编程(熟悉和理解Linux编程环境)32.2内核编程(掌握添加系统调用的方法)32.3设备驱动(掌握添加设备驱动程序的方法)32.4应用与设计(理解和分析/proc文件系统)42.5选作实验43. 实验步骤43.1基础编程(熟悉理解Linux编程环境)43.1.1设计要求43.1.2设计内容43.1.3. 设计步骤4题目一:编写一个C程序,实现文件拷贝功能4题目二:编写一个C程序,使用图形库分窗口显示三个并发进程的运行53.2.内核编程(掌握添加系统调用的方法)83.2.1设计要求83.2.2设计内容83.2.3设计知识8Linux系统调用机制83.2.4. 设计步骤91下载并源码修改92编译内核103编写测试程序113.3设备驱动(掌握添加设备驱动程序的方法)113.3.1设计要求113.3.2设计内容113.3.3. 设计步骤121基本原理122Linux驱动程序编写基本流程:123.字符设备驱动实验步骤133.4应用与设计(理解和分析/proc文件系统)153.4.1设计要求153.4.2设计内容163.4.3设计背景知识161proc文件系统简介162计算系统某些部件利用率的相关方法183.4.4GTK+简介183.4.5GTK环境配置193.4.6部分运行效果201系统信息页面202进程控制页面213图形显示页面224文件系统页面225一些特效236作者信息页面233.4.7实验源码(仅列举部分)234实验体会605参考资料601. 设计目的与意义 掌握Linux操作系统的使用方法 了解Linux系统内核代码结构 掌握实例操作系统的实现方法2.设计内容2.1基础编程(熟悉和理解Linux编程环境)l 要求:熟悉和理解Linux编程环境l 内容:1) 编写一个C程序,实现文件拷贝功能。2) 编写一个C程序,使用Linux下的图形库,分窗口显示三个并发进程的运行。2.2内核编程(掌握添加系统调用的方法)l 要求:掌握添加系统调用的方法l 内容 :1) 采用编译内核的方法,添加一个新的系统调用。2) 编写一个应用程序,测试新添加的系统调用。3) 系统调用的功能:文件拷贝。2.3设备驱动(掌握添加设备驱动程序的方法)l 要求:掌握添加设备驱动程序的方法l 内容: 1) 采用模块方法,添加一个新的设备驱动程序。2) 要求添加字符设备的驱动。3) 编写一个应用程序,测试添加的驱动程序。2.4应用与设计(理解和分析/proc文件系统)l 要求:理解和分析/proc文件l 内容 :1) 了解/proc文件的特点和使用方法。2) 监控系统状态,显示系统中若干部件的使用情况。3) 用图形界面显示系统监控状态。2.5选作实验l 要求:理解和掌握文件系统的设计方法l 内容 :设计、实现一个模拟的文件系统。3. 实验步骤3.1基础编程(熟悉理解Linux编程环境)3.1.1设计要求l 熟悉和理解Linux编程环境3.1.2设计内容 编写一个C程序,实现文件拷贝功能。 编写一个C程序,使用Linux下的图形库,分窗口显示三个并发进程的运行。3.1.3. 设计步骤题目一:编写一个C程序,实现文件拷贝功能源程序如下:#include#include#define NEWFILE (O_WRONLY | O_CREAT | O_TRUNC)/定义新目标文件的打开方式#define MODE600 (S_IRUSR | S_IWUSR | S_IXUSR)/定义目标文件的使用权限:rwx#define size 4096 /定义缓冲区的大小void mycopy(char * infile,char * outfile)char bufsize;int infd,outfd,count;if(infd=open(infile,O_RDONLY)=-1) /以只读方式打开源文件printf(Opening infile failed!n);if(outfd=open(outfile,NEWFILE,MODE600)=-1)/打开目标文件或创建目标文件printf(Opening outfile failed!n);while(count=read(infd,buf,sizeof(buf)0) /读文件到缓冲区if(write(outfd,buf,count)!=count) /写文件到目标文件中printf(Writing data failed!n);if(count=-1)printf(Reading data failed!n);close(infd); /关闭文件close(outfd);int main(int argc, char * argv) mycopy(argv1, argv2); /以命令行的形式调用新文件拷贝命令题目二:编写一个C程序,使用图形库分窗口显示三个并发进程的运行1) 相关背景知识cureses 库最早是由伯克利大学的 Bill Joy 及 Ken Arnold 所发展出来的.当时发展此一函数库主要原因是为了提高程序对不同终端的相容性而设计的。/*Copyright (C) 2010 forhappy*This program is free software; you can redistribute it* and/or modify it under the terms of the GNU General Public License*as published by the Free Software Foundation; either version 2*of the License, or (at your option) any later version.*This is distributed in the hope that it will be useful,*but WITHOUT ANY WARRANTY; without even the implied warranty of*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the*GNU General Public License for more details.*You should have received a copy of the GNU General Public License*along with mw program; if not, write to the Free SoftwareFoundation, Inc.,*51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.*/#include #include #include int main() int ch, i, j = 0, pid1, pid2;WINDOW *alertWindow;WINDOW *p1, *p2, *p3;char strArr780;strcpy(strArr0, ccccc u u rrrrr sssss eeeeee sssss);strcpy(strArr1, c c u u r r s s e s s);strcpy(strArr2, c u u r r s e s);strcpy(strArr3, c u u rrrrrr sssss eeeee sssss);strcpy(strArr4, c u u r r s e s);strcpy(strArr5, c c u u r r s s e s s);strcpy(strArr6, ccccc uuuuu r r sssss eeeeee sssss);initscr();/初始化curses 库if(has_colors() = FALSE) endwin();printf(You terminal does not support colorn);exit(1);start_color(); /启动颜色机制; init_pair(1, COLOR_RED, COLOR_BLACK);attron(COLOR_PAIR(1);attroff(COLOR_PAIR(1);noecho();keypad(stdscr, TRUE);refresh();box(stdscr,ACS_VLINE,ACS_HLINE);/在窗口的四周进行边界装饰for (i = 0; i 7; i+) mvwaddstr(stdscr,8+i, 16, strArri);/在主窗口上显示”CURSES”字样ch = getch();wclear(stdscr);wrefresh(stdscr);pid1 = fork();if (pid1 = 0) p1 = subwin(stdscr, 20, 26, 0, 0);/建立一个指定大小的窗口,长,宽,起始位置box(p1,*,*);/画窗口mvwprintw(p1, 1, 8, WINDOW 1);/在窗口中某一点显示字符串wrefresh(p1);for (i = 0;i 0) pid2 = fork();if (pid2 = 0) p2 = subwin(stdscr, 20, 26, 0, 27);/建立一个指定大小的窗口,长,宽,起始位置box(p2,ACS_VLINE,ACS_HLINE);/画窗口mvwprintw(p2, 1, 8, WINDOW 2);/在窗口中某一点显示字符串wrefresh(p2);for (i = 0;i 0) p3 = subwin(stdscr, 20, 26, 0, 54);/建立一个指定大小的窗口,长,宽,起始位置box(p3,ACS_VLINE,ACS_HLINE);/画窗口mvwprintw(p3, 1, 8, WINDOW 3);/在窗口中某一点显示字符串wrefresh(p3);for (i = 0;i 0) /copy文件if (sys_write(dFile, buf, size) != size)return -3;set_fs(fs); /恢复fs段sys_close(sFile);sys_close(dFile);return 0;2)定义系统调用号,/usr/src/linux/arch/x86/include/asm/unistd.h#define _NR_sys_mycopy 338 /不能与前面已有的重复#define _NR_syscalls 338 /修改系统中所用系统调用数目3)在系统调用向量表里添加自定义的系统调用函数入口位置,具体位置是/usr/src/linux/arch/x86/kernel/syscall_table_32.S,并在最后定义:.long sys_mycopy2编译内核1回到第一步中的命令行窗口中,并输入 “sudo -s ”以获取超级用户权限。2继续在命令行中依次输入如下命令:make mrproper(回车,清除以前的编译痕迹)make xconfig(回车,出现下列配置界面)make(编译内核)make modules_install(安装内核模块)make install(安装内核)mkinitramfa o initrd.img-2.6.33 2.6.33(手动生成initrd文件)3将生成的initrd.img-2.6.33文件移动到/boot目录下:sudo mv initrd.img-2.6.33 /boot4更新grub文件,利用超级用户权限,在命令行输入“update-grub”命令即可。至此,如果中途没有发生任何错误,编译内核就此完成,重启电脑,以新内核启动。3编写测试程序#define _KERNEL_#include unistd.h#include #define _NR_mycopy338int main(int argc, char *argv)long x;if(argc != 3 )printf(2 arguments are requested!n);return -1; x = syscall(338,argv1, argv2 ); /系统调用if(x = 0)printf(Great,copy done successfully!, x);return 0;测试程序执行:复制后的文件3.3设备驱动(掌握添加设备驱动程序的方法)3.3.1设计要求l 掌握添加设备驱动程序的方法3.3.2设计内容1) 采用模块方法,添加一个新的设备驱动程序。2) 要求添加字符设备的驱动。3) 编写一个应用程序,测试添加的驱动程序。3.3.3. 设计步骤1基本原理Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得Linux的设备操作犹如文件一般。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作,如open()、close()、read()、write() 等。 Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的形式进行;而块设备则以整个数据缓冲区的形式进行。字符设备的驱动相对比较简单。 2Linux驱动程序编写基本流程:1.首先是一些版本信息#define _NO_VERSION_#include #include char kernel_version = UTS_RELEASE;2.为了把系统调用和驱动程序关联起来,需要一个非常关键的数据结构:struct file_operations。file_operations结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸 如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。 这是linux的设备驱动程序工作的基本原理。编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域3.简单驱动程序的编写(test.c):a.包含一些基本的头文件。b.编写一些功能函数,比如read(),write()等。这些函数被调用时系统进入和心态。c.定义struct file_operations结构的对象,填充结构体。结构体中功能的顺序不能改变,若一些功能没有实现就用NULL填充,已经实现的功能如 read()、write()分别添加到对应的位置。这步实现的是函数的注册。到这里驱动程序的主体可以说是写好了。现在需要把驱动程序嵌入内核。d.注册设备驱动程序,使用register_chrdev注册字符型设备。函数原型为:int register_chrdev(0, test_name, &test_file_operations)函数返回主设备号,若注册成功返回值大于0。第一个参数:主设备号。第二个参数:注册的设备名。第三个参数:结构体名(设备相关操作方式,驱动程序实际执行操作的函数的指针)。这个函数由int init_module(void)函数调用,这个函数在系统启动时注册到内核时调用。3.字符设备驱动实验步骤1. 首先编写字符设备驱动程序forhappy.c。2. 再编写Makefile文件,内容如下,并与字符设备驱动程序存放在同一目录下obj-m :=forhappy.oPWD:=$(shell pwd)default:$(MAKE) -C /lib/modules/uname -r/build SUBDIRS=$(PWD) modules clean:rm -f *.o *.ko *.mod.crm -f .*.cmdrm -rf .tmp_versions3. 在命令行模式下进入字符设备驱动程序所在目录,并在终端输入“make”命令,如图,生成模块forhappy.ko。4. sudo insmod forhappy.ko(安装字符设备模块)5. cat /proc/devices(查看系统同所分配的) 6. 分配的设备号为:7. mknod /dev/forhappy c 251 08. 编写测试程序测试。设备驱动程序代码:#include #include #include #include #include #include #define DEFAULT_MSG init Hello World!n#define MAXBUF 80static unsigned char hello_bufMAXBUF;static int hello_open (struct inode *inode, struct file *filp);static int hello_release (struct inode *inode, struct file *filp);static ssize_t hello_read (struct file *filp, char _user *buf, size_t count, loff_t *pos);static ssize_t hello_write (struct file *filp, const char _user *buf,size_t count, loff_t *pos);static int hello_open (struct inode *inode, struct file *filp)return 0;static int hello_release (struct inode *inode, struct file *filp)return 0;static ssize_t hello_read (struct file *filp, char _user *buf, size_t count, loff_t *pos)int size = count MAXBUF ? count : MAXBUF;printk(hello: Read Hello World !n);if (copy_to_user(buf, hello_buf, size)return -ENOMEM;return size;static ssize_t hello_write (struct file *filp, const char _user *buf,size_t count, loff_t *pos)int size = count dev, 2);return -ENOMEM;hello_cdev-ops = &hello_fops;hello_cdev-owner = THIS_MODULE;error = cdev_add(hello_cdev, dev, 1);if (error)printk(hello: cdev_add failed!n);unregister_chrdev_region(hello_cdev-dev, 2);cdev_del(hello_cdev);return error;memset (hello_buf, 0, sizeof(hello_buf);memcpy(hello_buf, DEFAULT_MSG, sizeof(DEFAULT_MSG);printk(hello: Hello World!n);return 0;static void _exit hello_exit(void)unregister_chrdev_region(hello_cdev-dev, 2);cdev_del(hello_cdev);printk(hello: Goodbye Worldn);module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE(GPL);3.4应用与设计(理解和分析/proc文件系统)3.4.1设计要求l 理解和分析/proc文件3.4.2设计内容1) 了解/proc文件的特点和使用方法。2) 监控系统状态,显示系统中若干部件的使用情况。3) 用图形界面显示系统监控状态。3.4.3设计背景知识1proc文件系统简介在/proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。可以使用的文件随系统配置的变化而变化。命令procinfo能够显示基于其中某些文件的多种系统信息。以下详细描述/proc下的文件。/proc/cmdline文件这个文件给出了内核启动的命令行。它和用于进程的cmdline项非常相似。/proc/cpuinfo文件这个文件提供了有关系统CPU的多种信息。这些信息是从内核里对CPU的测试代码中得到的。文件列出了CPU的普通型号(386,486,586,686等),以及能得到的更多特定信息(制造商,型号和版本)。文件还包含了以bogomips表示的处理器速度,而且如果检测到CPU的多种特性或者bug,文件还会包含相应的标志。这个文件的格式为:文件由多行构成,每行包括一个域名称,一个冒号和一个值。/proc/devices文件这个文件列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。/proc/dma文件这个文件列出由驱动程序保留的DMA通道和保留它们的驱动程序名称。casade项供用于把次DMA控制器从主控制器分出的DMA行所使用;这一行不能用于其它用途。/proc/filesystems文件这个文件列出可供使用的文件系统类型,一种类型一行。虽然它们通常是编入内核的文件系统类型,但该文件还可以包含可加载的内核模块加入的其它文件系统类型。/proc/interrupts文件这个文件的每一行都有一个保留的中断。每行中的域有:中断号,本行中断的发生次数,可能带有一个加号的域(SA_INTERRUPT标志设置),以及登记这个中断的驱动程序的名字。可以在安装新硬件前,像查看/proc/dma和/proc/ioports一样用cat命令手工查看手头的这个文件。这几个文件列出了当前投入使用的资源(但是不包括那些没有加载驱动程序的硬件所使用的资源)/proc/ioports文件这个文件列出了诸如磁盘驱动器,以太网卡和声卡设备等多种设备驱动程序登记的许多I/O端口范围。/proc/kcore文件这个文件是系统的物理内存以core文件格式保存的文件。例如,GDB能用它考察内核的数据结构。它不是纯文本,而是/proc目录下为数不多的几个二进制格式的项之一./proc/kmsg文件这个文件用于检索用printk生成的内核消息。任何时刻只能有一个具有超级用户权限的进程可以读取这个文件。也可以用系统调用syslog检索这些消息。通常使用工具dmesg或守护进程klogd检索这些消息。/proc/ksyms文件这个文件列出了已经登记的内核符号;这些符号给出了变量或函数的地址。每行给出一个符号的地址,符号名称以及登记这个符号的模块。程序ksyms,insmod和kmod使用这个文件。它还列出了正在运行的任务数,总任务数和最后分配的PID。/proc/loadavg文件这个文件给出以几个不同的时间间隔计算的系统平均负载,这就如同uptime命令显示的结果那样。前三个数字是平均负载。这是通过计算过去1分钟,5分钟,15分钟里运行队列中的平均任务数得到的。随后是正在运行的任务数和总任务数。最后是上次使用的进程号。/proc/locks文件这个文件包含在打开的文件上的加锁信息。文件中的每一行描述了特定文件和文档上的加锁信息以及对文件施加的锁的类型。内核也可以需要时对文件施加强制性锁。/proc/mdstat文件这个文件包含了由md设备驱动程序控制的RAID设备信息。/proc/meminfo文件这个文件给出了内存状态的信息。它显示出系统中空闲内存,已用物理内存和交换内存的总量。它还显示出内核使用的共享内存和缓冲区总量。这些信息的格式和free命令显示的结果类似。/proc/misc文件这个文件报告用内核函数misc_register登记的设备驱动程序。/proc/modules文件这个文件给出可加载内核模块的信息。lsmod程序用这些信息显示有关模块的名称,大小,使用数目方面的信息。/proc/mounts文件这个文件以/etc/mtab文件的格式给出当前系统所安装的文件系统信息。这个文件也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。/proc/pci文件这个文件给出PCI设备的信息。用它可以方便地诊断PCI问题。你可以从这个文件中检索到的信息包括诸如IDE接口或USB控制器这样的设备,总线,设备和功能编号,设备延迟以及IRQ编号。/proc/stat文件这个文件包含的信息有CPU利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间(自1970年1月1日起的秒数)。/proc/uptime文件这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲。这主要供uptime程序使用。比较这两个数字能够告诉你长期来看CPU周期浪费的比例。/proc/version文件这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息。/proc/net子目录此目录下的文件描述或修改了联网代码的行为。可以通过使用arp,netstat,route和ipfwadm命令设置或查询这些特殊文件中的许多文件。2计算系统某些部件利用率的相关方法1、处理器使用率在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是 1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔计算处理器使用率应从/proc/stat中提取四个数据:用户模式处理器时间(user)、低优先级的用户模式处理器时间(nice)、内核模式处理器时间(system)以及空闲的处理器时间(idle)。它们均位于/proc/stat文件的第一行。CPU的利用率使用如下公式来计算。 CPU利用率=100 *(user + nice + system)/(user + nice + system + idle)2、内存使用率计算内存使用率应从/proc/meminfo文件中提取两个数据,当前内存的使用量(cmem)以及内存总量(amem)。 内存使用百分比 = 100 * (cmem / umem)3、流入流出数据包为了得到网络利用率的相关数据,需要从/proc/net/dev文件中获得两个数据:从本机输出的数据包数,流入本机的数据包数。它们都位于这个文件的第四行。性能收集程序开始记录下这两个数据的初始值,以后每次获得这个值后均减去这个初始值即为从集群启动开始从本节点通过的数据包。利用上述数据计算出网络的平均负载,方法如下: 平均网络负载 = (输出的数据包+流入的数据包) / 24、CPU温度计算CPU温度数据存放在/proc/acpi/thermal_zone/TZS0/temperature文件中,只要获取其中的数据显示即可。3.4.4GTK+简介GTK(GIMP Toolkit)是一套跨多种平台的图形工具包,按LGPL许可协议发布的。虽然最初是为GIMP写的,但目前已发展为一个功能强大、设计灵活的一个通用图形库。特别是被GNOME选中使得GTK+广为流传,成为Linux下开发图形界面的应用程序的主流开发工具之一,当然GTK+并不要求必须在Linux上,事实上,目前GTK+已经有了成功的windows版本。GTK虽然是用C语言写的,但是您可以使用你熟悉的语言来使用GTK,因为GTK+已经被绑定到几乎所有流行的语言上,如:C+,PHP, Guile, Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel。3.4.5GTK环境配置一、准备工作 1、GTK+2.6及相关源码包的下载!atk-1.9.0.tar.bz2、tiff-v3.6.1.tar.z、pkgconfig-0.15.0.tar.gz、libpng-1.2.8.tar.bz2 、jpegsrc.v6b.tar.gz、glib-2.6.4.tar.bz2、gtk+-2.6.6.tar.bz2、pango-1.8.1.tar.bz2、freetype-2.1.8.tar.bz2、fontconfig-2.3.1.tar.gz二、源码包的安装及次序:a、首先安装pkgconfig./configure -prefix=/usr &make &make install把下面的话加到你的系统或用户设置文件中:export PKG_CONFIG_PATH=/usr/X11R6/lib/pkgconfig最好/sbin/ldconfig一下,以后每安一个软件就/sbin/ldconfig一下,保险点.b、 安装glib2.4./configure -prefix=/usr &make &make install/sbin/ldconfigc、安装atk1.9./configure -prefix=/usr &make &make install/sbin/ldconfigd、 安装freetype-2.1.8./configure -prefix=/usr &make &make install/sbin/ldconfige、 安装pango 1.8.1export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig./configure -prefix=/usr -sysconfdir=/etc &make &make install/sbin/ld
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国际贸易实务模拟练习题(附答案)
- 医师定期考核临床模拟练习题及参考答案
- 2025中小学教师入编考试公共基础知识题库与答案
- 2025年《学前教育学》期末测试题及答案
- 2024年湖南公务员考试申论真题及答案
- 标准基础知识培训教材课件
- 2024年院感培训考核试题附答案
- 化验室专业知识培训简讯课件
- 上海某超级豪宅设计方案
- 呼吸机应用试题(附答案)
- 《矿山机电安全管理》课件
- 室分分布系统原理及方案
- 《撬装一体式水电解制氢储氢加氢装置安全技术规范》
- 2025年国家电网公司招聘笔试参考题库含答案解析
- “医养结合嵌入式”养老模式的必要性、困境与对策研究
- 企业计量管理制度模版(2篇)
- 《培训电气基础知识》课件
- 有关化工厂设备培训内容
- 中医科医疗质量管理制度
- 西门子S7-1500 PLC技术及应用 课件 第3章 S7-1500 PLC 的硬件配置
- 湖南省名校联合体2024-2025学年高三上学期入学摸底考试物理试卷
评论
0/150
提交评论