欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    嵌入式实操时作系统.ppt

    • 资源ID:5970487       资源大小:2.32MB        全文页数:81页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式实操时作系统.ppt

    嵌入式操作系统第三讲 嵌入式实时操作系统,一、嵌入式实时操作系统C/OS二、嵌入式Linux三、WinCE,第三讲、嵌入式实时操作系统分析,本节提要,1,3,2,嵌入式实时操作系统C/OS,嵌入式Linux,WinCE,一、嵌入式实时操作系统C/OS,C/OS简介内核结构任务以及调度机制C/OS的移植,C/OS简介,1、C/OSmicro C O S,微控制器操作系统2、C/OS简介美国人Jean Labrosse 1992年完成应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 1998年C/OS II,公开源代码可移植性(Portable)绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。C/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。可裁剪(Scalable)可以只使用 C/OS-II中应用程序需要的那些系统服务,这样可以减少产品中的 C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。,C/OS的性能特点,占先式(Preemptive)多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务。可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性。任务栈 每个任务有自己单独的栈,C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。,C/OS的性能特点,系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。稳定性与可靠性,C/OS的性能特点,内核结构任务管理时间管理任务之间通信与同步,C/OS的内核结构,任务task,典型的一个无限循环。void mytask(void*pdata)for(;)do something;waiting;do something;C/OS II 2.5版本支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小。(Windows、Linux?)系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_ PRIO-1、OS_LOWEST_PRIO-0。,建立任务,OS TaskCreate()OSTaskCreateExtended(),INT8U OSTaskCreate(void(*task)(void*pd),void*p_arg,OS_STK*ptos,INT8U prio)INT8U OSTaskCreateExt(void(*task)(void*pd),void*p_arg,OS_STK*ptos,INT8U prio,INT16U id,OS_STK*pbos,INT32U stk_size,void*pext,INT16U opt),进程函数体传递给进程的参数进程栈顶指针进程优先级进程ID号进程栈底指针进程栈大小传递给进程控制块的数据是否初始化进程栈,任务状态,任务控制块(TCB),任务控制块 OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。所有的任务控制块分为两条链表,空闲链表和使用链表。,任务控制块结构,Struct os_tcb OS_STK*OSTCBStkPtr;struct os_tcb*OSTCBNext;struct os_tcb*OSTCBprev;OS_EVENT*OSTCBEventPtr;void*OSTCBMsg;INT16U OSTCBDly;INT8U OSTCBStat;INT8U OSTCBPrio;INT8U OSTCBX,OSTCBY,OSTCBBitX,OSTCBBitY;OS_TCB,加速任务进入就绪态的过程,事件控制块的指针,任务的状态字,空任务列表,系统初始化时,所有任务控制块被链接成空任务控制块的单向链表,任务的调度-OSSched,C/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU所有权并投入运行。C/OS中不支持时间片轮转法,每个任务的优先级不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。将被挂起的任务寄存器入栈将较高优先级任务的寄存器出栈PC指针跳转到新的位置开始执行C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。(Linux?),检查是否中断调用和允许任务调用,找到优先级最高的任务,该任务是否正在运行,根据优先级找到任务在就绪任务表中的位置,每个任务的就绪状态标志都标入就绪表中(ready list)中,就绪表有两个变量:DORdyGrp、OSRdyTbl,根据优先级确定就绪表,假设优先级为12的任务进入就绪状态,12=1 100b,则OSRdyTbl1的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:OSRdyGrp|=0 x02;OSRdyTbl1|=0 x10;而优先级为21的任务就绪21=10 101b,则OSRdyTbl2的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:OSRdyGrp|=0 x04;OSRdyTbl2|=0 x20;,根据优先级确定就绪表,从上面的计算我们可以得到:若第n位置1,则应该与2n 相或。uC/OS中,把2n的n=0-7的8个值 先计算好存在数组OSMapTbl7中,也就是:OSMapTbl0=20=0 x1;OSMapTbl1=21=0 x2;OSMapTbl7=27=0 x80;,根据优先级确定就绪表,利用OSMapTbl,通过任务的识别号优先级prio来设置任务在就绪组和就绪表数组中相应位置的数学式为:OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio,根据就绪表确定最高优先级,两个关键:优先级数分解为高三位和低三位分别确定;高优先级有着小的优先级号;,根据就绪表确定最高优先级,通过OSRdyGrp值确定高3位,假设为0 x24=100 100b,OSRdyTbl2 和OSRdyTbl5,高优先级为第2组通过OSRdyTbl2的值来确定低3位,假设为0 x12=010010b,第1个和第4个任务,取高优先级第1个 prio=17,源代码中使用了查表法,查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的:High3=OSUnMapTblOSRdyGrp;Low3=OSUnMapTblOSRdyTblHigh3;Prio=(Hign33)+Low3;?为什么频繁的使用查表法?请问OSUnMapTbl的来历;,INT8U const OSUnMapTbl=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;,任务间通信手段,C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护OSSchedLock()禁止调度保护任务级的共享资源。提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。,事件控制块ECB,所有的通信信号都被看成是事件(event),一个称为事件控制块(ECB,Event Control Block)的数据结构来表征每一个具体事件,ECB的结构如下:typedef struct void*OSEventPtr;/*指向消息或消息队列的指针*/INT8U OSEventTblOS_EVENT_TBL_SIZE;/*等待任务列表*/INT16U OSEventCnt;/*计数器(当事件是信号量时)*/INT8U OSEventType;/*事件类型:信号量、邮箱等*/INT8U OSEventGrp;/*等待任务组*/OS_EVENT;与TCB类似的结构,使用两个链表,空闲链表与使用链表,信号量semaphore,信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。uC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制,也可以是其他整数。系统通过OSSemPend()和OSSemPost()来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。,多任务的启动,首先创建任务最后调用OSStart开始多任务调度void main()OSInit();.OSTaskCreat().OSStart();,任务的格式,每个任务不能占用全部CPU的资源需要有等待,或延时等系统调用典型的一个无限循环。void mytask(void*pdata)for(;)do something;waiting;do something;,任务调度,For example1 创建2个任务,每个任务仅仅是进行延时,延时不同的时间片,不同优先级void Task1(void)void Task2(void)while(1)while(1)blinkled1();blinkled2();Task1Data+;Task2Data+;OSTimeDly(25);OSTimeDly(50);,void main()sysinit();OSInit();OSTaskCreate(Task1,(void*),void OSStart(void)INT8U y,x;if(OSRunning=FALSE)判断是否没有启动内核 y=OSUnMapTblOSRdyGrp;x=OSUnMapTblOSRdyTbly;OSPrioHighRdy=(INT8U)(y 3)+x);找到优先级最高的准备就绪任务 OSPrioCur=OSPrioHighRdy;当前运行任务优先级 OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;根据任务优先级找到任务 OSTCBCur=OSTCBHighRdy;OSStartHighRdy();让优先级最高的任务运行起来,OSStartHighRdyLDRr4,addr_OSTCBCur;得到当前任务的TCB地址LDRr5,addr_OSTCBHighRdy;得到最高优先级任务的TCB地址LDRr5,r5;得到任务栈顶指针,注:任务栈顶是TCB的第一个成员LDRsp,r5;切换栈顶指针,也就是切换任务STRr5,r4;改变addr_OSTCBCur值为最高优先级任务TCB地址LDMFDsp!,r4;取任务栈中保存的CPU保存状态寄存器SPSRMSRSPSR_cxsf,r4;改变CPU保存状态寄存器SPSRLDMFDsp!,r4;取任务栈中保存的当前CPU状态寄存器CPSRMSRCPSR_cxsf,r4;改变当前CPU状态寄存器CPSRLDMFDsp!,r0-r12,lr,pc;从栈中恢复其它上下文内容,包括r0-r12,lr等;另外跳转PC指针到新任务的代码执行END,void OSSched(void)INT8U y;OS_ENTER_CRITICAL();if(OSLockNesting|OSIntNesting)=0)调度锁,或者处于中断状态禁止调度 y=OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(y 3)+OSUnMapTblOSRdyTbly);获取准备就绪组里最高优先级的任务 if(OSPrioHighRdy!=OSPrioCur)OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;设置运行任务为最高优先级任务 OSCtxSwCtr+;OS_TASK_SW();执行上下文切换 OS_EXIT_CRITICAL();,OS_TASK_SW 任务的上下文切换,保护当前任务的现场恢复新任务的现场开始执行新的任务自己阅读代码,什么也不做的空闲任务,只是为了消耗CPU的时间片void OSTaskIdle()for(;)OS_ENTER_CRITICAL();OSIdleCtr+;OS_EXIT_CRITICAL();,中断与时钟节拍,我们知道:当发生中断时,首先应保护现场,将CPU寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回iret(x86)指令实现中断返回。uC/OS中提供了OSIntEnter()和OSIntExit()告诉内核进入了中断状态。OSIntNesting标识中断嵌套层次。时钟节拍是一种特殊的中断,操作系统的心脏。首先32位的整数OSTime加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。,void OSTimeDly(INT16U ticks)if(ticks 0)确保tick大于0 OS_ENTER_CRITICAL();进入临界段代码 if(OSRdyTblOSTCBCur-OSTCBY 调度下一个任务开始运行,时钟定时,void OSTimeTick(void)OS_TCB*ptcb;ptcb=OSTCBList;-OSTCB链表指针 while(ptcb-OSTCBPrio!=OS_IDLE_PRIO)是不是空闲任务?空闲任务在队列尾部 if(ptcb-OSTCBDly!=0)是否延时 if(-ptcb-OSTCBDly=0)延时减一,看是否延时结束 if(!(ptcb-OSTCBStat 变量加一,记录系统启动以来的时钟滴答数,时钟节拍函数,OSTimeTick(void),时间,任务一,任务二,OSStart,Time Tick,Time Tick,0,25,50,Time Tick,空闲任务,5,总结,不存在一个内核任务/实体,内核的管理是通过调用系统函数来实现的。每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。,COS-II在ARM9上的移植,所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。,移植COS-II满足的条件,处理器的C编译器能产生可重入代码。在程序中可以打开或者关闭中断。处理器支持中断,并且能产生定时中断(通常在101000Hz之间)。处理器能够容纳一定量数据的硬件堆栈。处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令。,打开/关闭中断,在COS-II中,可以通过:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。在ARM9的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。(CPSR的I/F位、MSR、MRS),处理器支持中断并且能产生定时中断,COS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM9的处理器上可以产生定时器中断。本系统工作在200MHz的主频下,可以设置定时器的中断的频率为100Hz。也就是系统的响应时间为10ms。,处理器支持硬件堆栈,COS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II多任务调度的基础。ARM9处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。(LDM、STM),例:C/OS-II在S3C2410上的移植,设置OS_CPU.H中与处理器和编译器相关的代码 用C语言编写六个操作系统相关的函数OS_CPU_C.C用汇编语言编写四个与处理器相关的函数OS_CPU.ASM,设置与处理器和编译器相关的代码,OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。与 ARM处理器相关的代码,使用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()宏开启关闭中断。设施堆栈的增长方向 堆栈由高地址向低地址增长,用汇编语言编写四个与处理器相关的函数,OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR(),移植要点,定义函数OS_ENTER_CRITICAL和OS_ENTER_ CRITICAL。定义函数OS_TASK_SW执行任务切换。定义函数OSCtxSw实现用户级上下文切换,用汇编实现。定义函数OSIntCtxSw实现中断级任务切换,用汇编实现。定义函数OSTickISR。定义OSTaskStkInit来初始化任务的堆栈。,本节提要,1,3,2,嵌入式实时操作系统C/OS,嵌入式Linux,WinCE,Linux的特点,Linux系统是层次结构且内核完全开放强大的网络支持功能 Linux具备一整套开发工具链 Linux具有广泛的硬件支持特性 遵循通用国际标准,便于程序的移植,Linux的结构,类UNIX,嵌入式Linux,嵌入式Linux(Embedded Linux)是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几兆字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。嵌入式Linux的开发和研究是目前操作系统领域的一个热点。RTLinuxCLinux,Linux作为嵌入式应用的缺点,首先linux最初设计为通用操作系统,其目标是追求整体最佳性能,所以不能很好处理实时任务;其次,如何精简linux适用于嵌入式环境也是一个难题。,嵌入式linux的研究内容,嵌入式linux内核技术 嵌入式库技术 开发环境技术 BIOS和boot loader启动加载程序设备驱动技术图形界面技术嵌入式应用,几种嵌入式Linux,MontaVista linux MontaVista Linux是由MontaVista公司开发产品,是目前最具影响力嵌入式Linux。MontaVista通过直接修改内核来扩充linux内核的实时性。RTlinux RTlinux是FSMLabs开发的硬实时嵌入式linux。RTlinux使用双内核结构;在底层使用一个硬实时内核,linux作为该内核的空闲任务;当有实时任务时,通过硬实时内核调度该任务;没有其他任务时,则运行普通linux。uClinux uClinux是针对无mmu微控制领域而设计的Linux系统。u是希腊字母表示”小”,C是controller表示控制器。uClinux和标准linux最大的区别是内存管理上,标准linux利用CPU硬件的支持实现虚拟内存机制,而uClinux采用实存储器管理策略。,uCLinux是一个完全符合GNU/GPL公约的项目,完全开放代码,现由Lineo公司支持维护。英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uCLinux就是Micro-Control-Linux,字面上的理解就是“微控制领域中的Linux系统”。它专门针对没有MMU的CPU,并专为嵌入式系统做了许多小型化的工作,已支持前面提到的多款CPU。uCLinux与nommu相关的功能现已被合并到Linux 2.6核心中。,Clinux,内存管理,uClinux同标准Linux的最大区别就在于内存管理,标准Linux使用的虚拟存储器技术 标准Linux是针对有内存管理单元的处理器设计的。虚拟地址被送到内存管理单元(MMU),把虚拟地址映射为物理地址。采用分页的方式来载入进程。实际存储器分割为相同大小的页面。虚拟存储器由存储器管理机制及一个大容量的快速硬盘存储器支持。当一个程序在运行之前,没有必要全部装入内存,而是仅将那些当前要运行的那些部分页面装入内存运行(copy-on-write)。通过赋予每个任务不同的虚拟-物理地址转换映射(页表),还可支持不同任务之间的保护、共享等。对于多进程管理当处理器进行进程切换并执行一个新任务时,一个重要部分就是为新任务切换页表。,标准Linux系统的内存管理功能,可以运行只加载了部分的程序,缩短了程序启动的时间 运行比内存还要大的程序。理想情况下应该可以运行任意大小的程序可以使多个程序同时驻留在内存中提高CPU的利用率可以运行重定位程序。即程序可以方于内存中的任何一处,而且可以在执行过程中移动 可以进行程序代码共享提供内存保护,进程不能以非授权方式访问或修改页面,内核保护单个进程的数据和代码以防止其它进程修改它们。代价:内存管理需要地址转换表和其他一些数据结构,留给程序的内存减少了。地址转换增加了每条指令的执行时间,而对于有额外内存操作的指令会更严重。当进程访问不在内存的页面时,系统处理失效的磁盘I/O操作极耗时间。,针对NOMMU的特殊处理,uClinux针对没有MMU的处理器设计,不能使用处理器的虚拟内存管理技术;uClinux仍然沿用标准Linux的分页内存管理结构,系统在启动时把实际存储器进行分页,但实际上采用的是实存储器管理策略。uClinux系统对于内存的访问是直接的,(它对地址的访问不需要经过MMU,而是直接送到地址线上输出),所有程序中访问的地址都是实际的物理地址。操作系统对内存空间没有保护,各个进程实际上共享一个运行空间(没有独立的地址转换表)。一个进程在执行前,系统必须为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。由于程序加载地址与预期(ld文件中指出的)通常都不相同,这样重定向过程就是必须的。磁盘交换空间无法使用的,系统执行时如果缺少内存将无法通过磁盘交换来得到改善。编译器要专门修改,uCLinux对用户程序采用静态链接的形式。,对开发人员提出的更高要求,从易用性来说,uClinux的内存管理实际上是一种倒退,退回了到了UNIX早期或是Dos系统时代。开发人员不得不参与系统的内存管理。由于应用程序加载时必须分配连续的地址空间,而针对可连续地址分配内存大小是受限的,开发人员在开发应用程序时必须考虑内存的分配情况并关注应用程序需要运行空间的大小。用户程序同内核以及其它用户程序在一个地址空间,开发人员的权利增大了(开发人员在编程时可以访问任意的地址空间),但与此同时系统的安全性也大为下降。从嵌入式设备实现的功能来看,嵌入式设备通常在某一特定的环境下运行,只要实现特定的功能,其功能相对简单,内存管理的要求完全可以由开发人员考虑。,本节提要,1,3,2,嵌入式实时操作系统C/OS,嵌入式Linux,WinCE,WinCE的基本架构,WinCE的基本架构与桌面系统的不同:文件系统内存管理进程管理,WinCE1.0的外观,WinCE2.0的外观以及字体选择对话框,2。0外观,WinCE的进程之间通讯的模式为RPC方式:,进程间的通讯方式,WinCE的虚拟内存管理和进程在内存中的位置:支持32个进程,其中slot0的为当前活动进程。,虚拟内存,WinCE的进程间的安全管理,使用的是一个32bit的key.,进程间的安全管理,WinCE的特定的DLL在各个slot有固定的数据段位置,数据位置,Ram中的文件能够掩盖Rom中的同名文件:,文件覆盖,WinCE中的文件都是以压缩方式存储的。,文件压缩,WinCE中的控件:,控件,汉化过程中要修改的部分以及要监听的消息:,消息,制作输入法需要修改的位置:,输入法,字体显示部分,可以使用CE系统原有的部分,但是需要自己修改字体文件。,字体,组装,WinCE系统的组装方式和部件。最后生成一个NK.BIN文件,用来做ROM.整个过程用一个sysgen.bat来完成。,谢 谢 各 位,

    注意事项

    本文(嵌入式实操时作系统.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开