课程设计(论文)-基于实时操作系统的单片机多任务应用程序设计.doc

上传人:yyf 文档编号:3292791 上传时间:2019-08-08 格式:DOC 页数:28 大小:189.51KB
返回 下载 相关 举报
课程设计(论文)-基于实时操作系统的单片机多任务应用程序设计.doc_第1页
第1页 / 共28页
课程设计(论文)-基于实时操作系统的单片机多任务应用程序设计.doc_第2页
第2页 / 共28页
课程设计(论文)-基于实时操作系统的单片机多任务应用程序设计.doc_第3页
第3页 / 共28页
课程设计(论文)-基于实时操作系统的单片机多任务应用程序设计.doc_第4页
第4页 / 共28页
课程设计(论文)-基于实时操作系统的单片机多任务应用程序设计.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《课程设计(论文)-基于实时操作系统的单片机多任务应用程序设计.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)-基于实时操作系统的单片机多任务应用程序设计.doc(28页珍藏版)》请在三一文库上搜索。

1、重庆科技学院重庆科技学院 课程设计报告课程设计报告 院(系):_电气与信息工程学院_ 专业班级: 计科普 2008-02 学生姓名: 学 号: 设计地点(单位)_ _ I515_ _ _ 设计题目:_ 基于实时操作系统的单片机多任务应用程序设计_ 完成日期: 2011 年 7 月 4 日 指导教师评语: _ _ _ _ _ _ _ _ 成绩(五级记分制):_ _ _ 指导教师(签字):_ _ _ 重庆科技学院重庆科技学院 课程设计任务书课程设计任务书 设计题目:基于实时操作系统的单片机多任务应用程序设计 学生姓名 课程名称 实时操作系统 (ucos-II) 专业班级计科普 2008 地 点 I

2、313 起止时间2011 年 6 月 27 日-2011 年 7 月 8 日 设 计 内 容 及 要 求 1、 充分消化 ucos-II 内核,理解其内核架构。体会相关数据结构的设计。 2、 在第 1 步的基础上,消化 Small RTOS51 内核。弄清其为了实现在 128 个字节的 单片机环境下在内核的数据结构做了如何优化设计。 3、 将 Small RTOS51 移植到 MCS-51 单片机的最小系统板上,使在上面进行正常运 行。 4、 基于 Small RTOS51 平台的 MCS-51 单片机上,编写: (1)LED 显示驱动程序。 (2)键盘扫描驱动程序。 (3)串口通信接收和发送

3、驱动程序 5、 在前面的基础上完成一个基于 Small RTOS51 的多任务应用程序,并在 MCS-51 最小系统板上调试通过。 设 计 参 数 1、 写出 ucos-II 内核的架构 2、 比较 Small RTOS 与 ucos-II 实时操作系统的异同,及各自优缺点。 3、 实现 Small RTOS 在 MCS-51 最小系统板上的移植,写清移植原理和步骤。 4、 至少实现设计要求中的三个驱动程序中的二个及以上。 5、 结合自已在课程中、平时或竞赛中涉及的题目,改用基于 small RTOS 进行 实现(系统必须实现的多任务应用程序在 MCS-51 上应能稳定的运行) 。 进 度 要

4、 求 6 月 27 完成 ucos-II 内核架构剖析,6 月 27 日-29 日完成 Small RTOS51 内核的分 析。6 月 30 日完成 Small RTOS51 向 MCS-51 单片机最小系统板的移植。7 月 1 日-7 月 2 日完成相关驱动程序的编写和调试。7 月 3 日-7 月 6 日完成相应在多任务应用 程序的编写,并集成到 MCS-51 最小系统板上,使其稳定运行。7 月 7 日设计志成果 汇报和答辩。7 月 8 日完成设计报告。 参 考 资 料 其 它 说 明 .本表应在每次实施前一周由负责教师填写二份,院系审批后交院系办备案,一 份由负责教师留用。.若填写内容较多

5、可另纸附后。 3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。 教研室主任: 指导教师: 年 月 日 I 摘要 嵌入式系统是软件和硬件的综合体,嵌入式系统是与应用紧密结合的,具 有很强专用性,必须结合实际系统需求进行合理的裁减利用。 本设计任务是基于实时操作系统的单片机多任务应用程序设计。通过深入 剖析 C/OS-内核架构,之后理解和读懂 small RTOS 微型嵌入式操作系统的 内核。实现多任务的驱动程序,实现 LED 驱动、串口驱动和键盘驱动。 关键词:嵌入式系统 实时 多任务 驱动 II 目目 录录 1 系统需求分析1 1.1 设计内容与目的 .1 1.2 设计的实现方

6、案.1 2.总体设计2 2.1 设计模块图.2 2.2 UCOS-II 内核架构 .2 2.3 SMALL RTOS 与UC/OS-II 的异同5 2.4 SMALL RTOS 移植到单片机5 2.4 SMALL RTOS 驱动程序9 3 详细设计10 3.1LED 驱动程序 .10 3.2 键盘驱动程序 .14 3.3 串口收发驱动程序 .17 3.4 功能实现 20 4. 设计总结21 5 致谢22 6 参考文献23 1 1 1 系统需求分析系统需求分析 1.1 设计内容与目的 本课程完成的主要内容有:本课程完成的主要内容有: (1)写出 C/OS-内核的架构。 (2)比较 Small R

7、TOS 与 C/OS-实时操作系统的异同,及各自优缺点。 (3)实现 Small RTOS 在 MCS-51 最小系统板上的移植,写清移植原理和步骤。 (4)至少实现设计要求中的三个驱动程序中的二个及以上。 本课程设计的目的是:本课程设计的目的是: 通过该课程设计学习,深入理解嵌入式操作系统的作用,C/OS-内核 的架构。深入理解 small RTOS 内核架构,学会移植 small RTOS 到单片机上, 并在单片机上运行应用程序。 1.2 设计的实现方案 本设计在 51 单片机上移植小系统,并且在小系统上编写多任务驱动程序。 驱动程序包括:LED 驱动、串口驱动和键盘驱动。 驱动的设计可以

8、用多任务实现,这样可以让系统更加稳定,减少开发时间。 2 2.2.总体设计总体设计 2.1 设计模块图 该设计的功能模块如下图所示: 微型操作系统 small RTOS 移植 small RTOS 到 51 单片机上 编写 LED 驱动 程序 编 写 键盘 驱动 程序 编 写 串 口 收 发 程 序 图 2.1 功能模块图 2.2 ucos-II 内核架构 作为一个轻量级的操作系统,C/OS-提供的功能包括:任务管理、中断 管理、时间管理、信号量、邮箱、消息队列、互斥信号量等,可基本满足较小 系统的需要。C/OS-内核支持优先级调度算法,每个任务可根据重要程度的 不同被赋予一定的优先级,CPU

9、 总是让处于就绪态的、优先级最高的任务先运 行。 C/OS-的实时内核都是可剥夺型内核。最高优先级的任务一旦就绪,总 能得到 CPU 的控制权。当一个运行着的任务使一个比它优先级高的任务进入了 就绪态,当前任务的 CPU 使用权就被剥夺了,或者说被挂起了,那个高优先级 3 的任务立刻得到了 CPU 的控制权。如果是中断服务子程序使一个高优先级的任 务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始 运行。 1.C/OS-1.C/OS-的特点的特点 可移植性可移植性 C/OS-绝大部分的源码是用移植性很强的 ANSI C 写的。和微处理器硬件相 关的那部分是用汇编语言写的。汇编

10、语言写的部分已经压到最低限度,使得 C/OS-便于移植到其他微处理器上。 可裁剪可裁剪 可以只使用 C/OS-中应用程序需要的那些系统服务。这样可以减少产品 中的 C/OS-所需的存储空间(RAM 和 ROM),这种可裁剪性是靠条件编译实 现的。 占先式占先式 C/OS-完全是占先式的实时内核。这意味着 C/OS-总是运行就绪条 件下任务级最高的任务。 多任务多任务 C/OS-最多只能管理 64 个任务,包括空闲任务和统计任务。同时赋予 每个任务的优先级必须是不同的,C/OS-不支持时间片轮转法。 任务栈任务栈 每个任务有自己单独的栈,C/OS-允许每个任务有不同的栈空间。以便 压低应用程序对

11、 RAM 的需求。 系统服务系统服务 C/OS-提供一些系统服务,例如消息队列、信号量、互斥信号量、时间 相关函数等。 中断管理中断管理 中断可以使正在执行的任务暂时挂起。如果优先级更高的任务被该中断唤 醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达 255 层。 4 实时性实时性 C/OS-对实时任务有很强的支持能力,能完成多任务并且有较短的中断 响应时间,从而使内部的代码和实时内核心的执行时间减少到最低限度。 2.uC/OS-II2.uC/OS-II 组成部分组成部分 uC/OS-II 大致可以分成系统核心(包含任务调度)、任务管理、时间管理、 多任务同步与通信、内存管

12、理、CPU 移植等部分。 (1) 核心部分(OSCore.c) :uC/OS-II 处理核心,包括初始化、启动、中断 管理、时钟中断、任务调度及事件处理等用于系统基本维持的函数。 (2) 任务管理(OSTask.c) :包含与任务操作密切相关的函数,包括任务建 立、删除、挂起及恢复等,uC/OS II 以任务为基本单位进行调度。 (3) 时钟部分(OSTime.c) :uC/OS-II 中最小时钟单位是 timetick(时钟节 拍),其中包含时间延迟、时钟设置及时钟恢复等与时钟相关的函数。 (4) 多任务同步与通信(OSMbox.c, OSQ.c, OSSem.c, OSMutex.c, O

13、SFlag.c): 包含事件管理函数,涉及 Mbox、msgQ、Sem、Mutex、Flag 等。 (5) 内存管理部分(OSMem.c):主要用于构建私有的内存分区管理机制,其 中包含创建 memPart、申请/释放 memPart、获取分区信息等函数。 (6) CPU 接口部分:uC/OS-II 针对特定 CPU 的移植部分,由于牵涉到 SP 等系统指针,通常用汇编语言编写,包括任务切换、中断处理等内容。 3.uC/OS-II 任务调度任务调度 uC/OS-II 采用基于优先级的调度算法,总是选择当前处于就绪状态的优先 级最高的任务进行调度。uC/OS-II 是可抢占性的强实时性 OS,在

14、完成中断后允 许进行新的任务调度。 uC/OS-II 有两种调度方式:任务级任务调度、中断级任务调度。有两种调度方式:任务级任务调度、中断级任务调度。 (1)任务级任务调度 指在非中断返回时进行任务调度,一般发生在当前任务因时间延迟或等待 某事件而阻塞或被挂起,或有更高优先级的任务处于就绪状态。 任务的基本信息: CPU 的 PC 寄存器:任务当前执行的位置; CPU 的通用寄存器:任务当前执行涉及的临时数据; 5 CPU 的状态寄存器:存储当前 CPU 的状态。 任务级任务切换:从一个任务直接切换至另一个任务,不涉及 CPU 状态的 切换,OS_TASK_SW()既保存当前任务上下文,又恢复

15、新任务上下文。 过程:OS_Sched()- OS_TASK_SW() (2)中断级任务调度 在中断处理完成后,通过 OSIntExit()判断是否有更高优先级就绪任务。如果 有,调用 OSIntCtxSW()恢复新任务上下文。在中断处理中,已经保存了被中断 任务的上下文,所以这里仅仅恢复。 过程:OSIntExt() OSIntEnter() - ISR OSIntExit() - OSIntCtxSW() 2.3 Small RTOS 与uC/OS-II的异同 1.Small RTOS 和 uC/OS-II 的相同点有: (1)都是抢占式微型操作系统。 (2)调度算法都是基于优先级的调度算

16、法。 (3)两种调度方式:任务级别任务调度和中断级别任务调度。 (4)任务间可以进行消息通信。 (5)可以实现调度器上锁和解锁。 (6)具有空闲任务,并且空闲任务优先级最低。 2. Small RTOS 和 uC/OS-II 的不同点有: (1) uC/OS-II 最多可以管理 64 个任务,而 small RTOS 最多只能管理 16 个任务。 (2) uC/OS-II 可以删除任务,而 small RTOS 不能删除任务。 (3) uC/OS-II 每个任务拥有独立的堆栈,而 small RTOS 共享堆栈。 (4) uC/OS-II 有邮箱通信方式,而 small RTOS 没有。 2.

17、4 Small RTOS 移植到单片机 Small RTOS的移植步骤和方法如下: 6 (1) 在os_cpu.h中定义几个宏(以keil c51为例): #define OS_INT_ENTER() OSIntNesting+ /* 中断嵌套管理 */ #define OS_ENTER_CRITICAL() EA = 0,Os_Enter_Sum+ /* 关中断*/ #define OS_EXIT_CRITICAL() if (-Os_Enter_Sum=0) EA = 1 #define HIGH_BYTE 0 /* uint16的高位字节 */ #define LOW_BYTE 1 /*

18、 uint16的低位字节 */ #define OS_TASK_SW() OSCtxSw() /* 任务切换函数 */ OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()分别定义为关中断和开 中断在特定的c编译器的表示方法。 HIGH_BYTE、LOW_BYTE定义uint16型变量在特定的c编译器的存储方法, 如果高位字节的地址小于低位字节的地址(如keil c51) ,则 HIGH_BYTE为0,LOW_BYTE为1。否则(如8086系列) ,HIGH_BYTE为1, LOW_BYTE为0。 OS_INT_ENTER则将变量OSIntNesting加1。它仅在中断

19、服务程序中使用。 注意:如果中断嵌套层数可能超过255,OS_INT_ENTER要防止 OSIntNesting溢出。 OS_TASK_SW()定义非中断中任务切换时执行的指令,可以是一条软中断指 令(例如在8086系列CPU上) ,或仅仅是函数调用(如keil c51) 。 (2)定义与编译器无关的变量类型(以keil c51为例): typedef unsigned char uint8; /* 定义可移植的无符号8位整数关键字 */ typedef signed char int8; /* 定义可移植的有符号8位整数关键字 */ typedef unsigned int uint16;

20、/* 定义可移植的无符号16位整数关键字 */ typedef signed int int16; /* 定义可移植的有符号16位整数关键字 */ typedef unsigned long uint32; /* 定义可移植的无符号32位整数关键字 */ 7 typedef signed long int32; /* 定义可移植的有符号32位整数关键字 */ (3)在os_cpu_c.c和os_cpu_a.asm中定义几个函数: OSStart、OSIntCtxSw、OSTickISR、OSIdle和OS_TASK_SW()最终调用的 函数或中断。 OSStart:初始化任务并让ID为0的任务

21、执行。同时允许中断。 定义如下: void OSStart(void) 初始化除ID为0以外所有任务堆栈; OSTaskID = 0; 使堆栈指针指向ID为0的任务堆栈空间; OS_EXIT_CRITICAL(); 使程序指针指向ID为0的任务的程序首地址; OSIntCtxSw:中断中任务切换函数 定义如下: void OSIntCtxSw(void) 堆栈指针调整为中断程序调用OSIntExit前的状态; 堆栈空间变换; 堆栈指针指向新的堆栈; OSTaskID = OSNextTaskID; 恢复任务环境; 中断返回指令; OSIntCtxSw由OSIntExit直接调用,堆栈指针调整为

22、中断程序调用 OSIntExit前的状态即为执行若干出栈指令。 堆栈空间变换可以参照keilc51目录下Os_cpu_c.c文件中被注释的 8 C_OSCtxSw函数,C_OSCtxSw还包括 堆栈指针指向新的堆栈. OSTickISR为系统节拍中断服务程序 定义如下: void OSTickISR(void) #if TICK_TIMER_SHARING 1 static unsigned char TickSum=0; #endif 禁止中断; 保存任务环境; #if TICK_TIMER_SHARING 1 TickSum = (TickSum + 1) % TICK_TIMER_SHA

23、RING; if (TickSum != 0) 允许中断; 恢复任务环境; return; #endif #if EN_OS_INT_ENTER 0 OS_INT_ENTER(); /* 中断开始处理 #endif 允许中断; #if USER_TICK_TIMER_EN = 1 UserTickTimer(); /* 用户函数 #endif #if EN_TIMER_SHARING 0 9 OSTimeTick(); /* 调用系统时钟处理函数 #else OSIntSendSignal(TIME_ISR_TASK_ID); #endif OSIntExit(); /* 中断结束处理 其中有

24、一些CPU的禁止中断和保存任务环境由CPU自动处理或是自动处 理一部分。 OSIdle()优先级最低的任务 定义如下: void OSIdle(void) while(1) /* 使CPU处于省电状态 */ OS_TASK_SW()最终调用的函数或中断:非中断中任务切换函数 定义如下: void OS_TASK_SW(void) 保存任务环境; 堆栈空间变换; 堆栈指针指向新的堆栈; OSTaskID = OSNextTaskID; 恢复任务环境; 恢复程序指针; 2.5 Small RTOS 驱动程序 Small RTOS 的驱动包括:LED 驱动、键盘驱动、串口收发驱动。用系统的 10 多

25、任务实现。 11 3 3 详细设计详细设计 3.1LED 驱动程序 程序具有两个用户任务:一个显示任务(Show) ;另一个是计时任务 (TimeSum) 。由于显示器需要 CPU 周期为其服务,所以必须使用任务来编写程 序。 void Show(void) uint8 i,KeyTemp; /* 初始化显示缓冲区 */ ShowCase0 = ShowTable10; ShowCase1 = ShowTable10; ShowCase2 = ShowTable10; ShowCase3 = ShowTable10; while (1) for (i = 0; i = 10) TimeAdd3

26、 = 0; TimeAdd2+; if (TimeAdd2 = 6) TimeAdd2 = 0; TimeAdd1+; if (TimeAdd1 = 10) TimeAdd1 = 0; TimeAdd0+; if(TimeAdd0 = 10) TimeAdd0 = 0; ShowCase0 = ShowTableTimeAdd0; ShowCase1 = ShowTableTimeAdd1; ShowCase2 = ShowTableTimeAdd2; ShowCase3 = ShowTableTimeAdd3; 15 计时寄存器 TimeAdd0为分的十位,范围为 0-9;计时寄存器 Tim

27、eAdd1 为分的个数,范围为 0-9;计时寄存器 TimeAdd2为秒得十位,范围为 0-5; 计时寄存器 TimeAdd3为秒的个数,范围为 0-9。 开始 点亮两个发光二 极管 延时 0.5 秒 熄灭所有发光二 极管 延时 0.5 秒 计时寄存器加一 显示当前计时值 图 3.1.2:计时任务流程图 3.2 键盘驱动程序 void KeyInput(void) uint8 i; uint8 temp; OSQCreate(CommandData,16); /* 创建主任务使用的消息队列 while (1) OSWait(K_TMO,(OS_TICKS_PER_SEC / 50) + 1);

28、 /* 延时 20ms */ temp = KeyScan(); /* 获取闭合按键位图 */ 16 if (temp = NO_KEY) continue; OSWait(K_TMO,OS_TICKS_PER_SEC / 50); /* 去抖(延时 20ms)*/ if (temp != KeyScan() continue; Key(temp,KEY_DOWN); /* 处理按键闭合事件 */ /* 第一次连击延时 */ i = KEY_START / (OS_TICKS_PER_SEC / 50); do OSWait(K_TMO,OS_TICKS_PER_SEC / 50); if (

29、temp != KeyScan() goto KeyEnd; /* 按键松开 */ while (-i != 0); * 后续连击延时 */ while (1) Key(temp,KEY_ALWAYS); :/* 处理按键连击事件 */ i = KEY_DELAY / (OS_TICKS_PER_SEC / 50); do OSWait(K_TMO,OS_TICKS_PER_SEC / 50); if (temp != KeyScan() goto KeyEnd; /* 按键松开 */ while (-i != 0); KeyEnd: Key(temp,KEY_UP); /* 处理按键松开事件

30、 */ 17 开始 初始化键盘消息的 消息队列 延时 20ms 有键按下 延时 20ms 与上次按键相同 发送 KEY_DOWN 消息 等待 KEY_START 个时钟节 拍 与上次按键相同 发送 KEY_UP 消息 等待 KEY_DELAY 个时 钟节拍 发送 KEY_UP 消 息 Y N NY YN 图 3.2.1 键盘任务程序流程图 uint8 KeyScan(void) return KeyBordData; KeyScan()只需返回键盘瞬间状态,只要按照硬件的要求扫描键盘,把信息存 入返回值即可。 18 消息处理任务:消息处理任务: void command(void) uint8

31、 data temp; while (1) OSQPend( /* 等待键盘的消息 */ /* 显示得到的消息 */ ShowCase0 = ShowTable10; ShowCase1 = ShowTable10; ShowCase2 = ShowTable10; ShowCase3 = ShowTabletemp % 10; if (temp = 10) ShowCase2 = ShowTable(temp / 10) % 10; if (temp = 100) ShowCase1 = ShowTabletemp / 100; 程序分析如下: 任务挂起等待按键消息的到来,如果有按键消息到了

32、,该任务运行,并且将键 值显示在 LED 上。 3.3 串口收发驱动程序 1.串口发送部分: (1)发送一个字节:PutChar void PutChar(uint8 Data) OS_ENTER_CRITICAL(); if (SerialCanSend = 1) SerialCanSend = 0; SBUF = Data; else OSQIntPost(SerialOutData,Data); OS_EXIT_CRITICAL(); 19 程序分析: 函数中使用一个全局变量 SerialCanSend,用来指示当前串口的发送部分是否空 闲。如果串口的发送部分不空闲,就直接将数据加入消息

33、队列。用 OSQIntPos()发送消息是因为这个消息队列的唯一接受者是中断,发送消息不 会产生任务调度,OSQIntPost()不会产生不必要的任务调度。 (2)串口发送中断 #if EN_OS_INT_ENTER 0 #pragma disable #endif void comm(void) interrupt 4 uint8 data temp; if (RI = 1) #if EN_OS_INT_ENTER 0 OS_INT_ENTER(); #endif RI = 0; OSQIntPost(SerialInData,SBUF); OSIntExit(); return; if (

34、TI = 1) TI = 0; if (OSQAccept( else SerialCanSend = 1; 程序分析: 首先判断是否为发送中断;若是,则首先清除发送中断标志,然后判断消 息队列是否有消息。如果消息队列中有消息,则将数据发送出去;如果消息队 列中没有消息,则将全局变量 SerialCanSend 置 1,以表示串口空闲。程序需 20 要判断当前是否处于发送状态,若是则这样处理;否则退出,不管消息队列中 是否有消息。同时,在串口由接收状态转为发送状态时,需要将 TI 置 1,以产 生串口发送中断。 2 2 串口接收部分:串口接收部分: 串口接收处理任务: void Recuve(

35、void) uint8 data temp,temp1; uint8 Sum; /* 建立所需要的消息队列 */ OSQCreate(CommandData,16); OSQCreate(SerialInData,16); OSQCreate(SerialOutData,32); SerialInit(); /* 初始化串行口 */ while (1) OSQPend( /* 接收一个字节 */ while (1) OSQPend(/* 接收一个字节 */ if (temp = STARTBYTE1) /* 接收到起始字符 */ temp = temp1; Sum = STARTBYTE1 +

36、 STARTBYTE2; OSQPend( /* 接收数据 */ Sum += temp1; OSQPend( /* 接收校验和 */ Sum += temp; if (Sum = 0) /* 检验接收到的数据包 */ /* 发送消息给主任务 */ OSQPost(CommandData,temp1); 21 开始 初始化消息队列 初始化串口 接收一个字节 接收一个字节 接收到包头 接收两个字节 校验和为 0 给主任务发消息 N Y N Y 图 3.3.1:串口接收任务流程图 3.4 功能实现功能实现 1.LED 驱动: 有 LED 显示任务和计时任务。现象是显示系统开机后的计时时间。 2.键

37、盘驱动: 有键盘扫描输入任务。按键按下时在 LED 上显示按键值。 3.串口收发驱动 有串口接收任务。现象是可以实现串口发送和接受。 22 4.4. 设计总结设计总结 通过基于实时操作系统的单片机多任务应用程序设计,巩固了平时学习 中的理论知识,同时对嵌入式操作系统底层编程有了进一步的了解。本次课 程设计实现了在 51 单片机上移植微型嵌入式操作系统 small RTOS,并且在 操作系统上设计应用程序,应用程序包括 LED 驱动、键盘驱动、串口收发驱 动程序。这学期深入学习 C/OS-嵌入式操作系统,因此对 small RTOS 内核的理解不是很困难。对 small RTOS 内核深入理解后

38、,设计多任务应用 程序,体现操作系统的优势。通过这次课程设计让我对嵌入式操作系统又有 了更加深入的理解。 23 5 5 致谢致谢 首先感谢老师对我这次课程设计的辛勤帮助,使我对基本理论知识有了 更深刻的掌握。这学期我学习最努力的就是嵌入式操作系统,一直在努力学 懂嵌入式操作系统的基础知识,谢谢老师这学期对我的辅导,让我对嵌入式 操作系统有了更加深入的理解,我以后仍将继续学习嵌入式操作系统。感谢 在本次课程设计中帮助我的同学。感谢学校和院系给我这次课程设计的机会。 24 6 6 参考文献参考文献 1、操作系统(第 2 版) ,孟庆昌,牛欣源,电子工业出版社,2010; 2、Small RTOS 原理及应用,陈明计,周立功等,北京航空航天大学出版社, 2004;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1