免费预览已结束,剩余80页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式操作系统 C OS II 嵌入式系统的构成 硬件层 中间层 软件层 嵌入式系统 嵌入式系统的构成 中间层 BSP 承硬启软的中间层 中间层 板级支持包 BoardSupportPackage BSP 也可称为硬件抽象层 HardwareAbstractLayer HAL 功能 底层硬件初始化硬件设备的配置特点 硬件相关性操作系统相关性 片级初始化 板级初始化 系统级初始化 硬件启动 关闭 硬件启用 停用 读 写操作的准备工作 系统初始化 无操作系统的情形 循环轮询系统 PollingLoop 程序依次检查系统的每个输入条件 一旦条件成立就进行相应的处理 Initialize while 1 if condition 1 action 1 if condition 2 action 2 if condition n acition n 事件驱动系统 它包括前后台 实时多任务 多处理器等 是嵌入式实时系统的主要形式 应用程序是一个无限循环 循环中调用相应的函数完成相应操作 这部分可以看成后台行为 background 中断服务程序处理异步事件 这部分可看成前台行为 foreground 后台也可以叫做任务级 前台也叫中断级 前后台系统 后台循环 前台中断 ISR ISR 后台前台 ISR 时间 有操作系统的情形 硬件 板级初始化 设备驱动层 以太网驱动 串口驱动 LCD驱动 键盘驱动 操作系统层 中间件层 应用软件层 TCP IP网络系统 文件系统 内核 嵌入式GUI 嵌入式CORBA 嵌入式JAVA 嵌入式DCOM 面向领域的中间件 WWW浏览器 MP3播放器 电子邮件 嵌入式操作系统 包括嵌入式内核 嵌入式TCP IP网络系统 嵌入式文件系统 嵌入式GUI系统和电源管理等部分 嵌入式内核是基础和核心 其他部分要根据嵌入式系统的需要来确定 VxWorksEmbeddedLinuxuC OS II 重点 WinCEPalmOSAndroid 常见的嵌入式操作系统 C OS II C OS II是一个源码公开 可移植 可固化 可裁剪 占先式的实时多任务操作系统 其绝大部分源码是用ANSIC写的 使其可以方便的移植并支持大多数类型的处理器 C OS II通过了联邦航空局 FAA 商用航行器认证 自1992年问世以来 C OS II已经被应用到数以百计的产品中 C OS II占用很少的系统资源 并且在高校教学使用是不需要申请许可证 嵌入式操作系统分类 嵌入式系统 实时系统 分时系统 硬实时系统 软实时系统 嵌入式操作系统分类 嵌入式实时系统当事件 请求发生时 相应的任务应该在规定的时间内完成 实时性并不是简单的 快 而是系统的时间响应特性或者说可预测性 嵌入式分时系统基于公平性原则 各个进程分享处理器 获得大致相同的运行时间 硬实时和软实时 硬实时 响应时间超过规定时限将导致灾难性后果的实时系统软实时 响应时间超过规定时限 但后果可以忍受的实时系统实时性 判断标准 最差响应时间 硬实时 平均响应时间 软实时 按软件结构分类 单体结构 MonolithicStructure 分层结构 LayeredStructure 微内核结构 MicrokernelModel 单体结构 最常用的组织结构 整个系统只有一个可执行文件 包含所有的操作系统组件 系统的结构就是无结构 由一组函数组成 相互之间可以随意地调用 应用软件 文件I O 存储管理 进程管理 I O驱动 存储驱动 中断驱动 硬件 单体内核 分层结构 一个操作系统被划分为若干个层次 0 N 各个层次之间的调用关系是单向的 即某一层次上的代码只能调用比它低层的代码 这种结构要求在每个层次上都要提供一组API接口函数 这就会带来额外的开销 微内核 设备驱动程序 微内核结构 操作系统内核只包含最少的功能 如存储管理和进程管理 其他的操作系统组件以中间件的形式存在于内核之外 设备驱动程序完全从内核中剥离 独立成为一层 中间件 应用软件 存储管理 进程管理 I O驱动 存储驱动 中断驱动 硬件 C OS II的文件结构 操作系统 计算机操作系统的功能 处理器的管理 存储管理 网络和通信的管理 总之 需要一大堆表 操作系统中经常使用的数据结构 数组 数组1 同一数据类型数据的集合 2 占用连续内存空间 3 其中的所有元素名称都相同 但每个元素都有一个编号 4 元素名去掉编号 下标 得到的是数组名 数组名是个指针 inta 10 a 0 a 1 a 2 a 3 a 9 a a 1 使用上的特点 1 分类存放 2 检索速度快且恒定 3 缺点 占用连续空间大 a 2 a 3 a 9 操作系统中经常使用的数据结构 位图 位图是数组的一种特殊应用 a 10 可以记录80个事物的状态 a 0 a 1 a 2 a 3 a 9 a a 1 a 2 a 3 a 9 1 0 D7D6D5D4D3D2D1D0 操作系统中经常使用的数据结构 结构 1 不同数据类型数据的集合 2 占用连续内存空间 structStudent intage char name charsex 使用上的特点 1 不分类存放 但用来描述同一事物 2 检索速度快且恒定 操作系统中经常使用的数据结构 链表 structStudent Student nextintage char name charsex 1 同数据类型数据的集合 2 不占用连续内存空间 使用上的特点 1 分类存放 但空间上不连续 不需要大量的连续存储空间 2 检索速度慢 且耗费的时间不固定 应用 存放大量的较大的表 类似档案柜 操作系统中经常使用的数据结构 队列 按照先进先出的规则组织的数据结构可以用数组也可以用链表来实现 主要用于对象的排队 操作系统中经常使用的数据结构 堆栈 按照先进后出规则组织的数据结构主要用数组来实现 主要用于程序模块的嵌套运行 什么是多任务系统 简单地说 就是能用一个处理器并发 注意 不是同时 地运行多个程序的计算机管理系统 并发 由同一个处理器轮换地运行多个程序 或者说是由多个程序轮班地占用处理器这个资源 且在占用这个资源期间 并不一定能够把程序运行完毕 并发过程示意图 处理器如何进行程序的切换 程序的切换 两句话 处理器是个傻瓜 PC让它干啥 它就干啥 PC是个指路器 它指向哪儿 处理器就去哪儿 从此可以知道 哪个程序占有了PC 哪个程序就占有了处理器 深刻地理解PC是理解系统进行程序切换动作的关键 如何操作PC 指令 不同的计算机类型的指令是不同的 数据传送指令子程序返回指令 由堆栈弹出 中断服务程序返回指令 由堆栈弹出 任务代码 任务堆栈 内存 处理器 任务运行时与处理器之间的关系 处理器通过两个指针寄存器 PC和SP 来与任务代码和任务堆栈建立联系并运行它 寄存器组 运行环境包括了两部分 处理器中的运行环境和内存中的运行环境 处理器 多任务时的问题 当有多个任务时 处理器中的运行环境应该怎么办 寄存器组 程序运行环境 多任务时任务与处理器之间关系的处理 程序 在内存中为每个任务创建一个虚拟的处理器 处理器部分的运行环境 由操作系统的调度器按某种规则来进行这两个复制工作 寄存器组 寄存器组 也就是说 任务的切换是任务运行环境的切换 虚拟处理器 虚拟处理器应该存储的主要信息 1 程序的断点地址 PC 2 任务堆栈指针 SP 3 程序状态字寄存器 PSW 4 通用寄存器内容5 函数调用信息 已存在于堆栈 另外再用一个数据结构保存任务堆栈指针 SP 这个数据结构叫做任务控制块 它除了保存任务堆栈指针之外还要负责保存任务其他信息 这些内容通常保存在任务堆栈中 这些内容也常叫做任务的上下文 任务控制块是由操作系统另行构造的一个数据结构 每个任务都有一个 任务控制块结构的主要成员typedefstructos tcb OS STK OSTCBStkPtr 指向任务堆栈栈顶的指针 INT8UOSTCBStat 任务的当前状态标志INT8UOSTCBPrio 任务的优先级别 OS TCB 其实 程序切换的关键是把程序的私有堆栈指针赋予处理器的堆栈指针SP 实质上系统是通过SP的切换来实现程序的切换的 要建立一个概念 具有控制块的程序才是一个可以被系统所运行的任务 程序代码 私有堆栈 任务控制块是任务的三要件 任务控制块提供了运行环境的存储位置 任务的基本概念 把一个大型任务分解成多个小任务 然后在计算机中通过运行这些小任务 最终达到完成大任务的目的 在 C OS II中 与上述那些小任务对应的程序实体就叫做 任务 实质上是一个线程 C OS II就是一个能对这些小任务的运行进行管理和调度的多任务操作系统 从应用程序设计的角度来看 C OS II的任务就是一个用户编写的C函数和与之相关联的一些数据结构而构成的一个实体 任务切换过程 获得待运行任务的任务控制块 如何获得待运行任务的任务控制块 小结 一个完整的任务应该有如下三部分 任务代码 程序 任务的私有堆栈 用以保护运行环境 任务控制块 提供私有堆栈也是虚拟处理器的位置 这些都是任务方应该提供的基本信息 C OS II中的任务管理 任务的状态及其转换 正在运行的任务 需要等待一段时间或需要等待一个事件发生再运行时 该任务就会把CPU的使用权让给别的任务而使任务进入等待状态 任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态 系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记 这时任务的状态叫做就绪状态 处于就绪状态的任务如果经调度器判断获得了CPU的使用权 则任务就进入运行状态 一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序 这时任务的状态叫做中断服务状态 用户任务代码的一般结构 voidMyTask void pdata for 可以被中断的用户代码 OS ENTER CRITICAL 进入临界段 关中断 不可以被中断的用户代码 OS EXIT CRITICAL 退出临界段 开中断 可以被中断的用户代码 临界段 无限循环 于是可以这样说 C OS II任务的代码结构是一个可以带有临界段的无限循环 系统提供的空闲任务 在多任务系统运行时 系统经常会在某个时间内无用户任务可运行而处于所谓的空闲状态 为了使CPU在没有用户任务可执行的时候有事可做 C OS II提供了一个叫做空闲任务OSTaskIdle 的系统任务 voidOSTaskIdle void pdata ifOS CRITICAL METHOD 3OS CPU SRcpu sr endifpdata pdata 防止某些编译器报错for OS ENTER CRITICAL 关闭中断OSdleCtr 计数OS EXIT CRITICAL 开放中断 空闲任务只是做了一个计数工作 C OS II规定 一个用户应用程序必须使用这个空闲任务 而且这个任务是不能用软件来删除的 系统提供的另一个任务 统计任务 C OS II提供的另一个系统任务是统计任务OSTaskStat 这个统计任务每秒计算一次CPU在单位时间内被使用的时间 并把计算结果以百分比的形式存放在变量OSCPUsage中 以便应用程序通过访问它来了解CPU的利用率 所以这个系统任务OSTaskStat 叫做统计任务 任务的优先权及优先级别 C OS II把任务的优先权分为64个优先级别 每一个级别都用一个数字来表示 数字0表示任务的优先级别最高 数字越大则表示任务的优先级别越低 用户可以根据应用程序的需要 在文件OS CFG H中通过给表示最低优先级别的常数OS LOWEST PRIO赋值的方法 来说明应用程序中任务优先级别的数目 该常数一旦被定义 则意味着系统中可供使用的优先级别为 0 1 2 OS LOWEST PRIO 共OS LOWEST PRIO 1个 任务堆栈 保存CPU寄存器中的内容及存储任务私有数据的需要 每个任务都应该配有自己的堆栈 任务堆栈是任务的重要的组成部分 在应用程序中定义任务堆栈的栈区非常简单 即定义一个OS STK类型的一个数组并在创建一个任务时把这个数组的地址赋给该任务就可以了 例如 定义堆栈的长度 defineTASK STK SIZE512 定义一个数组来作为任务堆栈OS STKTaskStk TASK STK SIZE typedefunsignedintOS STK 这是系统定义的一个数据类型 任务堆栈的初始化 应用程序在创建一个新任务的时候 必须把在系统启动这个任务时CPU各寄存器所需要的初始数据 任务指针 任务堆栈指针 程序状态字等等 事先存放在任务的堆栈中 C OS II在创建任务函数OSTaskCreate 中通过调用任务堆栈初始化函数OSTaskStkInit 来完成任务堆栈初始化工作的 它的原型如下 OS STK OSTaskStkInit void task void pd void pdato OS STK ptos INT16Uopt 用函数OSTaskCreate 创建任务 应用程序通过调用OSTaskCreate 函数来创建一个任务 OSTaskCreate 函数的原型如下 INT8UOSTaskCreate void task void pd 指向任务的指针void pdata 传递给任务的参数OS STK ptos 指向任务堆栈栈顶的指针INT8Uprio 任务的优先级 创建任务的一般方法 一般来说 任务可以在调用函数OSStart 启动任务调度之前来创建 也可以在任务中来创建 但是 C OS II有一个规定 在调用启动任务函数OSStart 之前 必须已经创建了至少一个任务 因此 人们习惯上在调用函数OSStart 之前先创建一个任务 并赋予它最高的优先级别 从而使它成为起始任务 然后在这个起始任务中 再创建其他各任务 如果要使用系统提供的统计任务 则统计任务的初始化函数也必须在这个起始任务中来调用 voidmain void OSInit 对 C OS II进行初始化 OSTaskCreate TaskStart 创建任务TaskStartOSStart 开始多任务调度 voidTaskStart void pdata 在这个位置安装并启动 C OS II的时钟OSStatInit 初始化统计任务 在这个位置创建其他任务for 起始任务TaskStart的代码 任务也可以自我删除 并非真的删除 只是内核不再知道该任务 voidMyTask void pdata 用户代码 OSTaskDel OS PRIO SELF 任务控制块 OS TCB 及任务控制块链表 C OS II用来记录任务的堆栈指针 任务的当前状态 任务的优先级别等一些与任务管理有关的属性的表就叫做任务控制块 任务控制块就相当于是一个任务的身份证 没有任务控制块的任务是不能被系统承认和管理的 任务控制块结构的主要成员typedefstructos tcb OS STK OSTCBStkPtr 指向任务堆栈栈顶的指针 structos tcb OSTCBNext 指向后一个任务控制块的指针structos tcb OSTCBPrev 指向前一个任务控制块的指针 INT16UOSTCBDly 任务等待的时限 节拍数 INT8UOSTCBStat 任务的当前状态标志INT8UOSTCBPrio 任务的优先级别 OS TCB 任务控制块链表 空任务控制块链表 当应用程序调用函数OSTaskCreate 创建一个任务时 这个函数会调用系统函数OSTCBInit 来为任务控制块进行初始化 当进行系统初始化时 初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表 任务的状态 休眠 休眠状态 Dormant 任务存在于内存空间中 但内核不可见 可以通过以下函数通知内核 使之变为就绪状态 OSTaskCreate 或OSTaskCreateExt 可以通过以下函数返回到休眠状态 OSTaskDel 任务的状态 就绪 就绪状态 Ready 万事具备 只欠CPU 在所有的就绪任务当中 具有最高优先级的任务被选中去运行 如果任务在运行的时候被抢占了CPU 则又回到就绪状态 任务的状态 运行 运行状态 Running 任务在CPU上运行 当一个任务在运行时 如果没有关闭中断 则有可能被中断所打断 当一个任务在运行时 可能因为各种原因进入阻塞状态 OSMBoxPend OSQPend OSSemPend OSTaskSuspend OSTimeDly 任务的状态 ISR 中断服务状态 ISR 该任务原来在CPU上运行 后来被中断所打断 由中断服务程序ISR接管了CPU 当中断服务程序运行完毕后 内核要判断是否有新的 更高优先级的任务就绪 如果有 则原有的任务被抢占 如果没有 则原有的任务重新运行 任务的状态 阻塞 阻塞 等待状态 Waiting 任务由于正在等待某个事件 信号量 邮箱或队列 而被挂起 当任务等待的事件发生时 回到就绪状态 OSMBoxpost OSQPost OSSemPost OSTaskResume OSTimeDlyResume 或OSTimeTick 任务管理的系统服务 创建任务删除任务修改任务的优先级挂起和恢复任务获得一个任务的有关信息 创建任务 创建任务的函数OSTaskCreate OSTaskCreateExt OSTaskCreateExt 是OSTaskCreate 的扩展版本 提供了一些附加的功能 不能在中断服务程序 ISR 中创建新任务 删除任务 OSTaskDel 删除一个任务 其TCB会从所有可能的系统数据结构中移除 任务将返回并处于休眠状态 任务的代码还在 如果任务正处于就绪状态 把它从就绪表中移出 这样以后就不会再被调度执行了 如果任务正处于邮箱 消息队列或信号量的等待队列中 也把它移出 将任务的OS TCB从OSTCBList链表当中移动到OSTCBFreeList OSTaskChangePrio 在程序运行期间 用户可以通过调用本函数来改变某个任务的优先级 INT8UOSTaskChangePrio INT8Uoldprio INT8Unewprio OSTaskQuery 获得一个任务的有关信息获得的是对应任务的OS TCB中内容的拷贝 修改任务的优先级 OSTaskSuspend 挂起一个任务如果任务处于就绪态 把它从就绪表中移出 在任务的TCB中设置OS STAT SUSPEND标志 表明该任务正在被挂起 OSTaskResume 恢复一个任务恢复被OSTaskSuspend 挂起的任务 清除TCB中OSTCBStat字段的OS STAT SUSPEND位 挂起和恢复任务 任务就绪表及任务调度 多任务操作系统的核心工作就是任务调度 所谓调度 就是通过一个算法在多个任务中确定该运行的任务 做这项工作的函数就叫做调度器 C OS II进行任务调度的思想是 近似地每时每刻总是让优先级最高的就绪任务处于运行状态 为了保证这一点 它在系统或用户任务调用系统函数及执行中断服务程序结束时总是调用调度器 来确定应该运行的任务并运行它 C OS II进行任务调度的依据就是任务就绪表 任务就绪表就是一个二维数组OSRdyTbl 为加快访问任务就绪表的速度 系统定义了一个变量OSRdyGrp来表明就绪表每行中是否存在就绪任务 OSRdyTbl 1 01 01 01 01 01 01 01 0 1 01 01 01 01 01 01 01 0 1 01 01 01 01 01 01 01 0 1 01 01 01 01 01 01 01 0 1 01 01 01 01 01 01 01 0 1 01 01 01 01 01 01 01 0 1 01 01 01 01 01 01 01 0 1 01 01 01 01 01 01 01 0 OSRdyGrp D7D6D5D4D3D2D1D0 1 01 01 01 01 01 01 01 0 任务就绪表的示意图 0 1 2 3 4 5 6 7 x y 0 1 2 3 4 5 6 7 OSRdyGrp D7D6D5D4D3D2D1D0 1 1 1 1 0 0 0 0 prio 29 D7D6D5D4D3D2D1D0 1 D7D6D5D4D3D2D1D0 1 OSRdyTbl 3 把prio为29的任务置为就绪状态 Y X OSRdyGrp OSMapTbl prio 3 OSRdyTbl prio 3 OSMapTbl prio 在程序中 可以用类似下面的代码把优先级别为prio的任务置为就绪状态 OSRdyGrp OSMapTbl prio 3 OSRdyTbl prio 3 OSMapTbl prio OSRdyGrp D7D6D5D4D3D2D1D0 1 1 1 1 0 0 0 0 prio 29 D7D6D5D4D3D2D1D0 1 D7D6D5D4D3D2D1D0 1 OSRdyTbl y x OSUnMapTal OSRdyTbl y 1 1 0 0 0 0 0 0 0 0 0 0 0 0 y OSUnMapTal OSRdyGrp 图5 6在就绪表中查找最高优先级别任务的过程 从任务就绪表中获取优先级别最高的就绪任务可用如下类似的代码 y OSUnMapTal OSRdyGrp D5 D4 D3位x OSUnMapTal OSRdyTbl y D2 D1 D0位prio y 3 x 优先级别或y OSUnMapTbl OSRdyGrp prio INT8U y 3 OSUnMapTbl OSRdyTbl y INT8UconstOSUnMapTbl 0 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 6 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 7 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 6 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 优先级判定表OSUnMapTbl 256 举例 如OSRdyGrp的值为01101000B 即0X68 则查得OSUnMapTbl OSRdyGrp 的值是3 它相应于OSRdyGrp中的第3位置1 如OSRdyTbl 3 的值是11100100B 即0XE4 则查OSUnMapTbl OSRdyTbl 3 的值是2 则进入就绪态的最高任务优先级Prio 3 8 2 26 确定哪个任务的优先级最高 应该选择哪个任务去运行 这部分的工作是由调度器 Scheduler 来完成的 任务级的调度是由函数OSSched 完成的 中断级的调度是由另一个函数OSIntExt 完成的 任务调度器 voidOSSched void INT8Uy OS ENTER CRITICAL if OSLockNesting OSIntNesting 0 y OSUnMapTbl OSRdyGrp OSPrioHighRdy INT8U y 3 OSUnMapTbl OSRdyTbl y if OSPrioHighRdy OSPrioCur OSTCBHighRdy OSTCBPrioT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中小企业市场营销策略制定指导书
- 客户关系管理客户关系评分系统与策略模板
- 防范电信诈骗筑牢安全防线小学主题班会课件
- 公司综合实施方案与规划研究
- 建筑工程质量安全管理指导手册
- 健康生活靠自律,小学主题班会课件
- 产品设计过程检查及评审标准
- 公共空间经营承诺函8篇范文
- 电子商务平台的个性化营销服务解决方案
- 人工挖孔桩工程安全施工措施
- 广东省湛江市2026年高三冲刺模拟物理试卷(含答案解析)
- 山体滑坡治理工程
- 2025湖北武汉新芯集成电路制造有限公司招聘184人笔试历年参考题库附带答案详解
- 2026年及未来5年市场数据中国DPC陶瓷行业市场深度分析及发展趋势预测报告
- 2026长春市中考语文专项训练卷含答案字词
- (二模)郑州市2026年高三毕业年级第二次质量预测语文试卷(含官方答案)
- 2025-2030高精地图测绘行业市场供需分析及投资评估规划分析研究报告
- (2026版)市场监督管理行政处罚案件违法所得认定办法课件
- 贵州省六盘水市2026年八年级下学期语文期中试卷附答案
- 土工击实自动生成系统
- 2026中国联通招聘笔试题及答案
评论
0/150
提交评论