单片机原理、接口及应用

上传人:公**** 文档编号:569869283 上传时间:2024-07-31 格式:PPT 页数:33 大小:465.51KB
返回 下载 相关 举报
单片机原理、接口及应用_第1页
第1页 / 共33页
单片机原理、接口及应用_第2页
第2页 / 共33页
单片机原理、接口及应用_第3页
第3页 / 共33页
单片机原理、接口及应用_第4页
第4页 / 共33页
单片机原理、接口及应用_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《单片机原理、接口及应用》由会员分享,可在线阅读,更多相关《单片机原理、接口及应用(33页珍藏版)》请在金锄头文库上搜索。

1、第第11章章RTX51实时操作系统实时操作系统 单片机原理、接口及应用单片机原理、接口及应用单片机原理、接口及应用单片机原理、接口及应用第第11章章RTX51实时操作系统实时操作系统 内内 容容 提提 要要 前言前言RTX51系统特点系统特点RTX51的程序结构的程序结构RTX51的功能函数的功能函数RTX51的任务调度的任务调度RTX51的系统配置的系统配置 RTX51的应用举例的应用举例 小结小结 第第11章章RTX51实时操作系统实时操作系统 11.1前言前言RTX51是是一一款款小小巧巧的的针针对对基基于于8051系系列列嵌嵌入入式式系系统统的的多多任任务务实实时时操操作作系系统统。它

2、它的的使使用用可可以以简简化化比比较较复复杂杂、有有严严格格时时间间限限制制的的软软件件的的设设计计过过程程。RTX51主主要要有有两两个个不不同同的的可可用用版本:版本:RTX5lFull版。这里称之为版。这里称之为RTX51的标准版,既可以以循环的标准版,既可以以循环(Round一一Robin)方式执行任务,也可以按方式执行任务,也可以按4级任务优先级任务优先级的方式切换不同优先级的任务。标准版以并行方式工作,级的方式切换不同优先级的任务。标准版以并行方式工作,支持中断管理,信号和消息可以通过邮箱系统在不同任务支持中断管理,信号和消息可以通过邮箱系统在不同任务之间传递。之间传递。第第11章

3、章RTX51实时操作系统实时操作系统 RTX5lTiny版。这里称之为版。这里称之为RTX5l的精简版,是其标准版的的精简版,是其标准版的一个子集。它可以很容易地运行在一个子集。它可以很容易地运行在8051的单芯片系统而不的单芯片系统而不需要任何外部数据存储器。通用性强,系统需求低,但功需要任何外部数据存储器。通用性强,系统需求低,但功能上受到限制。它只支持循环方式和信号方式的任务切换,能上受到限制。它只支持循环方式和信号方式的任务切换,而不支持优先级方式的任务切换。而不支持优先级方式的任务切换。由于由于KEILC中自带了中自带了RTX5l的精简版的精简版RTX5lTiny,事事实上精简版也能

4、够满足绝大部分场合的应用要求,所以以实上精简版也能够满足绝大部分场合的应用要求,所以以下只讲解下只讲解RTX5lTiny的内容,出现的内容,出现RTX51的地方默认为其的地方默认为其精简版精简版RTX51Tiny。 第第11章章RTX51实时操作系统实时操作系统 11.2 RTX51 11.2 RTX51 系统特点系统特点RTX51 RTX51 可以在所有的可以在所有的8051 8051 系列芯片上运行。用户只需系列芯片上运行。用户只需要用标准的要用标准的C C语言编写语言编写RTX51 RTX51 程序,然后用程序,然后用C51C51编译器编译编译器编译即可生成代码。其中,仅有少数内容和标准

5、即可生成代码。其中,仅有少数内容和标准C C 语言有差异,语言有差异,这些内容是为了实现任务标识和优先级而设置的。这些内容是为了实现任务标识和优先级而设置的。RTX51 RTX51 程序设计需要包含实时运行头文件和必要的库文件,并且程序设计需要包含实时运行头文件和必要的库文件,并且要用要用BL51 BL51 连接定位器来实现连接。在连接定位器来实现连接。在KeilKeil中,你只需要中,你只需要在目标选项的在目标选项的TargetTarget标签中的标签中的OperatingOperating中选择中选择RTX-51 RTX-51 TinyTiny,在你的头文件中加上在你的头文件中加上#inc

6、lude #include 即可。即可。 第第11章章RTX51实时操作系统实时操作系统 在在RTX51TINY环境下生成代码,需要用到下列工具:环境下生成代码,需要用到下列工具:C51编译器编译器BL51连接连接/定位器定位器A51宏汇编器宏汇编器 此外,库文件此外,库文件RTX51TNY.LIB必须存放在环境变量必须存放在环境变量C51LIB所指定的路径下。所指定的路径下。 RTX51 TinyRTX51 Tiny版可以运行在版可以运行在80518051的单芯片嵌入式系统上,的单芯片嵌入式系统上,且不需要任何外部数据存储器,但也不排斥应用程序访问外且不需要任何外部数据存储器,但也不排斥应用

7、程序访问外部的数据存储器。部的数据存储器。RTX51 TinyRTX51 Tiny版本可以使用版本可以使用C51C51所支持的所所支持的所有存储模式。所使用的存储模式只影响应用对象的存储位置。有存储模式。所使用的存储模式只影响应用对象的存储位置。RTX51 TinyRTX51 Tiny的系统变量和应用程序的堆栈区总是存储在的系统变量和应用程序的堆栈区总是存储在80518051的片内的片内RAMRAM中(即中(即DATADATA和和IDATAIDATA)。)。典型的典型的RTX51 TinyRTX51 Tiny应用程应用程序一般运行于序一般运行于SMALLSMALL存储模式下。存储模式下。 第第

8、11章章RTX51实时操作系统实时操作系统 RTX51 TinyRTX51 Tiny版本使用了版本使用了80518051的定时器的定时器0 0和定时器和定时器0 0的中断的中断信号。信号。SFRSFR中的全局中断允许位或定时器中的全局中断允许位或定时器0 0中断屏蔽位都可中断屏蔽位都可能使能使RTX51 TinyRTX51 Tiny停止运行。因此,除非有特殊的应用目的,停止运行。因此,除非有特殊的应用目的,应该使定时器应该使定时器0 0的中断始终开启,以保证的中断始终开启,以保证RTX51 TinyRTX51 Tiny的正常的正常运行。运行。 实时操作系统的性能参数对嵌入式系统的应用开发也有实

9、时操作系统的性能参数对嵌入式系统的应用开发也有着直接影响,着直接影响,RTX51RTX51的性能参数如表的性能参数如表11-111-1所示。所示。 第第11章章RTX51实时操作系统实时操作系统 11.3RTX51的程序结构的程序结构RTX51Tiny通通过过循循环环(Round-Robin)方方式式来来实实现现多多任任务务,以以达达到到多多个个无无限限循循环环或或任任务务的的准准并并行行执执行行。这这里里的的多多任任务务并并不不是是真真正正同同时时执执行行的的,而而是是使使用用不不同同的的时时间间片片来来执执行行,即即只只是是宏宏观观上上的的同同时时执执行行。它它将将可可用用的的CPU周周期

10、期分分成成多多个个时时间间片片,由由RTX51把把这这些些时时间间片片分分配配给给每每一一个个任任务务使使用用。每每个个任任务务只只能能在在预预定定的的时时间间片片里里运运行行。然然后后,RTX51再再切切换换到到另另一一个个己己经经准准备备就就绪绪的的任任务务,让让它它再再执执行行一一定定的的时间片。时间片。时间片一般是比较短促的,一个时间片大约只有毫秒时间片一般是比较短促的,一个时间片大约只有毫秒级时间。正是由于这个原因,在用户看来,多个任务似乎级时间。正是由于这个原因,在用户看来,多个任务似乎是在同时执行的。是在同时执行的。 第第11章章RTX51实时操作系统实时操作系统 RTX51利利

11、用用了了一一个个由由8051定定时时器器中中断断信信号号驱驱动动的的定定时时程程序序来来实实现现控控制制。定定时时器器产产生生的的周周期期性性中中断断信信号号用用来来驱驱动动RTX51的定时节拍。的定时节拍。RTX51与与用用户户程程序序中中的的main函函数数是是无无关关的的。用用户户程程序序中中即即使使没没有有main程程序序,操操作作系系统统也也会会自自动动从从设设定定的的任任务务0开开始始执执行行。如如果果用用户户程程序序中中已已经经有有了了main函函数数,就就必必须须用用人人工工方方式式 来来 启启 动动 RTX51。 这这 对对 于于 RTX51 Tiny版版 , 可可 以以 调

12、调 用用os_create_task函数来完成函数来完成.下面是一个只使用下面是一个只使用Round-Robin Round-Robin 任务方式的简单任务方式的简单RTX51 RTX51 程序实例。程序中的两个任务都是简单的计数循环。程序实例。程序中的两个任务都是简单的计数循环。RTX51 RTX51 从从job0job0函数(设定为任务函数(设定为任务0 0)开始执行。程序中还有另一个名)开始执行。程序中还有另一个名为为job1job1的任务(设定为任务的任务(设定为任务l l)。)。系统一旦启动,在系统一旦启动,在job0 job0 执执行一段时间后,行一段时间后,RTx51 RTx51

13、 就自动切换到就自动切换到job1job1的执行;而的执行;而job1job1执执行一段时间后,行一段时间后,RTX51RTX51又切换回又切换回job0job0, 如此无限循环地如此无限循环地重复执行下去重复执行下去 。第第11章章RTX51实时操作系统实时操作系统 #includeintcounter0;intcounter1;voidjob0(void)_task_0os_create_task(1);/*任任务务l己准备就绪己准备就绪*/while(1)/*无无限限循循环环*/counter0+;/*更更新新计计数数值值counter0*/voidjob1(void)_task_1wh

14、ile(1)/*无限循环无限循环*/counter1+;/*更新计数值更新计数值counter1*/第第11章章RTX51实时操作系统实时操作系统 11.4RTX51的功能函数的功能函数RTX51精简版支持的功能函数如表精简版支持的功能函数如表11-2所示,具体含义分别介绍如下。所示,具体含义分别介绍如下。 第第11章章RTX51实时操作系统实时操作系统 11.4.1信号控制函数信号控制函数isr_send_signal函数原型函数原型charisr_send_signal(unsignedchartask_id);功功能能说说明明发发送送一一个个信信号号到到task_id说说明明的的任任务务

15、。如如果果此此任任务务已已在在等等待待一一个个信信号号,那那么么调调用用函函数数将将使使此此任任务务就就绪绪,准准备备执执行行。否否则则,信信号号讲讲存存储储在在此此任任务务的的信信号号标标志志中中。此此函函数数只只能能从从中中断函数中调用。断函数中调用。返返回回值值如如果果执执行行成成功功,此此函函数数返返回回0值值;如如果果所所指指定定的的任任务务不存在,则返回不存在,则返回-1。第第11章章RTX51实时操作系统实时操作系统 os_clear_signal函数原型函数原型charos_clear_signal(unsignedchartask_id);功能说明功能说明清除由清除由task

16、_id说明的任务的信号说明的任务的信号返回值返回值如果信号清除成功,此函数返回如果信号清除成功,此函数返回0值;如果所指定的任值;如果所指定的任务不存在,则返回务不存在,则返回-1 os_send_signal函数原型函数原型charos_send_signal(unsignedchartask_id);功功能能说说明明发发送送一一个个信信号号到到task_id说说明明的的任任务务。如如果果此此任任务务已已在在等等待待一一个个信信号号,那那么么调调用用函函数数将将使使此此任任务务就就绪绪,准准备备执执行行。否否则则,信信号号讲讲存存储储在在此此任任务务的的信信号号标标志志中中。此此函函数数只只

17、能在任务函数中调用能在任务函数中调用返回值返回值如果执行成功,此函数返回如果执行成功,此函数返回0值;如果所指定的任务不值;如果所指定的任务不存在,则返回存在,则返回-1第第11章章RTX51实时操作系统实时操作系统 11.4.2任务控制函数任务控制函数os_create_task函数原型函数原型charos_create_task(unsignedchartask_id);功功能能说说明明启启动动已已定定义义的的由由task_id说说明明的的任任务务。此此任任务务根根据据RTX51运行规则,标记为就绪,并准备执行。运行规则,标记为就绪,并准备执行。返回值返回值如果任务成功启动,此函数返回如果

18、任务成功启动,此函数返回0值;如果没有值;如果没有task_id说明的任务,则返回说明的任务,则返回-1 第第11章章RTX51实时操作系统实时操作系统 os_delete_task函数原型函数原型charos_delete_task(unsignedchartask_id);功功能能说说明明停停止止task_id说说明明的的任任务务,此此任任务务将将从从任任务务表表中中删删除。除。返回值返回值如果任务成功启动,此函数返回如果任务成功启动,此函数返回0值;如果没有值;如果没有task_id说明的任务,则返回说明的任务,则返回-1。 os_running_task_id函数原型函数原型charo

19、s_running_task_id(unsignedchartask_id);功能说明功能说明判断当前执行任务的编号判断当前执行任务的编号返回值返回值返回当前正在执行的任务的编号,返回值为返回当前正在执行的任务的编号,返回值为015。 第第11章章RTX51实时操作系统实时操作系统 11.4.3延时控制函数延时控制函数 os_wait函函数数原原型型charos_wait(unsignedcharevent_sel,/*将将要要等等待待的的事件事件*/unsignedchartisks,/*将将要要等等待待的的定定时时器器时时标标数数*/unsignedchardummy);/*未用参数未用参

20、数*/功能说明功能说明停止当前执行的任务,并等待一个或多个事件,如时停止当前执行的任务,并等待一个或多个事件,如时间间隔、超时、从另一个任务或中断发出的信号等。参数间间隔、超时、从另一个任务或中断发出的信号等。参数event_sel说明所等待的一个事件或几个事件的组合。事件种说明所等待的一个事件或几个事件的组合。事件种类如表类如表11-3所示。所示。 第第11章章RTX51实时操作系统实时操作系统 第第11章章RTX51实时操作系统实时操作系统 表表11-4os_wait函数的返回值函数的返回值os_wait1函数原型函数原型charos_wait1(unsignedcharevent_sel

21、);功功能能说说明明暂暂停停当当前前任任务务,等等待待一一个个事事件件的的发发生生。它它是是os_wait函函数数的的一一个个子子集集,不不接接受受针针对对os_wait函函数数提提供供的的全全部部事事件。参数件。参数event_sel指定了等待的事件,它只能是指定了等待的事件,它只能是K_SIG。 返返回回值值当当信信号号事事件件发发生生时时,任任务务就就被被允允许许执执行行,任任务务的的执行将恢复。返回用于识别事件、使任务重新启动的常量。执行将恢复。返回用于识别事件、使任务重新启动的常量。 第第11章章RTX51实时操作系统实时操作系统 os_wait2函数原型函数原型charos_wai

22、t2(unsignedcharevent_sel,/*将要等将要等待待的的事事件件*/unsignedchartisks);/*将将要要等等待待的的定定时时器器时标数时标数*/功能说明功能说明与与os_wait相同,但是不需要相同,但是不需要dummy参数。参数。返回值返回值与与os_wait相同相同 第第11章章RTX51实时操作系统实时操作系统 11.5RTX51的任务调度的任务调度RTX51利用任务状态来管理各个任务。用户为利用任务状态来管理各个任务。用户为RTX51定义定义的每个任务都会以各种状态的某一种来运行。的每个任务都会以各种状态的某一种来运行。RTX51内核为内核为每个任务保留

23、了适当的状态如表每个任务保留了适当的状态如表11-5所示。所示。表表11-5 RTX5111-5 RTX51的任务状态的任务状态 第第11章章RTX51实时操作系统实时操作系统 RTX51以以round-robin多多任任务务方方式式执执行行程程序序,它它支支持持多多个个无无限限循循环环或或任任务务的的准准并并行行执执行行。任任务务不不是是被被同同时时执执行行,而而是是以以分分时时的的方方式式轮轮片片执执行行。可可用用的的CPU时时钟钟周周期期被被分分成成多多个个时时间间片片,然然后后由由RTX51将将这这些些时时间间片片分分配配给给各各个个任任务务。每每个个任任务务只只允允许许在在预预定定的

24、的时时间间片片中中执执行行,时时间间片片用用完完时时,RTX51就就切切换换至至另另一一个个就就绪绪的的任任务务,继继续续执执行行一一段段时时间间。时时间间片片的的具具体长度可以用配置函数体长度可以用配置函数TIMESHARING来定义。来定义。如果遇到因为一个任务处于等待并且占用了时间片而暂如果遇到因为一个任务处于等待并且占用了时间片而暂时无法往下执行,可以调用系统函数时无法往下执行,可以调用系统函数os_wait来通知来通知RTX51,以便将当前的任务挂起而提前执行另一任务。以便将当前的任务挂起而提前执行另一任务。 第第11章章RTX51实时操作系统实时操作系统 RTX51中中 处处 理理

25、 任任 务务 分分 配配 的的 模模 块块 称称 为为 调调 度度 程程 序序(Scheduler)。调调度度程程序序驱驱动动哪哪个个任任务务运运行行是是按按照照以以下下的的规规则进行的:则进行的:(1)如果发生以下情况时,当前运行的任务将被中断:)如果发生以下情况时,当前运行的任务将被中断:调用调用os_wait函数,而所等待的事件未来到;函数,而所等待的事件未来到;任任务务的的执执行行时时间间已已经经超超过过所所定定义义的的Round-Robin循循环环时时间间间间隔隔(2)如果发生以下情况时,另一个任务将被启动:)如果发生以下情况时,另一个任务将被启动:已没有正在执行的任务;已没有正在执

26、行的任务; 将要执行的任务处在就绪状态或超时状态。将要执行的任务处在就绪状态或超时状态。 第第11章章RTX51实时操作系统实时操作系统 11.6RTX51的系统配置的系统配置编编写写RTX51程程序序需需要要包包含含RTX51TNY.H文文件件。在在程程序序中中,需需要要用用一一个个关关键键字字“_task_”来来声声明明一一个个函函数数的的任任务务属属性性。RTX51程程序序不不需需要要main函函数数。在在进进行行连连接接处处理理时时,会会将将启启动动任务任务0的执行所需要的代码连接进来,作为开始执行的代码。的执行所需要的代码连接进来,作为开始执行的代码。用户可以更改配置文件用户可以更改

27、配置文件CONF_TNY.A51中的以下几个参数:中的以下几个参数:系统定时器中断所用的寄存器组系统定时器中断所用的寄存器组系统定时器的时间间隔系统定时器的时间间隔Round-Robin的超时(的超时(time-out)值值内部数据存储器的大小内部数据存储器的大小RTX5l启动后的自由堆栈大小启动后的自由堆栈大小 第第11章章RTX51实时操作系统实时操作系统 以下是配置文件的部分内容:以下是配置文件的部分内容:;RTX51的硬件定时器的硬件定时器;用下面的用下面的EQU可预置可预置RTX51的定时器时间常数的定时器时间常数;用用8051定时器定时器0作为控制软件的定时器作为控制软件的定时器;

28、定义定时器中断用的寄存器组定义定时器中断用的寄存器组INT_REGBANKEQU1;默认为寄存器默认为寄存器1组组;定义定义8051定时器定时器0溢出所需的机器周期数溢出所需的机器周期数INT_CLOCKEQU10000;默认周期数为默认周期数为10000;定义定义Round-Robin的的Timeout所需的定时器溢出数所需的定时器溢出数TIMESHARINGEQU5;默认为默认为5次次;注意:注意:Round-Robin任务切换可用任务切换可用TIMESHARING为为0来屏蔽来屏蔽 第第11章章RTX51实时操作系统实时操作系统 ;RTX51堆栈空间堆栈空间;以下的以下的EQU语句定义了

29、堆栈区的片内语句定义了堆栈区的片内RAM体积和最小自由堆栈空间体积和最小自由堆栈空间:定义了堆栈空间耗尽后所执行的宏代码:定义了堆栈空间耗尽后所执行的宏代码;定义最大的堆栈;定义最大的堆栈RAM地址地址RAMTOPEQU0FFH;默认地址是默认地址是255;定义最小的堆栈自由空间定义最小的堆栈自由空间FREE_STACKEQU20;默认为默认为20字节堆栈自由空间字节堆栈自由空间;;发生堆栈用尽时的执行代码;发生堆栈用尽时的执行代码STACK_ERRORMACROCLREA;关闭所有中断关闭所有中断SJMP$;如堆栈空间耗尽,进入死循环如堆栈空间耗尽,进入死循环ENDM 在这个配置文件中,定义

30、了许多可以修改的参数,以适应用户特定的应在这个配置文件中,定义了许多可以修改的参数,以适应用户特定的应用程序环境。这些参数的说明详见表用程序环境。这些参数的说明详见表11-6所示。所示。 第第11章章RTX51实时操作系统实时操作系统 表表11-6配置文件参数说明配置文件参数说明第第11章章RTX51实时操作系统实时操作系统 11.7RTX51的应用举例的应用举例本节给出了一个采用本节给出了一个采用RTX51实现的简单的交通灯控制模实现的简单的交通灯控制模拟程序。其目的在于展示拟程序。其目的在于展示RTX51编程的思路与优势,同时为编程的思路与优势,同时为便于学习,又力求程序简单。因此这里通过

31、串口输出模拟了便于学习,又力求程序简单。因此这里通过串口输出模拟了一个人行道上的红绿灯控制过程:车通行,绿灯亮;绿灯保一个人行道上的红绿灯控制过程:车通行,绿灯亮;绿灯保持一段时间后,闪烁几秒转亮黄灯几秒;黄灯没后,红灯亮持一段时间后,闪烁几秒转亮黄灯几秒;黄灯没后,红灯亮起,人通行。然后又亮绿灯,周而复始。为方便学习调试,起,人通行。然后又亮绿灯,周而复始。为方便学习调试,这里采用串口输出不同的文本串来指示绿灯亮、绿灯闪烁这里采用串口输出不同的文本串来指示绿灯亮、绿灯闪烁(文本串闪烁)、黄灯亮、红灯亮(文本串闪烁)、黄灯亮、红灯亮4种状态。为便于观察结果,种状态。为便于观察结果,示例程序运行

32、所获的状态持续时间为:绿亮示例程序运行所获的状态持续时间为:绿亮10s,绿闪绿闪3s,黄黄亮亮3s,红亮红亮10s。 第第11章章RTX51实时操作系统实时操作系统 第第11章章RTX51实时操作系统实时操作系统 第第11章章RTX51实时操作系统实时操作系统 voidlights(void)_task_LIGHTSwhile(1) /*任务必须是死循环任务必须是死循环*/os_wait1(K_SIG);/*等等待待信信号量(由号量(由clock任务发出)任务发出)*/switch(showLightState) /*判判 断断showLightState状态状态*/caseGREEN:/*显

33、示绿灯显示绿灯*/printf(NOWisgreen:%8dr,time); /*串串口口输输出出状状态和时间态和时间*/break;caseGREENBLINK:/*绿绿灯灯闪闪烁烁*/if(timeBlink%2)/*如如果果timeBlink为为偶偶数数显显示示空空,否否则则显显示示绿绿灯灯*/printf(NOW is green:%8dr,time); elseprintf(r);break;caseYELLOW:/*黄灯黄灯*/printf(NOWisyellow:%7dr,time);/*串口输出状态和时间串口输出状态和时间*/break;caseRED:/*红灯红灯*/prin

34、tf(NOWisred:%10dr,time);/*串口输出状态和时间串口输出状态和时间*/break;第第11章章RTX51实时操作系统实时操作系统 第第11章章RTX51实时操作系统实时操作系统 第第11章章RTX51实时操作系统实时操作系统 time=13;/*更新时间数更新时间数*/printf(n);/*换行输出换行输出*/break; 11.8小结小结 本章介绍了本章介绍了RTX51Tiny版的使用。版的使用。RTX51是一款适合做是一款适合做8051嵌嵌入式系统平台的实时操作系统。入式系统平台的实时操作系统。RTX51专门针对专门针对51设计,小巧紧设计,小巧紧凑,代码开放。很多应用证明这是一个成功的凑,代码开放。很多应用证明这是一个成功的8位单片机的位单片机的RTOS。但是在应用过程中应该注意它的使用场合。比如说,开发一个某但是在应用过程中应该注意它的使用场合。比如说,开发一个某家电的红外遥控器,可以用家电的红外遥控器,可以用8051实现,但没必要加入个实现,但没必要加入个RTOS,为其编写个专用的监控程序就可以了。此外,由于为其编写个专用的监控程序就可以了。此外,由于RTX51是一个是一个多任务的操作系统,所有在它的框架下所使用的函数一般都要求多任务的操作系统,所有在它的框架下所使用的函数一般都要求有可重入性。有可重入性。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 幼儿/小学教育 > 幼儿教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号