uCOS-II任务间通讯和同步实验.


6
五
基础知识
uC/OS-II任务之间的通讯与同步方式
在µC/OS-II中,有多种方法可以保护任务之间的共享数
据和提供任务之间的通讯。
利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开 中断。当两个任务或者一个任务和一个中断服务子程序共享某些数据
10五基础知识uC/OS-II中使用邮箱进行任务之间通讯
下面的代码每100个时钟节拍从TaskSEG中发送一个字符串, 在TaskLED中接收并打印出来。
11
五
基础知识
uC/OS-II中使用消息队列实现任务之间的通讯
消息队列是uC/OS-II中另一种通讯机制,它可以使一个任 务或者中断服务子程序向另一个任务发送以指针方式定义 的变量。因具体的应用有所不同,每个指针指向的数据结 构变量也有所不同。 uC/OS-II提供了7个对消息队列进行操作的函数:创建消 息队列函数OSQCreate(),等待消息队列函数OSQPend(), 先进先出(FIFO)发送消息函数OSQPost(),后进先出(LIFO) 发送消息函数OSQPostFront(),无等待获取消息函数 OSQAccept(),清空消息队列函数OSQFlush()和查询消息 队列函数OSQQuery()。
时,可以采用这种方法
利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度 函数上锁和开锁
信号量
邮箱 队列
7
五
基础知识
uC/OS-II中使用信号量
通过调用OSSemCreate()建立信号量,并对信号量的初始 计数值赋值。该初始值为0到65,535之间的一个数。如果 信号量是用来表示一个或者多个事件的发生,那么该信号 量的初始值应设为0。如果信号量是用于对共享资源的访 问,那么该信号量的初始值应设为1(例如,把它当作二 值信号量使用)。 通过调用OSSemPost()函数发送一个信号量,通过调用 OSSemPend()函数等待一个信号量。如果信号量当前是可 用的(信号量的计数值大于0),将信号量的计数值减1, 然后函数将“无错”错误代码返回给它的调用函数。如果 信号量的计数值为0,而OSSemPend()函数又不是由中断服 务子程序调用的,则调用OSSemPend()函数的任务要进入 睡眠状态,等待另一个任务(或者中断服务子程序)发出 该信号量。 8
JX44B0实验系统教案 uC/OS-II任务间通讯和同步实验
武汉创维特信息技术有限公司
2018/9/15
提纲
1
实验目的
2
实验内容
3 4
预备知识
实验设备
5
6
基础知识
实验过程
2
7
实验报告要求
一
实验目的
实验目的
掌握uC/OS-II操作系统下使用信号量解决任务之间的同步 问题 掌握uC/OS-II操作系统下任务间通讯的方法
五
基础知识
uC/OS-II中使用信号量进行任务之间同步
右边的代码使用两个信 号量实现了两个任务之 间的同步。信号量创建 的代码如下,信号量 Sem2初始为可用状态, 而信号量Sem1初始为不 可用状态。 Sem1 = OSSemCreate(0); Sem2 = OSSemCreate(1); 任务TaskLED必须等待 Sem2可用才能够继续往 下运行,而Sem2在 TaskSEG中发送。同样 TaskSEG必须等待Sem1可 用才能够继续往下运行, 而Sem1在TaskLED中发送, 这样就实现了程序中 “…”之间代码的顺序执 行,而不受OSTimeDly的 延时值的影响。 9
五
基础知识
uC/OS-II中使用邮箱
邮箱可使一个任务或者中断服务子程序向另一个任务发送 一个指针型的变量。该指针指向一个包含了特定“消息” 的数据结构。通过调用OSMboxCreate()函数来创建邮箱, 并指定指针的初始值。如果使用邮箱的目的是用来通知一 个事件的发生(发送一条消息),那么就要初始化该邮箱 为NULL,因为在开始时,事件还没有发生。如果用户用邮 箱来共享某些资源,那么就要初始化该邮箱为一个非NULL 的指针。在这种情况下,邮箱被当成一个二值信号量使用。 使用邮箱同样可以实现任务间的同步。 通过OSMboxPost()函数发送一个消息到邮箱中,通过 OSMboxPend()函数等待一个邮箱中的消息,如果邮箱中没 有可用的消息,OSMboxPend()的调用任务就被挂起,直到 邮箱中有了消息或者等待超时。
12
六
实验过程
实验过程
13
六
实验报告要求
实验报告要求
简述邮箱和信号量的作用?
简述邮箱和信号量的在ucOS中的是如何实现的?
14
3
二
实验内容
实验内容
使用信号量实现任务间同步 使用邮箱实现任务之间的通讯
4
三
预备知识
预备知识
了解操作系统任务调度的机制 了解操作系统任务间通讯的机制 学习uC/OS-II操作系统下多任务应用程序的编写方法
5
四
实验设备
实验设备
JX44B0教学实验箱 ADT1000仿真器和ADT IDE集成开发环境 串口连接线
合集下载

uC_OS-II实验指导书2015 - 8

uC_OS-II实验指导书2015 - 8
default: printf("时间:%d,任务TTaskMessageSen发消息失败,错误号:%d\n",OSTimeGet(),err);
} OSQQuery(myQ,&myQData); printf("时间:%d,当前队列中消息数量:%d\n",OSTimeGet(),myQData.OSNMsgs); } }
实验 8 µC/OS-II 任务间通信设计
1 实验目的
掌握嵌入式实时操作系统µC/OS-II 中信号量、消息邮箱、消息队列机制的基本原理和使用方法。
2 实验内容
数据类型定义如下: typedef unsigned char BOOLEAN; typedef unsigned charpedef unsigned short INT16U; typedef signed short INT16S; typedef unsigned long INT32U; typedef signed long INT32S; typedef unsigned short OS_STK; 任务控制块的结构定义如下: typedef struct os_tcb {
if (myMBox==(OS_EVENT *)0) /*检查邮箱是否存在*/ {
2
printf("时间:%d,任务TaskMessageRec判定邮箱不存在!\n",OSTimeGet()); OSTaskDel(OS_PRIO_SELF); /*不成功则删除本任务*/ return; }
while(1) {
prcount=(INT32U * )OSMboxPend(myMBox,0,perr); /*请求消息,如果消息不存在就阻塞*/ if (*perr==OS_ERR_NONE) printf("时间:%d,任务TaskMessageRec接收消息为%d\n",OSTimeGet(),*prcount); else printf("时间:%d,任务TaskMessageRec等待异常结束,错误号:%d\n",*perr);

北航ARM9实验报告:实验3uCOS-II实验

北航ARM9实验报告:实验3uCOS-II实验

北航ARM9实验报告:实验3uCOS-II实验北航 ARM9 实验报告:实验 3uCOSII 实验一、实验目的本次实验的主要目的是深入了解和掌握 uCOSII 实时操作系统在ARM9 平台上的移植和应用。

通过实际操作,熟悉 uCOSII 的任务管理、内存管理、中断处理等核心机制,提高对实时操作系统的理解和应用能力,为后续的嵌入式系统开发打下坚实的基础。

二、实验环境1、硬件环境:ARM9 开发板、PC 机。

2、软件环境:Keil MDK 集成开发环境、uCOSII 源代码。

三、实验原理uCOSII 是一个可裁剪、可剥夺型的多任务实时内核,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。

其基本原理包括任务管理、任务调度、时间管理、内存管理和中断管理等。

任务管理:uCOSII 中的任务是一个独立的执行流,每个任务都有自己的堆栈空间和任务控制块(TCB)。

任务可以处于就绪、运行、等待、挂起等状态。

任务调度:采用基于优先级的抢占式调度算法,始终让优先级最高的就绪任务运行。

时间管理:通过系统时钟节拍来实现任务的延时和定时功能。

内存管理:提供了简单的内存分区管理和内存块管理机制。

中断管理:支持中断嵌套,在中断服务程序中可以进行任务切换。

四、实验步骤1、建立工程在 Keil MDK 中创建一个新的工程,选择对应的 ARM9 芯片型号,并配置相关的编译选项。

2、导入 uCOSII 源代码将 uCOSII 的源代码导入到工程中,并对相关的文件进行配置,如设置任务堆栈大小、系统时钟节拍频率等。

3、编写任务函数根据实验要求,编写多个任务函数,每个任务实现不同的功能。

4、创建任务在主函数中使用 uCOSII 提供的 API 函数创建任务,并设置任务的优先级。

5、启动操作系统调用 uCOSII 的启动函数,使操作系统开始运行,进行任务调度。

6、调试与测试通过单步调试、查看变量值和输出信息等方式,对系统的运行情况进行调试和测试,确保任务的执行符合预期。

4、uCOS-II-任务同步与通信-2

4、uCOS-II-任务同步与通信-2
某一分布式系统,需要主设备(M_Dev)使用同一个 UART 资源分别与从设备1(S_Dev1)和从设备2(S_Dev2) 以不同的 “串行通信模式” 进行通信。
Rx
Tx
UART
M_Dev
Rx
Tx
UART
S_Dev1
Rx
Tx
UART
S_Dev2
2020/8/23
page 7
void main(void) //系统主函数 { OSInit();
void Task_A(void * pdata) { ......; //Task_A环境初始化
for (;;) { ......; // Task_A 业务 OSTaskCreate(UART_S1_Task,(void *)US1,......); ......; // Task_A 业务 OSTimeDly( xxx ); } }
常用的事件:信号量(计数型---SEM/互斥型--MUTEX)、消息邮箱(MBOX)、消息队列(Q)、事件标 志组等。
2020/8/23 事件用 “事件控制块”(ECB) 来描述。
page 1
目录
1、 任务间的同步和事件控制块 2、 信号量及其操作 3、互斥型信号量和任务优先级反转 4、消息邮箱及其操作 5、消息队列及其操作
Task_A
Task_B
Task_A would print
Prtinter
Task_B would print
备注:数据采集任务A 和数据处理任务B 之间存在互斥关系。
2020/8/23
page 5
1 任务间的同步和事件控制块
任务之间的这种相互制约、相互合作的运行机 制称为 “任务间的同步”

uCOS-II任务间通讯和同步实验15页

uCOS-II任务间通讯和同步实验15页
3
二 实验内容
实验内容
使用信号量实现任务间同步 使用邮箱实现任务之间的通讯
4
三 预备知识
预备知识
了解操作系统任务调度的机制 了解操作系统任务间通讯的机制 学习uC/OS-II操作系统下多任务应用程序的编写方法
5
四 实验设备
实验设备
JX44B0教学实验箱 ADT1000仿真器和ADT IDE集成开发环境 串口连接线
JX44B0实验系统教案 uC/OS-II任务间通讯和同步实验
武汉创维特信息技术有限公司
11.01.2020
提纲
1
实验目的
2 实验内容
3 预备知识
4 实验设备
5 基础知识 6 实验过程 7 实验报告要求
2
一 实验目的
实验目的
掌握uC/OS-II操作系统下使用信号量解决任务之间的同步 问题
掌握uC/OS-II操作系统下任务间通讯的-II中使用消息队列实现任务之间的通讯
消息队列是uC/OS-II中另一种通讯机制,它可以使一个任 务或者中断服务子程序向另一个任务发送以指针方式定义 的变量。因具体的应用有所不同,每个指针指向的数据结 构变量也有所不同。
uC/OS-II提供了7个对消息队列进行操作的函数:创建消 息队列函数OSQCreate(),等待消息队列函数OSQPend(), 先进先出(FIFO)发送消息函数OSQPost(),后进先出(LIFO) 发送消息函数OSQPostFront(),无等待获取消息函数 OSQAccept(),清空消息队列函数OSQFlush()和查询消息 队列函数OSQQuery()。
12
六 实验过程
实验过程
13
六 实验报告要求

实验2 uCOS-II任务间通讯和同步实验

实验2 uCOS-II任务间通讯和同步实验

嵌入式实时操作系统实验报告1实验名称:uC/OS-II任务间通讯和同步实验姓名:班级:信科10-4班学号:uC/OS-II任务间通讯和同步实验一、实验目的1、掌握uC/OS-II操作系统下使用信号量解决任务之间的同步问题;2、掌握uC/OS-II操作系统下任务间通讯的方法。

二、实验内容1、使用信号量实现任务间同步(Eg2工程)2、使用邮箱实现任务之间的通讯(Eg3工程)三、基础知识uC/OS-II任务之间的通讯与同步方式1、利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断2、利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度函数上锁和开锁3、信号量4、邮箱5、队列uC/OS-II中使用信号量进行任务之间同步1、通过调用OSSemCreate()建立信号量2、通过调用OSSemPost()函数发送一个信号量3、通过调用OSSemPend()函数等待一个信号量OSSemCreate1、Sem1 = OSSemCreate(0);2、参数为信号量的初始计数值赋值。

该初始值为0到65,535之间的一个数。

3、如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。

4、如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。

5、如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用。

OSSemPost和OSSemPend1、如果信号量当前是可用的(信号量的计数值大于0),将信号量的计数值减1,然后函数将“无错”错误代码返回给它的调用函数。

如果信号量的计数值为0,而OSSemPend()函数又不是由中断服务子程序调用的,则调用OSSemPend()函数的任务要进入睡眠状态,等待另一个任务(或者中断服务子程序)发出该信号量。

第7章uCOS-II操作系统实验

第7章uCOS-II操作系统实验

第7章uCOS-II操作系统实验第7章μC/OS-II操作系统实验7.1 实验目的掌握μC/OS-II操作系统的基本使用方法。

掌握μC/OS-II操作系统中时钟节拍的概念和方法。

掌握μC/OS-II操作系统的任务管理的机制。

掌握μC/OS-II操作系统的任务之间进行通讯的方法。

掌握使用标准库函数和μC/OS-II操作系统编写多任务程序的设计方法。

7.2 实验内容(1)设计具有串口通信功能的多任务程序●每个任务在运行时向上位机串口输出“Taskx is running”,x 为任务号;●至少创建除启动任务外的3个任务;●任务1和任务2根据延时运行,运行1次任务1之后运行2次任务2;●任务1运行5次后删除任务1;●任务2运行10次后,通过挂起和恢复方式,任务2执行3次后执行一次任务3。

(2)设计基于邮箱消息的多任务程序●每个任务在运行时向上位机串口输出“Taskx is running”,x 为任务号;●至少创建除启动任务外的2个任务;●任务1根据延时运行;●任务2由串口命令运行(一个任意字符运行一次)或定时器触发运行(邮箱消息方式);●发挥:能够基于ucos-II设计一个显示任务,显示动画。

7.3 实验步骤(1)设计具有串口通信功能的多任务程序。

设计多任务方案、分析功能、设计流程图、确定变量功能和作用域、编写程序、调试代码、记录实验结果。

(2)设计基于邮箱消息的多任务程序。

设计多任务方案、设计通讯方案、分析功能、设计流程图、确定变量功能和作用域、编写程序、调试代码、记录实验结果。

7.4 实验结果附设计方案、流程图、程序的执行结果7.5 实验总结总结实验经验、总结中断服务程序的编写方法、分析程序中的缺陷及改进的方法。

7.6多任务例程Main.c的代码#include#define STACK_SIZE 128static OS_STK MyTask1Stack[STACK_SIZE];static OS_STK MyTask2Stack[STACK_SIZE];static OS_STK StartTaskStack[STACK_SIZE];#define MYTASK1_PRIO 10#define MYTASK2_PRIO 15#define STARTTASK_PRIO 8void MyTask1(void* p_arg);void MyTask2(void* p_arg);void StartTask(void* p_arg);void GPIO_Conf(void);int main(void){OSInit();OSTaskCreate(StartTask,(void*)0,(OS_STK*)&StartTaskStack[S TACK_SIZE-1],STARTTASK_P RIO);OSStart();void GPIO_Conf(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE );GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_SetBits(GPIOF,GPIO_Pin_6|GPIO_Pin_7);}void StartTask(void* p_arg){GPIO_Conf();SysTick_Config(SystemCoreClock/1000);OSTaskCreate(MyTask1,(void*)0,(OS_STK*)&MyTask1Stack[STACK_SIZE-1],MYTASK1_PRIO);OSTaskCreate(MyTask2,(void*)0,(OS_STK*)&MyTask2Stack[STACK_SIZE-1],MYTASK2_PRIO);OSTaskDel(OS_PRIO_SELF);}void MyTask1(void* p_arg){while(1){GPIO_WriteBit(GPIOF,GPIO_Pin_6,(BitAction)(1-GPIO_ReadInputDataBit(GPIOF,GPIO_ Pin_6)));OSTimeDly(1000);}void MyTask2(void* p_arg){while(1){GPIO_WriteBit(GPIOF,GPIO_Pin_7,(BitAction)(1-GPIO_ReadInputDataBit(GPIOF,GPIO_ Pin_7)));OSTimeDly(100);}}。

4、uCOS-II-任务同步与通信-1

Repeat
禁止,然后允许任务切换 :利用μC/OS_Ⅱ 函数调用
Entry section (进入区)
Critical section (临界区)
Exit section (退出区)
Remainder section (剩余区)
Until false
2020/8/23
OSSchedLock();
if (OSRunning == TRUE) { /* Make sure multitasking is running */ OS_ENTER_CRITICAL(); if (OSLockNesting < 255) { /* Prevent OSLockNesting from wrapping
互斥信号量状态图
释放(递归) 锁定数减1
page 21
互斥信号量
所有权:当一个任务通过获取互斥信号量 而将其锁定时,得到该互斥信号量的所有 权。相反,当一个任务释放信号量时,失 去对其的所有权。
当一个任务拥有互斥信号量时,其他的任 务不能再锁定或释放它,即任务要释放互 斥信号量,必须事前先获取该信号量。
这通常称作测试并置位(Test-And-Set),或称作TAS。 TAS操作可能是微处理器的单独一条不会被中断的 指令,或者是在程序中关中断做TAS操作再开中断。
有的微处理器有硬件的TAS指令(如Motorola 68000系列,就 有这条指令)
2020/8/23
page 14
访问临界资源
Repeat
当运行到P1:request(D2)时,P1占用D1,但D2已经被P2占用, P1阻塞; 当运行到P2:request(D1)时,也将因为D1已被P1占用而阻塞, 产生死锁(条件: P1:request(D1), P2:request(D2))。 死锁:多个任务在运行过程中因争夺资源而造成的一种僵局。 原因:竞争资源引起;任务间推进顺序非法。

uCOS-II操作系统简介及实验解读

uC/OS-II操作系统
uC/OS-II操作系统
uC/OS-II操作系统简介 及开发过程
uC/OS-II操作系统
内 容
• • • • • • • •
一、 uCOS-II操作系统简介 二、 uCOS-II操作系统内核结构
三、 uCOS-II操作系统任务管理
四、 uCOS-II操作系统内存管理 五、 uCOS-II操作系统时间管理 六、 uCOS-II操作系统任务间的通讯 七、 uCOS-II操作系统移植 八、 uCOS-II操作系统实验
}任务(task)
•
μC/OS-Ⅱ可以管理多达64个任务。
优先级为0-63 优先级号越低,任务的优先级越高。 每个任务的优先级不能相同。
•
保留优先级:
高优先级:0、1、2、3 低优先级:OS_LOWEST_PRIO-3、 OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及 OS_LOWEST_PRI0
•
用户可以有多达56个应用任务。
uC/OS-II操作系统
删除任务
2.3 任务状态
等待 或挂 起 收 到 消 息
挂 起 时 间 到 任务调度
等 待 消 息
挂 起
中断
创建任务
休眠
删除任务
就绪
任务被抢占
删除任务
运行
中断结束
中断 服务
uC/OS-II操作系统
任务状态
• • • • • •
休眠态 - OSTaskCreate()或OSTaskCreateExt() 就绪态 等待态,就绪态,运行态 - OSTaskDel() - 休眠态 就绪态 - OSStart() - 运行态 运行态 - OSTimeDly()或OSTimeDlyHMSM() , OSSemPend(),OSMboxPend(),或OSQPend() 等待态 等待态 - OSTimeTick() -就绪态 空闲任务 - OSTaskIdle()

实验二-UCOS-II任务管理

班级学号姓名同组人实验日期室温大气压成绩实验二 UCOS-II任务管理一、实验目的1、掌握UCOS-II中任务管理的函数的应用。

2、掌握UCOS-II在STM32平台下对硬件的控制。

3、掌握开发UCOS-II应用的程序结构。

二、实验步骤1、UCOSII工作原理UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。

这个时钟节拍由OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms~100ms。

本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。

UCOSII的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。

在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。

UCOSII不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。

任务的调度其实就是CPU 运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程UCOSII的每个任务都是一个死循环。

每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。

睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。

就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。

运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。

4、uCOS-II-任务同步与通信-1

当运行到P1:request(D2)时,P1占用D1,但D2已经被P2占用, P1阻塞; 当运行到P2:request(D1)时,也将因为D1已被P1占用而阻塞, 产生死锁(条件: P1:request(D1), P2:request(D2))。 死锁:多个任务在运行过程中因争夺资源而造成的一种僵局。 原因:竞争资源引起;任务间推进顺序非法。
POST
任务与ISR 之间的同步 (单向)
任务与任务 之间的同步 (双向)
page 8
在嵌入式多任务系统中,任务间的耦合 程度是不一样的:
耦合程度较高:任务之间需要进行大量的通 信,相应的系统开销较大;
耦合程度较低:任务之间不存在通信需求, 其间的同步关系很弱甚至不需要同步或互斥, 系统开销较小。
Exit section (退出区)
Remainder section (剩余区)
Until false
2020/8/23
关中断和开中断:利用μC/OS_Ⅱ 宏调用
OS_ENTER_CRITICAL();
__asm { MRS temp, SPSR ORR temp, temp, #NoInt MSR SPSR_c, temp } OsEnterSum++;
双向同步或通信:两个任务相互同步或通信。 双向同步不能在任务与ISR之间进行,因为 ISR不能等待。
2020/8/23
page 7
Task x
POST
ISR x
POST
POST
Task x
PEND
2020/8/23
PEND
Task y
任务与任务 之间的同步 (单向)
PEND
Task y
PEND
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档