版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验内容三设备驱动移植一、实验目的 (1)了解LCD显示原理及其与S3C2410的接口(2)了解S3C2410的LCD控制器(3)掌握基于帧缓冲设备的LCD驱动程序结构及移植过程二、实验内容 在上次实验的基础上,通过修改内核显示相关文件,达到驱动LCD显示屏的目的。 三、实验步骤 (1)实验准备从网上下载Linux的最新版本,解压后可以看到它的全部源代码,我们这里以linux-2.6.24为例,实现Linux的内核移植。 mkdir -p /arm2410/kernelcd /arm2410/kernelwget 10/crosstool/linux-2.6.2
2、4.tar.bz2tar -xvjf linux-2.6.24.tar.bz2 cd linux-2.6.24(2)修改顶层Makefile在顶层Makefile中先要定义交叉编译器,这里就使用我们第一次实验中构建的交叉编译器。查找ARCH,在193行左右修改确认ARCH和CROSS_COMPILE的值ARCH ?=armCROSS_COMPILE ?= arm-linux-如果学生机上没有交叉编译环境,先从教师机上下载交叉编译环境 wget 10/u-boot/arm-linux-gcc.tar.bz2 tar -xjvf arm-linux-gcc.tar.
3、bz2 -C /为了方便使用arm-linux-gcc,我们可以把它所在的目录添加到环境变量中gedit /etc/profile在export PATH前面加上PATH=/arm2410/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/bin/:$PATH这样一句,以后启动就可以直接使用arm-linux-gcc了。要使环境变量立马生效,可以使用下面的命令。source /etc/profile(3)设置Nand Flash分区信息表设置Nand Flash的分区信息表是为内核启动以后加载文件系统用的,可以将Nand Flash看成我们PC机的硬盘,对Na
4、nd Flash的分区看成是对硬盘的分区,硬盘可以分成C盘,D盘之类,而Nand Flash则可以分成很多块,每块有不同的名字、大小和用途。下面是对Super-ARM实验箱的Nand Flash进行分区的情况(参考表5-1-1):Ø 第0块命名为"uboot",它用来存放u-boot.bin映像,起始地址是Nand Flash的0x000000,最大0x30000个字节;Ø 第1块命名为"kernel",用来存放内核,起始地址是Nand Flash的0x30000,最大0x1D0000个字节;Ø 第2块命名为"ro
5、otfs",用来存放根文件系统,起始地址是Nand Flash的0x200000,最大30M字节;Ø 第3块命名为"ext-fs1",留给用户存放其他文件系统,起始地址是Nand Flash的0x2000000,最大32M字节;至于具体要怎么分,这样根据你的目标机的Nand Flash来定,不能一概而论。分区的方法就是修改arch/arm/plat-s3c24xx目录下的common-smdk.c文件:执行gedit arch/arm/plat-s3c24xx/common-smdk.c命令,找到:static struct mtd_partition
6、smdk_default_nand_part,在其中填入下面的内容(将原来的内容覆盖)0 = .name= "uboot",.size= 0x30000,.offset= 0,1 = .name= "kernel",.offset = 0x30000,.size= 0x1D0000,2 = .name= "rootfs",.offset = SZ_2M,.size= SZ_1M*30,3 = .name= "ext-fs1",.offset= SZ_32M,.size= SZ_32M,(4)进入内核顶层目录,修改a
7、rch/arm/mach-s3c2410/mach-smdk2410.c文件Ø 第一处:添加下面的头文件#include <asm/arch-s3c2410/fb.h>#include <linux/fb.h>#include <asm/arch/regs-lcd.h>#include <asm/arch/regs-gpio.h>Ø 第二处:添加s3c2410fb_display 结构static struct s3c2410fb_display smdk2410_lcd_cfg _initdata = .lcdcon5 =
8、S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVFRAME | S3C2410_LCDCON5_PWREN | S3C2410_LCDCON5_HWSWP,.type = S3C2410_LCDCON1_TFT,.width = 240,.height = 320,.pixclock = 98619, / 10.14MHZ.xres = 240,.yres = 320,.bpp = 16,.left_margin =16,.right_margin = 7,.hsync_len = 14,.uppe
9、r_margin = 2,.lower_margin = 3,.vsync_len = 2,;上面这些参数的值都来自表13-1-4,计算方法如下:l xres = LINEVAL + 1l yres = HOZVAL + 1l pixclock = (1/hclk) ×1012 其中Super-ARM的hclk是10.14Mhzl left_margin = HFPD + 1l right_margin = HBPD + 1l hsync_len = HSPW+1l upper_margin = VBPD +1l lower_margin = VFPD+1l vsync_len =
10、VSPW+1Ø 第三处:添加s3c2410fb_mach_info 结构static struct s3c2410fb_mach_info添加 smdk2410_fb_info _initdata = .displays = &smdk2410_lcd_cfg,.num_displays = 1, .default_display = 0, .gpccon = 0xaaa556a9, .gpccon_mask = 0xfff003fc, .gpcup= 0x0000ffff, .gpcup_mask= 0xffffffff, .gpdcon = 0xaa95aaa5, .gp
11、dcon_mask = 0xffc0fff0, .gpdup = 0x0000ffff, .gpdup_mask = 0xffffffff, .lpcsel = 0x4,;关于gpccon,gpcup,gpdcon,gpdup的设置参考表13-2-13,gpccon_mask,gpcup_mask,gpdcon_mask,gpdup_mask的设置也很简单,如果某个端口配置成LCD功能,就把该端口对应的位都设置成1,其它没用的就设为0。Ø 第四处:在函数smdk2410_init()中加入下面一行s3c24xx_fb_set_platdata(&smdk2410_fb_inf
12、o);我跟大家分析一下添加这些代码的具体作用。首先看smdk2410_fb_info(第三处),它是s3c2410fb_mach_info类型的结构体,这个结构体有一个displays的成员变量,它指向s3c2410fb_display类型的指针。之前说过,一个系统有多少个显示设备就对应多少个s3c2410fb_display的结构,Super-ARM只有一个LCD显示设备,所以就只定义了一个s3c2410fb_display结构体smdk2410_lcd_cfg(第二处),那么displays就指向这个结构体,同时将num_displays赋值1。最后通过s3c24xx_fb_set_pla
13、tdata函数将smdk2410_fb_info传递给底层LCD驱动。(5)添加devfs文件系统支持为了我们的内核支持devfs,以及在启动时能自动挂载/dev。编辑fs/Kconfig:在907105行menu "Pseudo filesystems"下面添加如下代码:config DEVFS_FS bool "/dev file system support (OBSOLETE)" default y config DEVFS_MOUNT bool "Automatically mount at boot" default y
14、depends on DEVFS_FS (5)配置内核首先执行make s3c2410_defconfig命令获取s3c2410_defconfig文件中给定的配置。然后执行make menuconfig命令配置内核make s3c2410_defconfigmake menuconfig将出现以下图形配置界面:Ø 第一项:选择设备CPU类型在这个选单中,选择system type ->s3c2410 machines中的smdk2410,其它的arch-machines全部取消。这个页面选择s3c2410 Machines ->这个页面把其它machines全部取消。&
15、#216; 第二项:添加S3C2410 LCD驱动支持进入Device drivers->Graghics support->Support for frame buffer devices ,出现下面的界面,选中S3C2410 LCD framebuffer support 和 S3C2410 lcd debug messages 两个选项。图13-4-1 添加s3c2410 LCD驱动Ø 第三项:Bootup logo配置Bootup logo是为了在内核加载完LCD驱动后在LCD屏上看到一个小企鹅。进入Device drivers->Graghics supp
16、ort->Bootup logo,出现下面的界面,三个不同的logo选项对应不同的小企鹅图片,可以到内核的drivers/video/logo目录下找到对应的图片,读者可以根据自己的喜好随便选择一个。Ø 第四项:退出保存设置退出时候记得选择yes进行保存(6)配置文件系统 为arm系统制作根文件系统的详细过程描述如下。1、首先建立一个空根目录我们的项目空间中将根文件系统规划在rootfs目录下,这个目录现在是空的,就把它作为我们的空根目录,接下来我们就在这个目录下建立根文件系统。2、在rootfs中建立文件系统的目录结构,所有命令如下:mkdir -p /arm2410/roo
17、tfs cd /arm2410/rootfsmkdir bin dev etc lib proc sbin sys usr mnt tmp var chmod 0777 tmp mkdir usr/bin usr/lib usr/sbin lib/modules mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/log var/run var/tmp chmod 0777 var/tmp Ø 第一行创建根文件系统目录。Ø 第二行进入根文件系统目录。Ø 第三行
18、在根目录下创建一级目录bin dev etc lib proc sbin sys usr mnt tmp var。Ø 第四行更改tmp权限,使得用户只能修改、删除自己在本目录下创建的文件。Ø 第五行创建usr目录下的子目录Ø 第六行创建mnt目录下的子目录。Ø 第七行创建var目录下的子目录。Ø 第八行更改var/tmp目录的权限。3、创建设备文件先了解一下Linux的设备:Linux中主要有2种类型的设备:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。每个设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱
19、动程序)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备")。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号。你可以在你的宿主机上执行这个命令看看你的宿主机所拥有的设备文件,可以看到,Linux有很多很多的设备文件,在嵌入式Linux中并没有这么多的设备,下面用mknod命令创建一些主要设备文件。关于Linux的设备号:很多设备在Linux下已经有默认的主次设备号,如帧缓冲设备是Linux的标准字符
20、设备,主设备号是29,如果Linux下有多个帧缓冲设备,那么这些帧缓冲设备的次设备号就从031(Linux最多支持32个帧缓冲设备)进行编号,比如fb0对应的次设备号就是0,fb1为1,类推。用户也可以创建自己的设备文件,比如下一篇章中我们要讨论的Led设备,需要注意的是用户自己的设备号不能与一些标准的系统设备号重叠。Linux下创建设备节点的命令是mknod,下面是它的命令格式:mknod Name b | c Major MinorName是设备名称,“b”或“c”用来指定设备的类型是块设备还是字符设备。Major指定设备的主设备号,Minor是次设备号。下面我们来创建嵌入式Linux系统
21、中一些基本的设备文件,必须是root权限,命令如下:1 mknod -m 600 dev/console c 5 1 2 mknod -m 666 dev/null c 1 3 3 mknod dev/fb0 c 29 0 4 mknod dev/tty c 5 0 5 mknod dev/tty0 c 4 0 mknod dev/tty1 c 4 1mknod dev/tty2 c 4 2mknod dev/tty3 c 4 3mknod dev/tty4 c 4 46 ln -s dev/fb0 dev/fb Ø 第一行创建系统控制台设备Ø 第二行创建空设备,任何写入都
22、将被丢弃,任何读取都得到EOFØ 第三行创建第一个帧缓冲设备Ø 第四行创建TTY设备Ø 第五行创建当前虚拟控制台Ø 第六行创建创建fb到fb0的链接4、准备启动配置文件Linux启动所需要的文件有etc/inittab、etc/init.d/rcS、etc/fstab这三个文件(以下均假定当前路径在/arm2410/rootfs)。下面创建inittab文件,命令:gedit etc/inittab, 在文件中添加如下内容::sysinit:/etc/init.d/rcS:askfirst:-/bin/sh:respawn:-/bin/sh:restar
23、t:/sbin/init :ctrlaltdel:/sbin/reboot:shutdown:/bin/umount -a -r:shutdown:/sbin/swapoff -a分析该配置文件,可以知道init进程首先执行/etc/init.d/rcS脚本文件,该文件马上就会被创建。Ø rcS创建rcS文件,命令:mkdir etc/init.dgedit etc/init.d/rcS 在文件中添加如下内容:#!/bin/sh# mount all filesystem defined in "fstab"echo "#mount all."
24、/bin/mount -a更改该文件的权限:chmod 775 etc/init.d/rcS刚刚说到rcS文件是init进程执行的初始化命令脚本,在该文件中,笔者只加了一条命令:“/bin/mount -a”,用来加载fstab文件中定义的文件系统,fstab文件马上就被会创建。Ø fstab首先来看看/etc/fstab文件的作用,该文件存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount /directoryname"命令来加载一个文件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、mount、um
25、ount的等命令都利用该程序。fstab文件格式如下:fs_spec fs_file fs_type fs_options fs_dump fs_passl fs_spec:该字段定义希望加载的文件系统所在的设备或远程文件系统,对于NFS情况,格式一般为<host>:<dir>,例如:11:/armnfs'。对于procfs,使用proc'来定义。l fs_file:该字段描述文件系统所希望加载的目录点,对于swap设备,该字段为none;对于加载目录名包含空格的情况,用40来表示空格。l fs_type:定义了该设备上的文件系统
26、类型。l fs_options - 指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。对于大多数系统使用"defaults"就可以满足需要。l fs_dump:该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0。l fs_pass:该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0。下面创建fstab文件,命令:gedit etc/fstab,
27、 在该文件中添加如下内容:proc /proc proc defaults 0 0none /tmp ramfs defaults 0 0sysfs /sys sysfs defaults 0 0 (5)利用BusyBox安装命令工具Ø 下载并解压BusyBox下载busybox-1.9.2.tar.bz2(地址:解压busybox-1.9.2.tar.bz2,并进入解压后的busybox-1.9.2目录cd /arm2410/sysapp/wget 10/busybox-1.9.2.tar.bz2tar -jxvf busybox-1.9.2.tar
28、.bz2cd busybox-1.9.2Ø 修改MakefileARCH := armCROSS_COMPILE:= arm-linux-这个步骤太熟悉了,没有再解释的必要了。Ø 配置busybox首先恢复默认配置,然后在默认配置的基础上根据需要更改busybox的配置make defconfigmake menuconfig配置busybox就是选择需要的命令。一定要选择Shells里面的ash(图7-2-1)以及Init utilities里面的init(图7-2-2),一般情况下,执行了make defconfig命令以后,这两项已经被选择了,这里提出来希望引起大家的
29、注意。图7-2-1 选择ash图7-2-2 配置init另外还需要注意的配置有以下几项:第一项:Busybox Setting->build option-> Build BusyBox as a static binary (no shared libs) * Build shared libbusybox * Produce a binary for each applet, linked against libbusybox * Produce additional busybox binary linked against libbusybox Build with Lar
30、ge File Support (for accessing files > 2 GB) 这里有必要解释一下前面的两个选项:第一个选项是是建立静态程序库,静态库就是一些目标文件的集合,以.a结尾。静态库在程序链接的时候使用,链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中。一旦链接完成,在执行程序的时候就不需要静态库了。由于每个使用静态库的应用程序都需要拷贝所用函数的代码,所以静态链接的文件会比较大,我们不选。第二个选项是建立共享库,共享库以.so结尾。共享库 (so = share object) 在程序的链接时候并不像静态库那样拷贝使用函数的代码,而只是作些标记。然后在程序
31、开始启动运行的时候,动态地加载所需模块。所以,应用程序在运行的时候仍然需要共享库的支持。 共享库链接出来的文件比静态库要小得多,因此,我们选择这个选项。第二项:Busybox Setting->installation option-> * Don't use /usr Applets links (as soft-links) -> (./_install) BusyBox installation prefix 第三项:Busybox Setting->Busybox Library Tuning -> (6) Minimum password len
32、gth (2) MD5: Trade Bytes for Speed * Faster /proc scanning code (+100 bytes) * Support for /etc/networks * Command line editing (1024) Maximum length of input * Additional editing keys * vi-style line editing commands (15) History size History saving * Tab completion * Username completion * Fancy sh
33、ell prompts (4) Copy buffer size, in kilobytes Use clock_gettime(CLOCK_MONOTONIC) syscall * Use ioctl names rather than hex values in error messages 第四项:Linux Module Utilities ->* insmod * Enable load map (-m) option * Symbols in load map * rmmod * lsmod * lsmod pretty output for 2.6.x Linux kern
34、els * modprobe Multiple options parsing Fancy alias parsing- Options common to multiple modutils Support tainted module checking with new kernels Support version 2.2.x to 2.4.x Linux kernels* Support version 2.6.x Linux kernels其他的Busybox选项采用默认设置,配置完成后,保存退出。Ø 编译busyboxmakeØ 安装BusyBox中的工具到根文
35、件系统busybox编译成功以后,将其编译生成的命令工具安装到根文件系统中,采用如下命令:make CONFIG_PREFIX=/arm2410/rootfs install其中,CONFIG_PREFIX用来指定安装路径,这里是根文件系统的目录。若安装成功,会有如下信息:-You will probably need to make your busybox binarysetuid root to ensure all configured applets willwork properly.-安装完成后会在/arm2410/rootfs目录下生成linuxrc文件,再去bin和sbin目
36、录下看看,是不是多了很多文件呢,这些都是BusyBox编译生成的命令工具。Ø 修改bin/busybox的属性,命令如下:cd /arm2410/rootfs/binchmod 4755 busybox7、 复制常用的库文件到/arm2410/rootfs/lib/目录下8、制作cramfs文件系统进入目录/arm2410/,将制作好的根文件系统rootfs压缩成cramfs格式的映像文件。cd /arm2410/mkcramfs rootfs arm2410.cramfs也可以将制作好的映像文件再解压到某个目录下,比如将arm2410.cramfs解压到rootfs2410目录下,
37、可以用下面的命令:cramfsck -x rootfs2410 arm2410.cramfs 执行这条命令会自动建立rootfs2410的目录,然后将arm2410.cramfs的内容释放到该目录下。(8)配置内核参数,使它支持NandFlash上的文件系统要将文件系统烧写到Flash中,然后挂载Flash中的文件系统。这时,这个命令行参数就要变身为下面的形式了:noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200cd /arm2410/kernel/linux-2.6.24make menuconfig在Boot
38、options -> Default kernel command string中输入上面的命令行参数,如下图示:图7-6-1 配置内核命令行参数配置完内核以后保存退出,执行make zImage命令重新编译内核,生成内核映像zImage。(11)烧写到开发板启动到u-boot的环境下,通过tftp对它进行烧写。四、实验结果 将U-Boot烧写到目标机的Flash之后,用串口线将目标机与宿主机连接起来,进入宿主机Linux系统,运行minicom,再打开目标机电源,如果U-Boot烧写成功,会看到下面的提示信息:U-Boot 1.1.6 (Oct 19 2009 - 03:01:55)D
39、RAM: 64 MBFlash: 512 kBNAND: 64 MBIn: serialOut: serialErr: serialHit any key to stop autoboot: 5 通过它,就可以不用仿真器实现对linux内核的烧写,实现后面的开发过程。(1)下载zImage到开发版 则敲入“tftp 0x31000000 zImage”这条命令,这时U-Boot就会从宿主机上下载zImage文件,将其放在目标机以0x31000000为首地址的内存(RAM)区中。下面就是笔者在开发过程中执行 “tftp 0x310000000 zImage”命令后输出的内容:SuperARM #
40、 tftp 0x310000000 zImageTFTP from server 11; our IP address is 12Filename 'zImage'.Load address: 0x80000Loading: # # # # #doneBytes transferred = 1576704 (180f00 hex)这里最后一行还可以看到下载文件的大小,这个参数很有用,如果你要将这个文件写到NandFlash中,就必须知道文件的大小,那时就需要参考这个参数。(2)nand SuperARM # help nandna
41、nd info - show available NAND devicesnand device dev - show or set current devicenand read.jffs2s addr off sizenand write.jffs2 addr off size - read/write size' bytes starting at offset off' to/from memory address addr'nand erase clean off size - erase size' bytes from offset off'
42、; (entire device if not specified)nand bad - show bad blocksnand read.oob addr off size - read out-of-band datanand write.oob addr off size - read out-of-band datanand下面列了很多的子命令,如nand info,nand read,nand write,nand erase,nand bad等。这些命令都是用来操作NandFlash的。分别解释如下:Ø SuperARM # nand infoDevice 0: Sams
43、ung unknown 64Mb at 0x4e000000 (64 MB, 16 kB sector)执行nand info命令,输出上面一行,这里列出了Super-ARM上NandFlash的容量、段大小等详细信息。Ø SuperARM # nand badDevice 0 bad blocks:执行nand bad命令,用来检查目标机上NandFlash有没有坏块Ø SuperARM # nand erase 0x30000 0x190000NAND erase: device 0 offset 196608, size 1638400 .OK nand erase命
44、令是用来擦除一片NandFlash区的,第一个参数是待擦除区域的起始地址,第二个参数是待擦除区域的大小。比如执行“nand erase 0x30000 0x190000”命令以后会将NandFlash的从0x30000开始,大小为0x190000的这一块内容给擦除掉。Ø SuperARM # nand write 0x31000000 0x30000 0x190000NAND write: device 0 offset 196608, size 1638400 .1638400 bytes written: OKnand write 命令用来将内存中的内容写到NandFlash,第
45、一个参数是待写内容在内存中的起始地址,第二个参数待写NandFlash的起始地址,第三个参数是待写NandFlash区域的大小。不过要注意每次在写NandFlash之前都要擦除。举例来说,在执行了“tftp 0x310000000 zImage”和“nand erase 0x30000 0x190000”命令后,再执行“nand write 0x31000000 0x30000 0x190000”便会将内核写到NandFlash的从0x30000开始,大小为0x190000的区域。这里的0x190000参数就是参考内核的大小写的,通过tftpboot命令我们能够得到zImage文件的大小(如
46、180f00 hex),那么在擦除NandFlash时就要擦除一片比该文件大的区域,而且这块区域的大小必须是NandFlash的块大小(Super-ARM的是16KB)的整数倍。Ø SuperARM # nand read 0x31000000 0x30000 0x190000NAND read: device 0 offset 196608, size 1638400 .1638400 bytes read: OKnand read 命令与nand write 命令的参数是同样的意思,只是nand read是从NandFlash读到内存中。(3)go SuperARM # help gogo addr arg . - start application at address 'addr' passing 'arg' as argumentsgo 命令可以执行应用程序。第一个参数是要执行程序的入口地址。第二个可选参数是传递给程序的参数,可以不用。使用go命令可以用来引导内核,比如在执行完tftp 0x31000000 zImage命令以后,内核映像已经在内存的0x31000000地址了,这时我们执
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年宿州市立医院医护人员招聘考试备考试题及答案详解
- 2026年吉林市第三人民医院医护人员招聘考试参考题库及答案详解
- 2026年荆州市中医医院医护人员招聘笔试参考试题及答案详解
- 2026年首都医科大学附属北京地坛医院医护人员招聘考试参考试题及答案详解
- 2026年湖南省老年医院医护人员招聘笔试备考试题及答案详解
- 2026年内江市第一人民医院医护人员招聘笔试参考题库及答案详解
- 2026年南阳市张仲景医院医护人员招聘笔试参考试题及答案详解
- 2026年上饶市卫校附属医院医护人员招聘考试备考试题及答案详解
- 2026年武汉科技大学附属天佑医院医护人员招聘考试备考试题及答案详解
- 2026年铜陵市皮肤病防治所医护人员招聘考试备考题库及答案详解
- 2026年全国新高考2卷数学试卷(含答案及解析)
- 2026人教版一年级数学下册期末模拟测试卷(三套含答案)可直接打印
- 初中人教版八年级道德与法治下册全册教学反思(2026春)
- 2026年汽车驾驶员(技师)新版试题及答案
- 2026北京市规划和自然资源委员会所属事业单位招聘30人考试参考题库及答案解析
- 2026年全国《安全生产月》知识培训试题及答案
- ISO9001-2026质量管理体系中英文版标准条款全文
- 23G409先张法预应力混凝土管桩
- 生产记录书写规范培训
- 中国写意画竹子课件.ppt
- 简阳市城区基准地价调整成果
评论
0/150
提交评论