操作系统课程设计实验报告(以Linux为例)_第1页
操作系统课程设计实验报告(以Linux为例)_第2页
操作系统课程设计实验报告(以Linux为例)_第3页
操作系统课程设计实验报告(以Linux为例)_第4页
操作系统课程设计实验报告(以Linux为例)_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统课程设计 实验报告 学号: 姓名: 姜栏 苏州大学计算机科学与技术学院 2014 年 9 月 目目 录录 目目 录录.1 一、实验环境一、实验环境.2 二、实验报告总体要求二、实验报告总体要求.2 实验一 编译 LINUX内核.3 实验二 观察 LINUX行为.7 实验三 进程间通信.14 一、实验环境一、实验环境 Linux 平台平台 硬件平台:普通 PC 机硬件环境。 操作系统:Linux 环境,例如,红旗 Linux 或 Red Hat Linux;启 动管理器使用 GRUB。 编译环境:伴随着操作系统的默认 gcc 环境。 工作源码环境:一个调试的内核源码,版本不低于 2.4.

2、20。 二、实验报告总体要求二、实验报告总体要求 在 2013 年年 11 月月 25 日日前提交实验报告。实验报告至少要求包含以 下内容: 1. 引言:概述本次实验所讨论的问题,工作步骤,结果,以及发现的 意义。 2. 问题提出:叙述本篇报告要解决什么问题。注意不可以抄写实验要 求中的表述,要用自己的话重新组织我们这里所提出的问题。 3. 解决方案:叙述如何解决自己上面提出的问题,可以用小标题 3.1, 3.2等分开。这是实验报告的关键部分,请尽量展开来写。注意, 这部分是最终课程设计的基本分的部分。这部分不完成,本课程设 计不会及格。 4. 实验结果:按照自己的解决方案,有哪些结果。结果有

3、异常吗?能 解释一下这些结果吗?同别人的结果比较过吗?注意,这部分是实 验报告出彩的地方。本课程设计要得高分,应该在这部分下功夫。 5. 结束语:小结并叙述本次课程设计的经验、教训、体会、难点、收 获、为解决的问题、新的疑惑等。 6. 附录:加了注释的程序清单,注释行数目至少同源程序行数目比 1:2,即 10 行源程序,至少要给出 5 行注释。 实验一实验一 编译编译 Linux 内核内核 实验时间实验时间 6 小时 实验目的实验目的 认识 Linux 内核的组成,掌握配置、编译、安装 Linux 内核的步骤。 实验目标实验目标 下载 2.6.19 或更新的 Linux 内核,配置该内核使其支

4、持 NTFS,并在新的内核 中修改其版本为 Linux NameTestKernel x.x.x,其中,Name 是你的名字(汉语拼 音);x.x.x 是新内核的版本号,最后在你的机器上编译安装这个新内核。 背景知识背景知识 参见Red Hat Enterprise Linux 4 入门与提高第 20 章。 实验步骤实验步骤 1. 验证 gcc 的可用:在你自己的工作目录下,编译链接运行 Hello World 程序。 2. 在 上下载指定的内核,或者查找更新的稳定版内核并下 载之。 3. 准备相关工具。 提示:如当前运行的Linux内核是基于2.4版

5、本的,则需要更新以下软件:module-init- tools和mkinitrd。具体更新信息可参见下载内核源代码中的Documentation/Changes这个文 件。 4. 把源代码解压缩至/usr/src 中,最终形成/usr/src/linux x.x.x/目录(x.x.x 是新内 核的版本号)。 提示:这里的注意点是路径的选择,一般要放在/usr/src/linux x.x.x/目录下面,以满足 Makefile对路径设置的初始要求。 5. 进入源代码的根目录(/usr/src/linux x.x.x),找到合适自己的内核配置方法, 并按照实验目标对其进行配置。 6.修改 /usr

6、/src/linux x.x.x/include/linux/version.h 文件中的版本信息。 注:如果没有这个文件,请执行命令:make include/linux/version.h 7. 编译内核。 8. 安装模块文件。 9. 安装内核文件。 10. 重新启动新内核。 实验结果实验结果 1. 实验步骤 1 中,编译链接运行程序你下达了哪些命令? 2. 实验步骤 2 中,你下载了哪个版本的内核文件? 3. 实验步骤 3 中,你是否安装了相关工具?如安装,则写出安装过程。 4. 实验步骤 4 中,你是用哪些命令解压缩内核文件的? 5. 实验步骤 5 中,你用了哪种内核配置的方法? 6.

7、 你对实验步骤 6 中涉及的文件做了怎样的修改? 7. 实验步骤 7-9 的过程,是否出现错误?如有,你是如何解决的? 8. 观察你机器中 GRUB 的配置文件,它在安装完新内核后发生了哪些变化? 9. 新内核启动过程是否成功?如有错误,是哪些错误?你是如何消错的? (如不够,可另附页) 实验报告实验报告 #include mqx_inc.h /将“max-inc.h”添加到源文件中 /*! * private / 声明私有变量及分配存储空间声明私有变量及分配存储空间 * * brief Creates the lightweight semaphore. /简单创建轻量级的信号 * * pa

8、ramin sem_ptr Pointer to the lightweight semaphore to create. /创建轻量级指针信号 * paramin initial_number Inital number of semaphores available. /信号量可用的初始数量 * paramin hidden TRUE if semaphore will ne hidden from kernel, FALSE if not. 如果信号量 ne 被隐藏在核心代码中则为 true,否则则为 false * paramin user User mode functionalit

9、y. /用户模式的功能 * * return MQX_OK /返回 MQX_OK * return MQX_EINVAL /返回 MOX_EINVAL * return MQX_INVALID_LWSEM /返回 MQX_INVALID_LWSEM * * see _lwsem_create * see _lwsem_create_hidden * see _usr_lwsem_create * see LWSEM_STRUCT */ _mqx_uint _lwsem_create_internal ( LWSEM_STRUCT_PTR sem_ptr, _mqx_int initial_nu

10、mber, /初始数 boolean hidden, /隐藏 boolean user /用户 ) KERNEL_DATA_STRUCT_PTR kernel_data; /内核数据结构指针的核心数据 LWSEM_STRUCT_PTR sem_chk_ptr; /lwsem struct PTR SEM 检查 PTR #if MQX_ENABLE_USER_MODE /如果启用用户模式代码 if (user /返回 MQX_INVALID_LWSEM; #endif /* MQX_ENABLE_USER_MODE */ /结束条件指令 _GET_KERNEL_DATA(kernel_data)

11、; /得到的内核数据(内核-数据) _KLOGE2(KLOG_lwsem_create, initial_number); / sem_ptr-VALUE = initial_number; _QUEUE_INIT( _int_disable(); if (!hidden) /如果没有隐藏 #if MQX_CHECK_ERRORS /* Check if lwsem is already initialized */ /检查 lwsem 是否已经初始化 #if MQX_ENABLE_USER_MODE /如果用户启用 mqx if (user) sem_chk_ptr = (LWSEM_STR

12、UCT_PTR)(pointer)kernel_data- USR_LWSEM.NEXT); while (sem_chk_ptr != (LWSEM_STRUCT_PTR)(pointer) _KLOGX2(KLOG_lwsem_create, MQX_EINVAL); return(MQX_EINVAL); sem_chk_ptr = (LWSEM_STRUCT_PTR)(pointer)sem_chk_ptr-NEXT); else #endif /* MQX_ENABLE_USER_MODE */ sem_chk_ptr = (LWSEM_STRUCT_PTR) (pointer) k

13、ernel_data- LWSEM.NEXT); while (sem_chk_ptr != (LWSEM_STRUCT_PTR) (pointer) _KLOGX2(KLOG_lwsem_create, MQX_EINVAL); return (MQX_EINVAL); sem_chk_ptr = (LWSEM_STRUCT_PTR) (pointer) sem_chk_ptr-NEXT); #endif /* MQX_CHECK_ERRORS */ #if MQX_ENABLE_USER_MODE if (user) _QUEUE_ENQUEUE( else #endif /* MQX_E

14、NABLE_USER_MODE */ _QUEUE_ENQUEUE( sem_ptr-VALID = LWSEM_VALID; _int_enable(); _KLOGX2(KLOG_lwsem_create, MQX_OK); return (MQX_OK); /*! * brief Creates the lightweight semaphore. /简单创建轻量级的信号 * * Because lightweight semaphores are a core component, an application need not to * create the component be

15、fore it creates lightweight semaphores. /因为是轻量的核心组件,所以应用程序不需要在它创建的轻量级信号量创建组件 * * paramin sem_ptr Pointer to the lightweight semaphore to create. /参数 sem_ptr 指针创建轻量级信号. * paramin initial_number Inital number of semaphores available. /参数 initial_number 初始数量的可用信号量。 * * return MQX_OK 返回 MQX_OK * return

16、MQX_EINVAL 返回 MQX_EINVAL * return MQX_INVALID_LWSEM 返回 MQX_INVALID_LWSEM * * see _lwsem_create_hidden 创建隐藏 * see _lwsem_destroy 释放函数 * see _lwsem_post 向服务器传送数据 * see _lwsem_test 测试 * see _lwsem_wait 等待 * see _lwsem_wait_for 等待 * see _lwsem_wait_ticks 等待时间中断 * see _lwsem_wait_until 等待结束后继续执行 * see LW

17、SEM_STRUCT */ _mqx_uint _lwsem_create ( LWSEM_STRUCT_PTR sem_ptr, _mqx_int initial_number ) #if MQX_ENABLE_USER_MODE #endif return _lwsem_create_internal(sem_ptr, initial_number, FALSE, FALSE); /*! * brief Creates the lightweight semaphore hidden from kernel. /简单创建轻量级信号量隐藏在核心数据中 * * paramin sem_ptr

18、Pointer to the lightweight semaphore to create. /参数 sem_ptr 指针创建轻量级信号 * paramin initial_number Inital number of semaphores available. /参数 initial_number 初始数量的可用信号量。 * * return MQX_OK 返回 MQX_OK * return MQX_EINVAL 返回 MQX_EINVAL * return MQX_INVALID_LWSEM 返回 MQX_INVALID_LWSEM * * see _lwsem_create 创建

19、* see _lwsem_destroy 释放函数 * see _lwsem_post 向服务器传送数据 * see _lwsem_test 测试 * see _lwsem_wait 等待 * see _lwsem_wait_for 等待 * see _lwsem_wait_ticks 等待时间中断 * see _lwsem_wait_until 等待结束后继续执行 * see LWSEM_STRUCT */ _mqx_uint _lwsem_create_hidden ( LWSEM_STRUCT_PTR sem_ptr, _mqx_int initial_number ) return _

20、lwsem_create_internal(sem_ptr, initial_number, TRUE, FALSE); #if MQX_ENABLE_USER_MODE /*! * brief Creates the lightweight semaphore hidden form kernel. /简单创建轻量级信号量隐藏在核心数据中 * * This function is an equivalent to the _lwsem_create() API call but it can be * executed from within the User task or other c

21、ode running in the CPU User mode. /这个函数是一个相当于_lwsem_create() API 调用,但是它可执行从用户任务或其他代码在 CPU 用户模式运行。 * Parameters passed to this function by pointer are required to meet the memory * protection requirements as described in the parameter list below. /如下面的参数列表描述。需要满足内存的指针传递给这个函数的参数保护的要求。 * * paramin sem_

22、ptr Read only. Pointer to the lightweight semaphore to create. /参数中 sem_ptr 只读。由指针的轻量级的信号来创建。 * paramin initial_number Inital number of semaphores available. /参数中 initial_number 初始数量的可用信号量。 * * return MQX_OK 返回 MQX_OK * return MQX_EINVAL 返回 MQX_EINVAL * return MQX_INVALID_LWSEM 返回 MQX_INVALID_LWSEM

23、* * see _lwsem_create 创建 * see _lwsem_destroy 释放函数 * see _lwsem_post 向服务器传送数据 * see _lwsem_test 测试 * see _lwsem_wait 等待 * see _lwsem_wait_for 等待 * see _lwsem_wait_ticks 等待时间中断 * see _lwsem_wait_until 等待结束后继续执行 * see LWSEM_STRUCT */ _mqx_uint _usr_lwsem_create ( LWSEM_STRUCT_PTR sem_ptr, _mqx_int ini

24、tial_number ) MQX_API_CALL_PARAMS params = (uint_32)sem_ptr, (uint_32)initial_number, (uint_32)FALSE, 0, 0; return _mqx_api_call(MQX_API_LWSEM_CREATE, #endif /* MQX_ENABLE_USER_MODE */ /*! * private /声明私有变量及分配存储空间 * * brief Destroys the lightweight semaphore. /简单的释放轻量级信号量 * * paramin sem_ptr Pointer

25、 to the created lightweight semaphore. /参数中 sem_ptr 指针创建的轻量级的信号量的 * paramin user User mode functionality. /在用户参数的用户模式功能。 * * return MQX_OK /返回 MQX_OK * return MQX_INVALID_LWSEM (Lwsem_ptr does not point to a valid lightweight semaphore.) /返回 MQX_INVALID_LWSEM(lwsem_ptr 没有指向有效的轻量级 的信号。) * * see _lwse

26、m_destroy 释放函数 * see LWSEM_STRUCT */ _mqx_uint _lwsem_destroy_internal ( LWSEM_STRUCT_PTR sem_ptr, boolean user ) /* Body */ KERNEL_DATA_STRUCT_PTR kernel_data; TD_STRUCT_PTR td_ptr; LWSEM_STRUCT_PTR sem_chk_ptr; _GET_KERNEL_DATA(kernel_data); _KLOGE2(KLOG_lwsem_destroy, sem_ptr); _int_disable(); #i

27、f MQX_CHECK_VALIDITY if (sem_ptr-VALID != LWSEM_VALID) _int_enable(); _KLOGX2(KLOG_lwsem_destroy, MQX_INVALID_LWSEM); return (MQX_INVALID_LWSEM); /* Endif */ #endif sem_ptr-VALID = 0; /* Invalidate the semaphore */ while (_QUEUE_GET_SIZE( _BACKUP_POINTER(td_ptr, TD_STRUCT, AUX_QUEUE); _TIME_DEQUEUE(

28、td_ptr, kernel_data); _TASK_READY(td_ptr, kernel_data); /* Endwhile */ /* Check if lwsem is in kernels semaphore list */ /检查 lwsem 是否是内核的信号量表 #if MQX_ENABLE_USER_MODE if (user) sem_chk_ptr = (LWSEM_STRUCT_PTR)(pointer)kernel_data- USR_LWSEM.NEXT); while (sem_chk_ptr != (LWSEM_STRUCT_PTR)(pointer) br

29、eak; sem_chk_ptr = (LWSEM_STRUCT_PTR)(pointer)sem_chk_ptr-NEXT); else #endif /* MQX_ENABLE_USER_MODE */ sem_chk_ptr = (LWSEM_STRUCT_PTR) (pointer) kernel_data-LWSEM.NEXT); while (sem_chk_ptr != (LWSEM_STRUCT_PTR) (pointer) break; /* Endif */ /结束 if 语句 sem_chk_ptr = (LWSEM_STRUCT_PTR) (pointer) sem_c

30、hk_ptr-NEXT); /* Endwhile */ /结束 while 语句 _int_enable(); _CHECK_RUN_SCHEDULER(); /* Allow higher priority tasks to run */ /让高优先级的任务运行 _KLOGX2(KLOG_lwsem_destroy, MQX_OK); return (MQX_OK); /* Endbody */ /*! * brief Destroys the lightweight semaphore. /简单的释放轻量级信号量 * * paramin sem_ptr Pointer to the cr

31、eated lightweight semaphore. /参数中 sem_ptr 指针创建的轻量级的信号量的 * * return MQX_OK /返回 MQX_OK * return MQX_INVALID_LWSEM (Lwsem_ptr does not point to a valid lightweight semaphore.) /返回 MQX_INVALID_LWSEM(lwsem_ptr 没有指向有效的轻量 级的信号。) * * warning Puts all waiting tasks in their ready queues. /对所有 等待任务的就绪队列提出警告 *

32、 warning Cannot be called from an ISR. /警告不能被称为 ISR * * see _lwsem_create 创建 * see _lwsem_create_hidden 创建隐藏 * see LWSEM_STRUCT */ _mqx_uint _lwsem_destroy ( LWSEM_STRUCT_PTR sem_ptr ) #if MQX_ENABLE_USER_MODE #endif return _lwsem_destroy_internal(sem_ptr, FALSE); #if MQX_ENABLE_USER_MODE /*! * brie

33、f Destroys the lightweight semaphore. /简单的释放轻量级信号量 * * This function is an equivalent to the _lwsem_destroy() API call but it can be * executed from within the User task or other code running in the CPU User mode. /这个函数是一个相当于_lwsem_create() API 调用,但是它可执行从用户任务或其他代码在 CPU 用户模式运行。 * Parameters passed to

34、 this function by pointer are required to meet the memory * protection requirements as described in the parameter list below. /如下面的参数列表描述。需要满足内存的指针传递给这个函数的参数保护的要求 * * paramin sem_ptr Read only. Pointer to the created lightweight semaphore. /参数中 sem_ptr 只读。由指针的轻量级的信号来创建。 * * return MQX_OK /返回 MQX_OK

35、* return MQX_INVALID_LWSEM (Lwsem_ptr does not point to a valid lightweight semaphore.) /返回 MQX_INVALID_LWSEM(lwsem_ptr 没有指向有效 的轻量级的信号。) * * warning Puts all waiting tasks in their ready queues. /对所有等待任务的就绪 队列提出警告 * warning Cannot be called from an ISR. /警告不能被称为 ISR * * see _lwsem_destroy 释放函数 * see

36、 _usr_lwsem_create 创建 * see LWSEM_STRUCT */ _mqx_uint _usr_lwsem_destroy ( LWSEM_STRUCT_PTR sem_ptr ) MQX_API_CALL_PARAMS params = (uint_32)sem_ptr, 0, 0, 0, 0; return _mqx_api_call(MQX_API_LWSEM_DESTROY, #endif /* MQX_ENABLE_USER_MODE */ 结束 if 循环 /*! * brief Poll for the lightweight semaphore. * *

37、This function is the nonblocking alternative to the _lwsem_wait family of functions. * * paramin sem_ptr Pointer to the created lightweight semaphore. * * return TRUE (Task got the lightweight semaphore.) * return FALSE (Lightweight semaphore was not available.) * * see _lwsem_create * see _lwsem_cr

38、eate_hidden * see _lwsem_wait * see _lwsem_wait_for * see _lwsem_wait_ticks * see _lwsem_wait_until * see LWSEM_STRUCT */ boolean _lwsem_poll ( LWSEM_STRUCT_PTR sem_ptr ) /* Body */ KERNEL_DATA_STRUCT_PTR kernel_data; boolean result; #if MQX_ENABLE_USER_MODE #endif _GET_KERNEL_DATA(kernel_data); _KL

39、OGE2(KLOG_lwsem_poll, sem_ptr); #if MQX_CHECK_VALIDITY if (sem_ptr-VALID != LWSEM_VALID) _KLOGX2(KLOG_lwsem_poll, FALSE); return (FALSE); /* Endif */ #endif /* MQX_CHECK_VALIDITY */ _INT_DISABLE(); if (sem_ptr-VALUE VALUE; result = TRUE; /* Endif */ _INT_ENABLE(); _KLOGX2(KLOG_lwsem_poll, result); r

40、eturn (result); #if MQX_ENABLE_USER_MODE /*! * brief Poll for the lightweight semaphore. * * This function is an equivalent to the _lwsem_poll() API call but it can be * executed from within the User task or other code running in the CPU User mode. * Parameters passed to this function by pointer are

41、 required to meet the memory * protection requirements as described in the parameter list below. * * paramin sem_ptr Read only. Pointer to the created lightweight semaphore. * * return TRUE (Task got the lightweight semaphore.) * return FALSE (Lightweight semaphore was not available.) * * see _lwsem

42、_poll * see _usr_lwsem_create * see _usr_lwsem_wait * see _usr_lwsem_wait_for * see _usr_lwsem_wait_ticks * see _usr_lwsem_wait_until * see LWSEM_STRUCT */ boolean _usr_lwsem_poll ( LWSEM_STRUCT_PTR sem_ptr ) MQX_API_CALL_PARAMS params = (uint_32)sem_ptr, 0, 0, 0, 0; return _mqx_api_call(MQX_API_LWS

43、EM_POLL, #endif /* MQX_ENABLE_USER_MODE */ /*! * brief Posts the lightweight semaphore. * * If tasks are waiting for the lightweight semaphore, MQX removes the first one * from the queue and puts it in the tasks ready queue. * * paramin sem_ptr Pointer to the created lightweight semaphore. * * retur

44、n MQX_OK * return MQX_INVALID_LWSEM (Lwsem_ptr does not point to a valid lightweight semaphore.) * * warning Might put a waiting task in the tasks ready queue. * * see _lwsem_create * see _lwsem_wait * see _lwsem_wait_for * see _lwsem_wait_ticks * see _lwsem_wait_until * see LWSEM_STRUCT */ _mqx_uin

45、t _lwsem_post ( LWSEM_STRUCT_PTR sem_ptr ) /* Body */ KERNEL_DATA_STRUCT_PTR kernel_data; TD_STRUCT_PTR td_ptr; #if MQX_ENABLE_USER_MODE #endif _GET_KERNEL_DATA(kernel_data); _KLOGE2(KLOG_lwsem_post, sem_ptr); #if MQX_CHECK_VALIDITY if (sem_ptr-VALID != LWSEM_VALID) _KLOGX2(KLOG_lwsem_post, MQX_INVA

46、LID_LWSEM); return (MQX_INVALID_LWSEM); /* Endif */ #endif /* MQX_CHECK_VALIDITY */ _INT_DISABLE(); if (sem_ptr-VALUE = 0) _BACKUP_POINTER(td_ptr, TD_STRUCT, AUX_QUEUE); _TIME_DEQUEUE(td_ptr, kernel_data); td_ptr-INFO = 0; /* Signal that post is activating the task */ _TASK_READY(td_ptr, kernel_data

47、); _CHECK_RUN_SCHEDULER(); /* Let higher priority task run */ else +sem_ptr-VALUE; /* Endif */ _INT_ENABLE(); _KLOGX2(KLOG_lwsem_post, MQX_OK); return (MQX_OK); #if MQX_ENABLE_USER_MODE /*! * brief Posts the lightweight semaphore. * * This function is an equivalent to the _lwsem_post() API call but

48、it can be * executed from within the User task or other code running in the CPU User mode. * Parameters passed to this function by pointer are required to meet the memory * protection requirements as described in the parameter list below. * * paramin sem_ptr Read only. Pointer to the created lightwe

49、ight semaphore. * * return MQX_OK * return MQX_INVALID_LWSEM (Lwsem_ptr does not point to a valid lightweight semaphore.) * * warning Might put a waiting task in the tasks ready queue. * * see _lwsem_post * see _usr_lwsem_create * see _usr_lwsem_wait * see _usr_lwsem_wait_for * see _usr_lwsem_wait_t

50、icks * see _usr_lwsem_wait_until * see LWSEM_STRUCT */ _mqx_uint _usr_lwsem_post ( LWSEM_STRUCT_PTR sem_ptr ) MQX_API_CALL_PARAMS params = (uint_32)sem_ptr, 0, 0, 0, 0; return _mqx_api_call(MQX_API_LWSEM_POST, #endif /* MQX_ENABLE_USER_MODE */ /*! * brief Tests the data structures (including queues)

51、 of the lightweight semaphores * component for consistency and validity. * * paramout lwsem_error_ptr Pointer to the lightweight semaphore in error (NULL * if no error is found) * paramout td_error_ptr Pointer to the task descriptor of waiting task that * has an error (NULL if no error is found). *

52、* return MQX_OK * return MQX_INVALID_LWSEM (Results of _queue_test().) * return MQX_CANNOT_CALL_FUNCTION_FROM_ISR (Function cannot be called from an ISR.) * * warning Cannot be called from an ISR. * Disables and enables interrupts. * * see _lwsem_create * see _lwsem_destroy * see _queue_test */ _mqx

53、_uint _lwsem_test ( pointer _PTR_ lwsem_error_ptr, pointer _PTR_ td_error_ptr ) /* Body */ KERNEL_DATA_STRUCT_PTR kernel_data; LWSEM_STRUCT_PTR sem_ptr; _mqx_uint queue_size; _mqx_uint result; _GET_KERNEL_DATA(kernel_data); _KLOGE3(KLOG_lwsem_test, lwsem_error_ptr, td_error_ptr); *td_error_ptr = NULL; *lwsem_error_ptr = NULL; #if MQX_CHECK_ERRORS if (kernel_data-IN_ISR) _KLOGX2(KLOG_lwsem_test, MQX_CANNOT_CALL_FUNCTION_FROM_ISR); return (MQX_CANNOT_CALL_FUNCTION_FROM_ISR); /* Endif */

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论