<4D F736F F D20B5DA36D5C F532DA2F2B2D9D7F7CFB5CDB3BBF9B4A1BCB0C6E4D2C6D6B2BFAAB7A2B3F5B2BD2E646F6378>

Size: px
Start display at page:

Download "<4D F736F F D20B5DA36D5C F532DA2F2B2D9D7F7CFB5CDB3BBF9B4A1BCB0C6E4D2C6D6B2BFAAB7A2B3F5B2BD2E646F6378>"

Transcription

1 CORTEX-M3+UCOS-II 嵌入式系统开发入门与应用 作者 : 华清远见 第 6 章 C/OS-Ⅱ 操作系统基础及其移植开发初步 本章目标 C/OS-Ⅱ 内核作为一种代码公开的嵌入式实时操作系统的内核非常有特色, 在 规模不大的代码内实现了抢占式任务调度和多任务间通信等功能, 任务调度算法也 很有特点 该内核裁剪到最小状态后编译出来只有 8KB 左右, 全部内核功能 ( 添加 LWIP 网络协议栈等 ) 也就 100KB 左右, 资源消耗非常小 市面上一些 ARM 微处 理器片上所带的内存就足够一个裁剪合适的内核的简单应用, 非常方便产品的开发 设计

2 专业始于专注卓识源于远见当前, C/OS-Ⅱ 是一个基本完整的嵌入式操作系统解决方案套件, 包括 C/TCP-IP(IP 网络协议栈 ) C/FS ( 文件系统 ) C/GUI( 图形界面 ) C/USB(USB 驱动 ) 和 C/FL(Flash 加载器 ) 等部件, 但是这些部件是不公开代码的 还有一些在嵌入式环境中发挥重要作用的部件包括嵌入式数据库 POSIX 兼容性接口 常用设备的驱动模块等, 将来还会产生更多的重要部件需求 在互联网上的开源社区通常能够找到相应的开源代码包, 并且可以进行移植 6.1 实时操作系统基本原理与技术 本节将主要讲述实时操作系统的基本原理和技术 通过对本章的学习, 读者可以了解 RTOS(Real Time operation System, 实时操作系统 ) 的基本特征 结构体系 重要指标 性能参数等重要理论, 为全面掌握 RTOS 打下基础 实时操作系统基本特征 实时操作系统与其相对的是分时操作系统,UNIX 就是典型的分时操作系统 当分时操作系统允许对中断处理的优先级做调整, 使系统对外部事件的响应速度保证不大于某一特定时间间隔时, 就构成了实时操作系统 根据 IEEE 对实时操作系统的定义, 实时操作系统的基本特征应表现为以下几个方面 实时性 : 响应外部事件的时间必须在限定的时间范围内, 在某些情况下还需要是确定的 可重复实现的, 不管当时系统内部状态如何, 都必须是可预测的 抢占式调度 : 为确保响应时间, 实时操作系统必须允许高优先级的任务一旦进入就绪状态, 就可以马上抢占正在运行的低优先级任务的执行权 具有异步响应能力 : 异步事件是指无一定时序关系 随机发生的事件 如实时控制设备出现异常等突发事件, 都属于随机事件 实际环境中, 嵌入式实时系统需要处理多个外部事件, 这些事件往往同时出现, 而且发生的时刻也是随机的 实时操作系统应有能力对这类同时发生的外部事件进行有效的处理 内存锁定 : 必须具有将程序部分代码锁定在内存的能力 将频繁访问的数据锁定在内存, 减少了为获得该数据而访问磁盘的时间, 从而保证了快速的响应时间 具有优先级调度机制 : 实时操作系统必须允许用户定义中断和任务的优先级, 并具有相应的优先级调度机制 同步 / 互斥机制 : 提供对共享数据的同步和互斥手段 实时操作系统能对外部事件和信号在限定的时间范围内作出响应, 它所强调的是实时性 可靠性和灵活性 实时操作系统一般与实时应用软件相结合成为有机整体 : 用实时操作系统来管理和调度实时应用软件的各项任务, 为应用软件提供良好的运行和开发环境 一般来说, 实时操作系统以库的形式提供系统调用来实现对上层实时应用程序的支持 ; 而应用程序通过链接实时操作系统的库来实现实时任务调度 实时操作系统的关键技术指标 一般来说, 评价一个实时操作系统的优劣可以用以下几个技术指标来衡量 任务调度算法 : 一个实时操作系统的任务调度算法, 在很大程度上决定了其系统实时性和其多任务调度能力 常用的任务调度算法有优先级调度策略和时间片轮转调度策略 ; 调度的方式可分为可抢占式 不可抢占式和选择可抢占式等 ; 常用的调度算法有 Rate Monotonic( 发生率单调 ) 优先级与发生率成正比 (LiuLay 1973) Lottery Scheduler( 彩票调度,Wald&Weih194) 等 上下文切换时间 (Context Switching Time): 指当处理器的控制权由运行任务转移到另一个就绪任务时所耗费的系统时间 RTOS 的上下文切换时间可以由以下公式算出 : 上下文切换时间 = 系统保持当前任务 2

3 专业始于专注卓识源于远见的状态所需时间 + 从就绪任务表中查找最高优先级任务的时间 + 将优先级最高的就绪任务转到运行态所需要的时间 保护和恢复上下文的方法很大程度上依赖于处理器的架构, 所以衡量一个实时操作系统是否适合在某种体系结构的处理器上运行, 上下文切换时间是一个重要的衡量指标 系统确定性 (Determinism): 在实时操作系统中, 在一定的条件下, 系统调用运行的时间是可以预测的, 但这并不意味着无论系统的负载如何, 所有的系统调用都总是执行一个固定长度的时间, 而是指系统调用的最大执行时间可以确定 最小内存开销 : 在某些领域, 如工业控制领域, 基于降低成本的考虑, 其内存的配置一般都不大 因此在实时操作系统的设计中, 其占用内存大小是一个很重要的衡量指标 同时, 这也是 RTOS 设计与其他操作系统设计的明显区别之一 最大中断禁止时间 : 当操作系统在执行某些系统调用时, 是需要关闭中断响应的, 即中断被屏蔽, 只有当操作系统重新回到用户态时才重新响应外部中断请求, 这一过程所需的最大时间就是最大中断禁止时间 由此可以看出操作系统的最大中断禁止时间越长, 系统丢中断的可能性越大, 所以最大中断禁止时间成为衡量一个操作系统实时性的重要指标 上述几项中, 上下文切换时间和最大中断禁止时间是评价一个实时操作系统实时性最重要的两个技术指标 实时操作系统基本术语 本节将主要介绍在实时操作系统领域中常用的专业术语, 以便读者更好地掌握本书后面的内容 硬实时 (Hard Real-Time): 通常将具有优先级驱动的 时间确定性的 可抢占调度的系统称为硬实时系统 所谓 硬实时, 主要强调对实时性和确定性的要求较高 优先级驱动 (Priority-Driven): 在一个多任务系统中, 正在运行的任务总是优先级最高的任务 在任何给定的时间内, 总是把处理器分配给优先级最高的任务 优先级反转 (Priority Inversion): 当一个任务等待比它优先级低的任务释放资源而被阻塞时, 这种现象被称为优先级反转 优先级继承技术可以解决优先级反转问题 目前市场上大多数商用操作系统都使用了优先级继承技术 优先级继承 (Priority-Inheritance): 优先级继承是用来解决优先级反转问题的技术 当优先级反转发生时, 较低优先级任务的优先级暂时提高, 以匹配较高优先级任务的优先级 这样, 就可以使较低优先级任务尽快地执行并且释放较高优先级任务所需要的资源 实时执行体 (Realtime Executive): 实时执行程序包括一套支持实时系统所必需的机制, 如多任务 CPU 调度 通信和存储分配等 在嵌入式应用中, 这一套机制被称为实时操作系统或实时执行体或实时内核 重调度过程 (Rescheduling Procedure): 重调度过程是判断任务优先级和执行状态的过程 任务 (Task): 实时操作系统中的任务相当于一般操作系统的进程 (Process), 一个任务就是操作系统的一个可以运行的历程 任务上下文 (Task context): 任务上下文指一个未运行的任务状态, 如堆栈指针 计数器 内存字段和通用寄存器等 调度延时 (Scheduling Latency): 调度延时是指当一个事件从引起更高优先级的任务就绪到这个任务开始运行之间的时间 简而言之, 就是一个任务被触发后, 由就绪到开始运行的时间 可伸缩的体系结构 (Scalable Architecture): 可伸缩的体系结构指一个软系统能够支持多种应用而无需在接口上做很大的变动 这种结构往往提供可选用的系统组件, 供开发者 量体裁衣 中断延时 (Interrupt Latency): 中断延时指从中断发生到开始执行中断处理程序的这一段时间 互斥 (Mutual Exclusion): 互斥是用于控制多任务对共享数据进行顺序访问的同步机制 在多任务应用中, 当两个或更多的任务同时访问同一数据区时, 就会造成访问冲突 互斥能使它们依次访问共享数据而不引起冲突 抢占 (Preemptive): 抢占是指当系统处于核心态的内核运行时, 允许任务重新调度 也就是说, 一个正在执行的任务可以被打断而让另一个任务运行, 这提高了应用对外部中断的响应性 许多实时操作系统都是以抢占方式运行 但这并不是说调度在任何时候都是可以发生的 例如, 当实时操作系统的一个任务 3

4 专业始于专注卓识源于远见 正在通过系统调用访问共享数据时, 重新调度和中断都是不允许的 6.2 C/OS-Ⅱ 应用程序开发 C/OS-Ⅱ 是一个专门为嵌入式设备设计的硬实时操作系统内核, 它自 1992 年发布以来, 在世界各地获得了广泛的应用 鉴于 C/OS-Ⅱ 可免费获得代码, 对于嵌入式开发而言, C/OS-Ⅱ 无疑是最经济的选择 应用 C/OS- Ⅱ 目的是要在其之上开发应用程序 下面简单介绍基于 C/OS-Ⅱ 应用程序的基本结构以及与应用程序开发相关的知识, 本书后续章节会对应用程序开发做更详细的讲解 C/OS-Ⅱ 的变量类型 由于 C 语言变量类型的长度与编译器类型相关, 为了便于在各个平台间移植, 在 C/OS-Ⅱ 中没有使用标准 C 语言的数据类型, 而是定义了自己的数据类型 具体的变量类型如表 6.1 所示 这些变量的定义, 可参见 C/OS-Ⅱ 源码的 OS_CPU.H 文件 这种方式的类型定义, 很大程度上方便了系统在不同编译器间的移植 表 6.1 C/OS-Ⅱ 使用的变量类型 类型符合类型宽度 BOOLEAN 布尔型 8 INT8U 8 位无符号整形 8 续表 类型符合 类 型 宽 度 INT8S 8 位有符号整形 8 INT16U 16 位无符号整形 16 INT16S 16 位有符号整形 16 INT32U 32 位无符号整形 32 INT32S 32 位有符号整形 32 FP32 单精度浮点数 32 FP64 双精度浮点数 应用程序的基本结构 每个 C/OS-Ⅱ 应用至少要求有一个任务 每个任务必须被写成无限循环的形式 下面代码是 C/OS-Ⅱ 推荐的结构 : Void task(void * pdata) { INT8U err; InitTimer(); While(1) { // 应用程序代码 OSTimeDly(1) ; // 可选 } } 4

5 专业始于专注卓识源于远见系统运行时, C/OS-Ⅱ 会为每一个任务保留一个堆栈空间 系统在任务切换时要恢复上下文并执行一条返回指令, 如果允许任务执行完并返回, 那么很可能会破坏系统的堆栈空间, 从而给应用程序的执行带来不确定性 换句话说, 程序 跑飞 了 所以, 每一个任务必须被写成无限循环的形式 但任务的无限循环, 并不意味着任务永远占有 CPU 的使用权, 任务可以通过 ISR 或调用操作系统 API( 如任务挂起 API), 使任务放弃对 CPU 的使用权 在上面的任务结构示例代码中, 值得一提的是 InitTimer() 函数 这个函数应由系统提供, 开发者需要在优先级最高的任务内调用它, 且不能在 for 循环内调用, 而且该函数和所使用的 CPU 相关, 每种系统都有自己的 Timer 初始化程序 在 C/OS-Ⅱ 的帮助手册中, 作者强调绝不能在 OSInit() 或 OSStart() 内调用 Timer 初始化函数 InitTimer(), 那样会破坏系统的可移植性, 同时也会带来性能上的损失 所以, 一个折中的办法就是如上所述, 在优先级最高的任务内调用, 这样可保证当 OSStart() 调用系统内部函数 OSStartHighRdy() 开始多任务后, 首先执行的是 Timer 初始化程序 ; 或专门执行一个优先级最高的任务, 只做一件事情, 那就是执行 Timer 初始化, 之后通过调用 OSTaskSuppend() 将自己挂起, 永远不再执行, 不过这样会浪费一个 TCB 空间 对于那些 RAM 内存空间有限的系统来说, 应该尽量不用 C/OS-Ⅱ 是多任务内核, 函数可能会被多个任务调用, 因此还需考虑函数的可重入性 由于每个任务有各自的堆栈, 而任务的局部变量是放在当前的任务堆栈中的, 所以要保证函数代码的可重入性, 只要不使用全局变量即可 利用 C/OS-Ⅱ 的消息队列可实现消息驱动程序 在编写任务代码时, 先完成任务初始化, 然后在消息循环过程中在某个消息上等待, 当其他任务或者中断服务程序返回消息后, 根据消息的内容调用相应的函数模块, 函数调用后, 重新回到消息循环, 继续等待消息 C/OS-Ⅱ API 介绍 任何一个操作系统都会提供大量的 API 供开发者使用, C/OS-Ⅱ 亦如此 由于 C/OS-Ⅱ 面向的是实时嵌入式系统开发, 并不要求大而全, 所以内核提供的 API 也就大多与多任务相关 下面介绍几个比较重要的 API 函数 1.OSTaskCreate() 函数 该函数应至少在 main() 函数内调用一次, 在 OSInit() 函数调用之后调用, 它的作用就是创建一个任务 该函数有 4 个参数, 分别是任务的入口函数 任务的参数 任务堆栈的首地址和任务的优先级 调用该函数, 系统会首先从 TCB 空闲队列内申请一个空的 TCB 指针 ; 然后根据用户给出的参数初始化任务堆栈, 并在内部的任务就绪表内标记该任务为就绪状态 ; 最后返回 这样一个任务就创建成功了 2.OSTaskSuspend() 函数 该函数可将指定的任务挂起 如果挂起的是当前任务, 那么还会引发系统执行任务切换先导函数 OSShed() 来进行一次任务切换 这个函数只是一个指定任务优先级的参数 事实上在系统内部, 优先级除了表示一个任务执行的先后次序外, 还起着区分每一个任务的作用 换句话说, 优先级也就是任务的 ID, 所以 C/OS- Ⅱ 不允许出现相同优先级的任务 3.OSTaskResume() 函数 5

6 专业始于专注卓识源于远见该函数和 OSTaskSuspend() 函数正好相反, 它用于将指定的已经挂起的函数恢复为就绪状态 如果恢复任务的优先级高于当前任务, 那么还将引发一次任务切换 其参数类似于 OSTaskSuspend() 函数, 用来指定任务的优先级 需要特别说明的是, 该函数并不要求和 OSTaskSuspend() 函数成对出现 4.OS_ENTER_CRITICAL() 宏 由 OS_CPU.H 文件可知,OS_ENTER_CRITICAL() 和下面要谈到的 OS_EXIT_CRITICAL() 都是宏, 它们都与特定的 CPU 相关, 一般都被替换为一条或者几条嵌入式汇编代码 由于系统希望向上层开发者隐藏内部实现, 故一般都宣称执行此条指令后系统进入临界区 其实, 该指令只是进行了关中断操作而已 这样, 只要任务不主动放弃 CPU 使用权, 别的任务就没有占用 CPU 的机会了, 相对这个任务而言, 它就是独占了, 所以说进入临界区了 这个宏应尽量少用, 因为它会破坏系统的一些服务, 尤其是时间服务, 并使系统对外界响应的性能降低 5.OS_EXIT_CRITICAL() 宏 该宏与上面 OS_ENTER_CRITICAL() 宏配套使用, 在退出临界区时使用 其实它就是重新开中断 需要注意的是, 它必须和 OS_ENTER_CRITICAL() 宏成对出现, 否则会带来意想不到的后果, 最坏情况下, 系统会崩溃 6.OSTimeDly() 函数 该函数实现的功能是先挂起当前任务, 然后进行任务切换, 在指定的时间到了之后, 将当前任务恢复为就绪状态, 但并不一定运行 ; 如果恢复后是优先级最高的就绪任务, 那么运行之 简而言之, 就是可使任务延时一定时间后再次执行它 ; 或者说, 暂时放弃 CPU 的使用权 一个任务可以不显示地调用这些可导致放弃 CPU 使用权的 API, 但那样多任务性能会大大降低, 因为此时仅仅依靠时钟机制在进行任务切换 一个好的任务应在完成一些操作后主动放弃 CPU 的使用权 C/OS-Ⅱ 多任务实现机制 C/OS-Ⅱ 是一种基于优先级的可剥夺型多任务内核, 了解它的多任务机制原理, 有助于写出更加强壮的代码 其实在单 CPU 情况下, 是不存在真正多任务机制的, 存在的只是不同的任务轮流使用 CPU, 所以本质上还是单任务 但由于 CPU 执行速度非常快, 加上任务切换十分频繁, 所以感觉好像有很多任务同时在运行, 这就是所谓的多任务机制 由上述内容不难发现, 要实现多任务机制, 目标 CPU 必须具有一种在运行期间更改 PC 的途径, 否则无法做到切换 遗憾的是, 目前还没有哪个 CPU 支持直接设置 PC 指针的汇编指令 但一般 CPU 都允许通过类似 JMP 和 CALL 这样的指令来间接修改 PC, 主要是软中断 但在一些 CPU 上, 并不存在软中断这个概念, 所以在那些 CPU 上, 需要使用 PUSH 指令加上一条 CALL 指令来模拟一次软中断发生 C/OS-Ⅱ 中, 每个任务都有一个任务控制块, 这是一个复杂的数据结构 在任务控制块偏移为 0 的地方, 存储着一个指针, 记录了所属任务的专用堆栈地址 事实上, 在 C/OS-Ⅱ 中, 每个任务都有自己的专用堆栈, 彼此之间不能侵犯, 这点要求开发者在他们的程序中保证 一般的做法是, 把它们声明成静态数组而且声明成 OS_STK 类型 当任务有了自己的堆栈时, 就可将每一个任务堆栈记录到前面提到的任务控制块偏移为 0 的地方, 以后每当发生任务切换时, 系统必然会先进入一个中断, 这一般是通过软中断或者时钟中断实现的 然后会把当前任务的堆栈地址保存起来, 接着恢复要切换的任务的堆栈地址 由于那个任务 6

7 专业始于专注卓识源于远见的堆栈里也一定存的是地址 ( 每当发生任务切换时, 系统必然会进入一个中断, 而一旦中断,CPU 就会把地址压入栈中 ), 这样就达到了修改 PC 为下一个任务的地址的目的 开发者可利用 C/OS-Ⅱ 的多任务实现机制, 写出更健壮 更有效率的代码来 6.3 C/OS-Ⅱ 在 STM32F103 处理器上的移植 移植条件 移植 C/OS-Ⅱ 到处理器上必须满足以下条件 (1) 处理器的 C 编译器能产生可重入代码 C/OS-Ⅱ 是多任务内核, 函数可能会被多个任务调用, 代码的重入性是保证完成多任务的基础 可重入代码指的是可被多个任务同时调用, 而不会破坏数据的一段代码, 或者说代码具有在执行过程中打断后再次被调用的能力 下面列举了两个函数例子, 它们的区别在于变量 temp 保存的位置不同 swap1 函数中 temp 作为全局变量存在,swap2 函数中 temp 作为函数的局部变量存在, 因此 swap1 函数是不可重入的, 而 swap2 函数是可重入的 swap1 函数代码如下 : int temp; void swap1(int * x, int * y) { temp = *x; *x= *y; *y= temp; } swap2 函数代码如下 : void swap(int * x, int * y) { int temp; temp= *x; *x=*y; *y= *temp; } 此外, 除了在 C 程序中使用局部变量外, 还需要 C 编译器的支持 使用 MDK RealView 开发集成环境, 可生成可重入的代码 (2) 用 C 语言可打开和关闭中断 ARM 处理器核包含一个 CPSR 寄存器, 该寄存器包括一个全局的中断禁止位, 控制它便可打开和关闭中断 (3) 处理器支持中断并且能产生定时中断 C/OS-Ⅱ 通过处理器产生的定时器中断来实现多任务之间的调度 ARM7TDMI 的处理器都支持中断并能产生定时器中断 (4) 处理器支持能够容纳一定量数据的硬件堆栈 对于一些只有 10 根地址线的 8 位控制器, 芯片最多可访问 1KB 存储单元, 在这样的条件下, 移植是比较困难的 (5) 处理器有将堆栈指针和其他 CPU 寄存器读出和存储到堆栈 ( 或内存 ) 的指令 C/OS-Ⅱ 进行任务调度时, 会把当前任务的 CPU 寄存器存放到此任务的堆栈中, 然后, 再从另一个任务的堆栈中恢复原来的工作寄存器, 继续运行另一个任务 所以, 寄存器的入栈和出栈是 C/OS-Ⅱ 多任务调 7

8 度的基础 专业始于专注卓识源于远见 移植步骤 所谓移植, 就是使一个实时操作系统能够在某个微处理器平台上或微控制器上运行 由 C/OS-Ⅱ 的文件系统可知, 在移植过程中, 用户所需要关注的就是与处理器相关的代码 这部分包括一个头文件 OS_CPU.H 一个汇编文件 OS_CPU_A.ASM 和一个 C 代码文件 OS_CPU_C.C 以下介绍当使用 MDK RealView 编译器时, 移植 C/OS-Ⅱ 的主要内容 (1) 基本的配置和定义 需要完成的基本配置和定义全部集中在 OS_CPU.H 头文件中 1 定义与编译器相关的数据类型 为了保证可移植性, 程序中没有直接使用 C 语言中的 short int 和 long 等数据类型的定义, 因为它们与处理器类型有关, 隐含着不可移植性 程序中自己定义了一套数据类型, 如 INT16U 表示 16 位无符号整型 对于 ARM 这样的 32 位内核,INT16U 是 unsigned short 型 ; 如果是 16 位的处理器, 则是 unsighed int 型 在 STM32F103 处理器上实现的数据类型定义代码如下 : typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned short INT16U; typedef signed short INT16S; typedef unsigned int INT32U; typedef signed int INT32S; typedef float FP32; typedef double FP64; typedef unsigned int OS_STK; typedef unsigned int OS_CPU_SR; 2 定义允许和禁止中断宏 与所有实时内核一样, C/OS-Ⅱ 需要先禁止中断, 再访问代码的临界区, 并且在访问完毕后, 重新允许中断 这就使得 C/OS-Ⅱ 能够保护临界段代码免受多任务或中断服务历程 ISR 的破坏 中断禁止时间是商业实时内核公司提供的重要指标之一, 因为它将影响到用户的系统对实时事件的响应能力 虽然 C/OS-Ⅱ 尽量使中断禁止时间达到最短, 但是 C/OS-Ⅱ 的中断禁止时间还主要依赖于处理器结构和编译器产生的代码的质量 通常每个处理器都会提供一定的指令来禁止 / 允许中断, 因此用户的 C 编译器必须由一定的机制来直接从 C 中执行这些操作 C/OS-Ⅱ 定义了两个宏来禁止和允许中断 :OS_ENTER_CRITICAL() 和 OS_EXIT_CRI TIVAL() 在 STM32F103 处理器上实现的代码如下 : #define OS_CRITICAL_METHOD 3 #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} 其中,OS_CPU_SR_Save() 和 OS_CPU_SR_Restore 用汇编语言定义, 代码如下 : OS_CPU_SR_Save MRS R0, PRIMASK ; set prio int mask to mask all (except faults) CPSID I BX LR OS_CPU_SR_Restore MSR PRIMASK, R0 BX LR 8

9 专业始于专注卓识源于远见 3 定义栈的增长方向 C/OS-Ⅱ 使用结构常量 OS_STK_GROWTH 来指定堆栈的增长方式 : 置 OS_STK_GROWTH 为 0, 表示堆栈从下往上增长 ; 置 OS_STK_GROWTH 为 1, 表示堆栈从上往下增长 虽然 ARM 处理器核对两种方式均支持, 但 GCC 的 C 语言编译器仅支持一种方式, 即从上往下增长, 并且是满递减堆栈 所以 OS_STK_GROWTH 的值为 1, 它在 OS_CPU.H 中定义 用户规划好栈的增长方向后, 便定义了符合 OS_STK_GROWTH 的值 STM32F103 处理器上实现定义堆栈增长方向的代码如下 : #define OS_STK_GROWTH 1 4 定义 OS_TASK_SW() 宏 OS_TASK_SW() 宏是 C/OS-Ⅱ 从低优先级任务切换到高优先级任务时被调用的 可采用下面两种方式定义 : 如果处理器支持软中断, 则可使用软中断将中断向量指向 OSCtxSW() 函数 ; 或者直接调用 OSCtxSw() 函数 C/OS-Ⅱ 在 STM32F103 处理器上实现 OSCtxSw 的代码如下, 该段代码由汇编语言实现 OSCtxSw LDR R4, =NVIC_INT_CTRL ; trigger the PendSV exception (causes context switch) LDR STR R5, =NVIC_PENDSVSET R5, [R4] BX LR (2) 移植汇编语言编写的 4 个与处理器相关的函数 OS_CPU_A.ASM 1 OSStartHighRdy(): 运行优先级最高的就绪任务 OSStartHighRdy() 函数是在 OSStart() 多任务启动之后, 负责从最高优先级任务的 TCB 控制块中获得该任务的堆栈指针 SP, 并通过 SP 依次将 CPU 现场恢复 这时系统就将控制权交给用户创建的任务进程, 直到该任务被阻塞或者被其他更高优先级的任务抢占 CPU 该函数仅仅在多任务启动时被执行一次, 用来启动最高优先级的任务执行 移植该函数的原因是, 它涉及将处理器寄存器保存到堆栈的操作 C/OS-Ⅱ 在 STM32F103 处理器上实现 OSStartHighRdy 的代码如下 : OSStartHighRdy LDR R4, =NVIC_SYSPRI2 ; set the PendSV exception priority LDR R5, =NVIC_PENDSV_PRI STR R5, [R4] MOV R4, #0 ; set the PSP to 0 for initial context switch call MSR PSP, R4 LDR R4, =OSRunning ;// 设置 OSRunning = TRUE MOV R5, #1 STRB R5, [R4] ;// 切换到最高优先级的任务 LDR R4, =NVIC_INT_CTRL ; trigger the PendSV exception (causes context switch) LDR R5, =NVIC_PENDSVSET STR R5, [R4] CPSIE I ; enable interrupts at processor levelosstarthang B OSStartHang ; should never get here 2 OSCtxSw(): 任务优先级切换函数 该函数由 OS_TASK_SW() 宏调用,OS_TASK_SW() 由 OSSched() 函数调用,OSSched() 函数负责任务之间的调度 OSCtxSw() 函数的工作是, 先将当前任务的 CPU 现场保存到该任务的堆栈中, 然后获得最高优先级任务的堆栈指针, 并从该堆栈中恢复此任务的 CPU 现场, 使之继续执行, 该函数就完成了一次任务切换 9

10 专业始于专注卓识源于远见 3 OSInitCtxSw(): 中断级的任务切换函数 该函数由 OSIntExit() 调用 由于中断可能会使更高优先级的任务进入就绪态, 因此, 为了让更高优先级的任务能立即运行, 在中断服务子程序的最后,OSInitExit() 函数会调用 OSIntCtxSw() 做任务切换 这样做的目的主要是能够尽快地让高优先级的任务得到响应, 保证系统的实时性能 OSIntCtxSw() 与 OSCtxSw() 都是用于任务切换的函数, 其区别在于, 在 OSIntCtxSw() 中无需再保存 CPU 寄存器, 因为在调用 OSIntCtxSw() 之前已发生了中断,OSIntCtxSw() 已将默认的 CPU 寄存器保存到了被中断的任务堆栈中 4 OSTickISR(): 时钟节拍中断服务函数 时钟节拍是特定的周期性中断, 是由硬件定时器产生的 时钟的节拍式中断使得内核可将任务延时若干个整数时钟节拍, 以及当任务等待事件发生时, 提供等待超时的依据 时钟节拍频率越高, 系统的额外开销越大 中断间的时间间隔取决于不同的应用 OSTickISR() 首先将 CPU 寄存器的值保存在被中断任务的堆栈中, 之后调用 OSIntEnter() 随后,OSTickISR() 调用 OSTimeTick, 检查所有处于延时等待状态的任务, 判断是否有延时结束就绪的任务 OSTickISR() 最后调用 OSIntExit() 如果在中断中( 或其他嵌套的中断 ) 有更高优先级的任务就绪, 并且当前中断为中断嵌套的最后一层, 那么 OSIntExit() 将进行任务调度 (3) 移植 C 语言编写的 6 个与操作系统相关的函数 OS_CPU_C.C OS_CPU_C.C 文件中包含 6 个和 CPU 相关的函数, 这 6 个函数为 OSTaskStkInit() OSTask DelHook() OSTaskSwHook() OSTaskStartHook() 及 OSTimeTickHook() 这些函数中, 唯一必须移植的是任务堆栈初始化函数 OSTaskStkInit() 这个函数在任务创建时被调用, 负责初始化任务的堆栈结构并返回新堆栈的指针 stk 堆栈初始化工作结束后, 返回新的堆栈栈顶指针 C/OS-Ⅱ 在 STM32F103 处理器上实现 OSTaskStkInit 的代码如下 : OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt) { OS_STK *stk; (void)opt; /* 'opt' is not used, prevent warning */ stk = ptos; /* Load stack pointer */ /* Registers stacked as if auto-saved on exception*/ *(stk) = (INT32U)0x L; /* xpsr */ *(--stk) = (INT32U)task; /* Entry Point */ *(--stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/ *(--stk) = (INT32U)0x L; /* R12 */ *(--stk) = (INT32U)0x L; /* R3 */ *(--stk) = (INT32U)0x L; /* R2 */ *(--stk) = (INT32U)0x L; /* R1 */ *(--stk) = (INT32U)p_arg; /* R0 : argument */ /* Remaining registers saved on process stack */ *(--stk) = (INT32U)0x L; /* R11 */ *(--stk) = (INT32U)0x L; /* R10 */ *(--stk) = (INT32U)0x L; /* R9 */ *(--stk) = (INT32U)0x L; /* R8 */ *(--stk) = (INT32U)0x L; /* R7 */ *(--stk) = (INT32U)0x L; /* R6 */ *(--stk) = (INT32U)0x L; /* R5 */ *(--stk) = (INT32U)0x L; /* R4 */ return (stk); 10

11 专业始于专注卓识源于远见 } 其他 5 个均为 Hook 函数, 又被称为钩子函数, 主要用来控制 C/OS-Ⅱ 功能, 必须被声明, 但并不一定要包含任何代码 OSTaskCreateHook() : 当用 OSTaskCreate() 或 OSTaskCreateExt() 建立任务时, 就会调用 OSTaskCreateHook() C/OS- Ⅱ 设置完自己的内部结构后, 会在调用任务调度程序之前调用 OSTaskCreateHook() 该函数被调用时中断是禁止的, 因此应尽量减少该函数中的代码, 以缩短中断的响应时间 OSTaskDelHook(): 当任务被删除时, 就会调用 OSTaskDelHook() 函数在把任务从 C/OS-Ⅱ 的内部任务链表中解开之前被调用 当 OSTaskDelHook() 被调用时, 会收到指向正被删除任务的 OS_TCB 的指针, 这样它就可以访问所有的结构成员了 OSTaskDelHook() 可用来检验 TCB 扩展是否被建立了 ( 一个非空指针 ), 并进行一些清除操作 此函数不返回任何值 OSTaskSwHook(): 当发生任务切换时, 调用 OSTaskSwHook() 不管任务切换是通过 OSCtxSw() 还是通过 OSIntCtxSw() 来执行的, 都会调用该函数 OSTaskSwHook() 可直接访问 OSTCBCur 和 OSTCBHighRdy, 因为它们都是全局变量 OSTCBur 指向被切换出去的任务的 OS_TCB, 而 OSTCBHighRdy 指向新任务的 OS_TCB 因为代码的多少会影响到中断的响应时间, 所以应尽量使代码简化 此函数没有任何参数, 也不返回任何值 OSTaskStatHook():OSTaskStatHook() 每秒会被 OSTaskStart() 调用一次 可用 OSTask StatHook() 来扩展统计功能 例如, 可保持并显示每个任务的执行时间 每个任务所占用的 CPU 份额以及每个任务执行的频率等 该函数没有任何参数, 也不返回任何值 OSTimeTickHook(): 该函数在每个时钟节拍都会被 OSTimeTick() 调用 实际上,OSTimeTickHook() 是在节拍被 C/OS-Ⅱ 处理, 并在通知用户的移植实例或应用程序之前被调用的 OSTimeTickHook() 没有任何参数, 也不返回任何值 联系方式 集团官网 : 嵌入式学院 : 移动互联网学院 : 企业学院 : 物联网学院 : 研发中心 :dev.hqyj.com 集团总部地址 : 北京市海淀区西三旗悦秀路北京明园大学校内华清远见教育集团 北京地址 : 北京市海淀区西三旗悦秀路北京明园大学校区, 电话 : /5 上海地址 : 上海市徐汇区漕溪路 250 号银海大厦 11 层 B 区, 电话 : 深圳地址 : 深圳市龙华新区人民北路美丽 AAA 大厦 15 层, 电话 : 成都地址 : 成都市武侯区科华北路 99 号科华大厦 6 层, 电话 : 南京地址 : 南京市白下区汉中路 185 号鸿运大厦 10 层, 电话 : 武汉地址 : 武汉市工程大学卓刀泉校区科技孵化器大楼 8 层, 电话 : 西安地址 : 西安市高新区高新一路 12 号创业大厦 D3 楼 5 层, 电话 :

<4D F736F F F696E74202D204D34D1D0CCD6BBE F55434F534949D4DA4C4D3446D6D0B5C4D2C6D6B2D3EBD3A6D3C3>

<4D F736F F F696E74202D204D34D1D0CCD6BBE F55434F534949D4DA4C4D3446D6D0B5C4D2C6D6B2D3EBD3A6D3C3> uc/os-ii 在 LM4F 中的移植与应用 捷恩斯威科技, 最专业的 TI MCU 方案设计商 目录 1 uc/os-ii 简介 2 uc/os-ii 体系结构 3 uc/os-ii 的移植 4 uc/os-ii 任务创建 uc/os-ii 简介 1. μc/os-ii 具有执行效率高 占用空间小 实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 2. μc/os-ii 是一种可移植的,

More information

uc/os 1

uc/os 1 uc/os 1 uc/os-ii Source Code ANSI C, uc/os-ii 8/16/32 bits microprocessor Preemptive real-time Task 64 Stack Size ROMable (C compiler, assembler and linker/locator) uc/os-ii Mailboxes, Queues, Semaphores,

More information

Microsoft Word - μCOS-II在AndesCore N1033A-S上的移植 中簡Aug-2011.doc

Microsoft Word - μCOS-II在AndesCore N1033A-S上的移植  中簡Aug-2011.doc 晶心科技技术文章 µc/os-ii 在 AndesCore TM N1033A-S 上的移植 發表人 : 周杰, 应用工程师, 晶心宏科技 ( 杭州 ) 有限公司 Tel:0571-85269013-307 Mobile: 13706511046 zhoujie@andestech.com.cn. 晶 心 科 技 新 闻 联 络 人 市场部 Janine 徐家玲经理电话 : 886-3-6668300

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 嵌入式系统设计与实例开发 ARM 与 µc/os-Ⅱ 北京航空航天大学智能嵌入式技术工作室 1 第四讲 嵌入式实时操作系统分析 一 操作系统概述二 嵌入式实时操作系统 µc/os 三 嵌入式 Linux 简介四 WinCE 2 一 操作系统的发展 串行处理 简单批处理系统 IBMSYS 多通道程序批处理系统 分时操作系统 实时操作系统 3 批处理操作系统 工作方式 : 用户将作业交给系统操作员 系统操作员将许多用户的作业组成一批作业

More information

Microsoft Word - freeRTOS移椊.docx

Microsoft Word - freeRTOS移椊.docx FREERTOS 在 STM32 的移植 V 1.0 FreeRTOS 作为开源的轻量级实时性操作系统, 不仅实现了基本的实时调度 信号量 队列和存储管理, 而且在商业应用上不需要授权费 FreeRTOS 的实现主要由 list.c queue.c croutine.c 和 tasks.c 4 个文件组成 list.c 是一个链表的实现, 主要供给内核调度器使用 ;queue.c 是一个队列的实现,

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

Andes Technology PPT Temp

Andes Technology PPT Temp 晶心科技線上技術研討會 AndesCore 便捷的全 C 嵌入式编程 晶心科技市場及技術服務部毛礼杰軟件經理 WWW.ANDESTECH.COM 大纲 系统初始化介绍 异常和中断说明 全 C 语法例子说明 总结 2 CPU 相关特性 1: 中断向量表 系统初始化 (1) 2: 系统寄存器 通常需要用 assembly( 汇编 / 组合 ) 语言来操作 AndesCore 全 C 嵌入式编程 C 扩展语法

More information

uCOS-II的移植与编译

uCOS-II的移植与编译 编译 嵌入式联合大实验报告 2011/1/3 三人行组 计 73 班顾荣辉 2007011327 计 73 班卜鹏洋 2007011311 计 74 班吉宇婷 2007011346 目录 1. 实验概述... 1 2. 实验特点及困难描述... 1 3. 系统介绍... 2 3.1 ucos-ii 系统简介... 2 3.2 CoMPCert 编译器简介... 3 3.3 Crosstool 交叉编译工具简介...

More information

<4D F736F F F696E74202D20B5DAC1F9D5C2A3F5A3E3A3EFA3F3D3EBD2C6D6B2322DD7D4B6AFBBAF2E B436F6D C D6F646

<4D F736F F F696E74202D20B5DAC1F9D5C2A3F5A3E3A3EFA3F3D3EBD2C6D6B2322DD7D4B6AFBBAF2E B436F6D C D6F646 嵌入式操作系统 UCOS -II ucos-ii 操作系统的特点 ucos -II 操作系统内核结构 ucos -II 操作系统任务管理 ucos -II 操作系统内存管理 ucos -II 操作系统时间管理 ucos -II 操作系统任务间的通讯 ucos -II 操作系统移植 µc/os-ii 的特点 UC/OS 是一个非常小巧的实时操作系统 ; 整个代码分为内核层以及移植层, 这样使得它的植性很方便

More information

Microsoft Word - uCOS51ÒÆÖ²ÐĵÃ.doc

Microsoft Word - uCOS51ÒÆÖ²ÐĵÃ.doc ucos51 移植心得 巨龙公司系统集成开发部杨屹 asdjf@163.com 2002/10/03 引言 自从发表 ucos51 移植心得以来我收到了很多朋友们的来信大家对公开源码表示鼓励谢谢大家的支持很多人对于编写自己的操作系统很感兴趣 ucos51 是个不错的选择它的优点是简单易懂学习成本低有利于向 32 位 CPU 过渡目前嵌入式 BBS 上的热点是嵌入式实时多任务操作系统单片机上网 32bitCPU

More information

PowerPoint Presentation

PowerPoint Presentation 浙江大学海洋学院 STM32 高级 uc/os-ii 嵌入式实时操作系统 司玉林博士海洋工程与技术研究所浙江大学 2019 年 4 月 12 日 @ 舟山 内容提要 操作系统 嵌入式操作系统 嵌入式实时操作系统 1 操作系统 操作系统 ( 英语 :operating system, 缩写 :OS) 是管理计算机硬件与软件资源的计算机程序, 同时也是计算机系统的内核与基石 操作系统需要处理如管理与配置内存

More information

<4D F736F F D20B5DA32D5C220416E64726F6964BFAAB7A2BBB7BEB3B4EEBDA82E646F6378>

<4D F736F F D20B5DA32D5C220416E64726F6964BFAAB7A2BBB7BEB3B4EEBDA82E646F6378> Android 应用程序开发与典型案例 作者 : 华清远见 第 2 章 Android 开发环境搭建 本章简介 本章主要介绍在 Windows 环境下,Android 开发环境的搭建步骤及注意事项, 包括 JDK 和 Java 开发环境的安装和配置 Eclipse 的安装 Android SDK 和 ADT 的安装和配置等 ; 同时介绍了 Android 开发的基本步骤 2.1 Android 开发环境的安装与配置

More information

目录 从 0 开始移植 UCOS II 移植到野火 stm32 开发板... 1 前言... 1 第一章官方源代码介绍... 3 第二章重要文件代码详解 os_cpu.h os_cpu_c.c os_cpu_a.asm 第三章 uc/

目录 从 0 开始移植 UCOS II 移植到野火 stm32 开发板... 1 前言... 1 第一章官方源代码介绍... 3 第二章重要文件代码详解 os_cpu.h os_cpu_c.c os_cpu_a.asm 第三章 uc/ 从 0 开始移植 UCOS II 到野火 stm32 开发板 作者 Fire Team E-Mail firestm32@foxmail.com QQ 313303034 淘宝 http://firestm32.taobao.com 件平台 野火 STM32 开发板 库版本 ST3.0.0 前言 uc/os 是一个微型的实时操作系统, 包括了一个操作系统最基本的一些特性, 如任务调度 任务通信 内存管理

More information

UCOS时间片轮转调度算法详解

UCOS时间片轮转调度算法详解 UCOS 时 间 片 轮 转 调 度 算 法 详 解 引 言.:UCOS 和 我 修 改 的 UCOS 的 区 别 UCOS 一 种 只 支 持 优 先 级 抢 占 型 调 度 的 操 作 系 统 它 不 支 持 同 一 个 优 先 级 有 2 个 及 以 上 的 任 务 同 时 运 作 我 修 改 的 UCOS 支 持 不 同 优 先 级 调 度 的 同 时, 支 持 同 一 个 优 先 级 有

More information

嵌入式操作系统FreeRTOS的原理与实现

嵌入式操作系统FreeRTOS的原理与实现 嵌入式操作系统 FreeRTOS 的原理与实现 在嵌入式领域中, 嵌入式实时操作系统正得到越来越广泛的应用 采用嵌入式实时操作系统 (RTOS) 可以更合理 更有效地利用 CPU 的资源, 简化应用软件的设计, 缩短系统开发时间, 更好地保证系统的实时性和可靠性 由于 RTOS 需占用一定的系统资源 ( 尤其是 RAM 资源 ), 只有 μc/os-ii embos salvo FreeRTOS 等少数实时操作系统能在小

More information

哈尔滨工业大学硕士毕业论文模板

哈尔滨工业大学硕士毕业论文模板 μc/os-Ⅱ 在 STM32 中的移植 摘要 近些年来, 数字化技术高速发展, 嵌入式产品已经出现在我们生活中的方方面面 嵌入式操作系统又作为嵌入产品的基石, 在产业发展过程中扮演了越来越不可替代的角色 本文主要研究了嵌入式操作系统中应用较为广泛的 源代码开放的 μc/os-ii 在 STM32 芯片上的移植 本文首先分析了 μc/os-ii 实时系统的内核结构, 介绍了 μc/os-ii 的中的任务

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

RTOS

RTOS 嵌入式实时操作系统 µc/os-iii Dormant Waiting RTOS Kernel Pending Running ISR 1 中国的嵌入式 OS VxWork Qnx 其他 µc/os-ii Linux WinCE 资料来源 : 电子产品世界 2009 年第 1 期 2008 年嵌入式应用调查报告 627 份调查问卷 2 µc/os 和 µc/os-ii Jean J.Labrosse

More information

Agilent N5700 N5741A-49A, N5750A-52A, N5761A-69A, N5770A-72A W 1500 W 600 V 180 A 1 U Vac AC LAN,USB GPIB Agilent N5700 1U 750W 1500W 24

Agilent N5700 N5741A-49A, N5750A-52A, N5761A-69A, N5770A-72A W 1500 W 600 V 180 A 1 U Vac AC LAN,USB GPIB Agilent N5700 1U 750W 1500W 24 Agilent N700 N71A-9A, N70A-2A, N761A-69A, N770A-72A 2 70 W 100 W 600 V 180 A 1 U 8-26 Vac AC LAN,USB GPIB Agilent N700 1U 70W 100W 2 6V 600V 1.A 180A N700 1U 19 100W LED N700 OVP UVL UVL OVP N700 GPIB

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

ARM中C和汇编混合编程及示例.doc

ARM中C和汇编混合编程及示例.doc ARM 中 C 和汇编混合编程及示例 在嵌入式系统开发中, 目前使用的主要编程语言是 C 和汇编,C++ 已经有相应的编译器, 但是现在使用还是比较少的 在稍大规模的嵌入式软件中, 例如含有 OS, 大部分的代码都是用 C 编写的, 主要是因为 C 语言的结构比较好, 便于人的理解, 而且有大量的支持库 尽管如此, 很多地方还是要用到汇编语言, 例如开机时硬件系统的初始化, 包括 CPU 状态的设定,

More information

Microsoft Word - 第1章 绪论.docx

Microsoft Word - 第1章 绪论.docx Windows CE 嵌入式开发标准教程 作者 : 华清远见 第 1 章绪论 本章目标 本章概述了嵌入式操作系统的概念 系统特性和 Windows CE 操作系统的发展 历史 开发特性以及开发流程 通过本章的学习, 读者将会掌握以下内容 了解嵌入式操作系统的基本特点了解 Windows CE 操作系统的发展历史掌握 Windows CE 操作系统的主要特性掌握 Windows CE 的开发特点掌握

More information

Ps22Pdf

Ps22Pdf 4 2005 * 1 1, 2,, 2 1, 2, ( 1., 200072; 2., 510515) : RT-Linux, CLinux, C/ OS- ecos ( Embedded Real- Time Operating Systems, ERTOS),, ERTOS : ; ; ; ; ; : TP316. 2 : A : 1001-3695( 2005) 09-0004- 05 Analysis

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

Microsoft Word - MAN2011A_CH_RTT.doc

Microsoft Word - MAN2011A_CH_RTT.doc 基于 SAM7X EK 和 IAR EWARM 文档编号 文档版本 Rev. A 文档摘要 基于 AT91SAM7X EK 开发板的代码解读,RTT 代码解读 关键词 AT91SAM7X256 SAM7X EK IAR EWARM J LINK RTT 创建日期 2010 06 08 创建人员 Cust126 审核人员 Robin 文档类型 公开发布 / 开发板配套文件 版权信息 Mcuzone 原创文档,

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

深入理解与实现 RTOS 2 / 27 发人员掌握 但是每个事件的查询和处理时间是不能确定的 假如前面的操作时间较长, 那么后面的操作必然会被延迟 图 1-1 轮询系统结构 在上图中, 假如步骤 1 操作需要很久, 那么步骤 2 必然得不到及时处理, 如果步骤 2 的工作很重要或者很紧急, 那么系统

深入理解与实现 RTOS 2 / 27 发人员掌握 但是每个事件的查询和处理时间是不能确定的 假如前面的操作时间较长, 那么后面的操作必然会被延迟 图 1-1 轮询系统结构 在上图中, 假如步骤 1 操作需要很久, 那么步骤 2 必然得不到及时处理, 如果步骤 2 的工作很重要或者很紧急, 那么系统 深入理解与实现 RTOS 1 / 27 第一章嵌入式内核基础... 1 1.1 嵌入式软件系统结构... 1 1.1.1 轮询系统... 1 1.1.2 前后台系统... 2 1.1.3 多任务系统... 3 1.2 多任务机制概述... 5 1.2.1 时钟节拍... 5 2.1.2 多任务机制... 6 1.2.3 任务上下文... 7 1.2.4 任务切换... 8 1.2.5 任务的时间片和优先级...

More information

Static Enforcement of Security with Types

Static Enforcement of Security with Types 例题 1 一个 C 语言程序及其在 X86/Linux 操作系统上的编译结 果如下 根据所生成的汇编程序来解释程序中四个变 量的存储分配 生存期 作用域和置初值方式等方面 的区别 static long aa = 10; short bb = 20; func( ) { } static long cc = 30; short dd = 40; static long aa = 10; func(

More information

嵌入式Linux/WinCE/VxWorks培训免费讲座

嵌入式Linux/WinCE/VxWorks培训免费讲座 嵌入式培训专家 VxWorks 系统开发 www.farsight.com.cn 日程 v 如何跨入嵌入式系统开发 ; vbsp(bootrom) 的移植 ; vvxworks 的内核机制 ; v 中断的处理 ; v 应用程序的开发 ( 多线程 ); vvxworks 的调试环境 ; vq/a? Vxworks 的应用 数据通信 消费电子 数字图象设备 航空航天 工业控制 计算机外设 交通运输 电信

More information

Microsoft Word - Vxwork介绍及设计.doc

Microsoft Word - Vxwork介绍及设计.doc 一. 嵌入式操作系统 VxWorks 简介 VxWorks 操作系统是美国 WindRiver 公司于 1983 年设计开发的一种嵌入式实时操作系统 (RTOS), 是嵌入式开发环境的关键组成部分 良好的持续发展能力 高性能的内核以及友好的用户开发环境, 在嵌入式实时操作系统领域占据一席之地 WindRiver 公司网址 实时操作系统和分时操作系统的区别 VxWorks 的特点 可靠性 实时性 VxWorks

More information

ebook

ebook 3 3 3.1 3.1.1 ( ) 90 3 1966 B e r n s t e i n P ( i ) R ( i ) W ( i P ( i P ( j ) 1) R( i) W( j)=φ 2) W( i) R( j)=φ 3) W( i) W( j)=φ 3.1.2 ( p r o c e s s ) 91 Wi n d o w s Process Control Bl o c k P C

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

WMSDK用户手册

WMSDK用户手册 WM_W60X_SDK_OS 移植指导 V1.3 (winner micro) 地址 : 北京市海淀区阜成路 67 号银都大厦 18 层电话 :+86-10-62161900 公司网址 :www.winnermicro.com 1 文档修改记录 版本 修订时间 修订记录 作者 审核 V1.0 2018.09.21 初稿 Muqing V1.1 2018.10.11 修改系统时钟为静态变量 Cuiych

More information

学习MSP430单片机推荐参考书

学习MSP430单片机推荐参考书 MSP430 16 MSP430 C MSP430 C MSP430 FLASH 16 1 CPU 16 ALU 16 PC SP SR R4~R15 2 3 00-FFH 100-1FFH 4 5 1 2 51 24 27 6 1 2 3 4 5 6 4 12 SR SP SR CPU SR CPU C Z N GIE CPUOff CPU OscOff SCG0 SCG1 CPU EXIT SP

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

六域链联盟 SDChain-Matrix 节点搭建指南 2018/07/26 Version : 1.0.0

六域链联盟 SDChain-Matrix 节点搭建指南 2018/07/26 Version : 1.0.0 SDChain-Matrix 节点搭建指南 目录 1 环境要求... 3 2 软件下载... 4 3 安装部署... 4 3.1 部署可执行程序目录... 4 3.2 部署配置文件目录... 4 3.3 部署数据库文件目录... 4 3.4 部署日志文件目录... 4 3.5 部署依赖库文件目录... 4 4 配置参数... 5 5 启动运行... 7 5.1 普通模式启动... 7 5.2 加载启动模式...

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

第 期 曹 源 等 形式化方法在列车运行控制系统中的应用

第 期 曹 源 等 形式化方法在列车运行控制系统中的应用 第 卷 第 期 年 月 交通运输工程学报 曹 源 唐 涛 徐田华 穆建成 为了确保列车运行控制系统设计和开发的正确性 比较了仿真 测试和形式化 种能够验证 系统设计正确性的方式 根据列车运行控制系统对安全的苛求性 提出了 个与系统安全相关的重要特性 即实时性 混成性 分布 并发 性 反应性 并分析了与这些特性相关的具体形式化方法 通 过对每种形式化方法的数学基础和应用范围的分析和归类 给出了各种方法的优势和不足

More information

广州市星翼电子科技有限公司 淘宝店铺 1: 淘宝店铺 2: 技术支持论坛 ( 开源电子网 ) : 官方网站 : 最新资料下载链接 :http

广州市星翼电子科技有限公司 淘宝店铺 1:  淘宝店铺 2:  技术支持论坛 ( 开源电子网 ) :  官方网站 :  最新资料下载链接 :http STM32F429 UCOS 开发手册 V1.0 ALIENTEKSTM32F429 UCOSII/III 开发教程 1 广州市星翼电子科技有限公司 淘宝店铺 1:http://eboard.taobao.com 淘宝店铺 2:http://openedv.taobao.com 技术支持论坛 ( 开源电子网 ) :www.openedv.com 官方网站 :www.alientek.com 最新资料下载链接

More information

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

新・解きながら学ぶC言語

新・解きながら学ぶC言語 330!... 67!=... 42 "... 215 " "... 6, 77, 222 #define... 114, 194 #include... 145 %... 21 %... 21 %%... 21 %f... 26 %ld... 162 %lf... 26 %lu... 162 %o... 180 %p... 248 %s... 223, 224 %u... 162 %x... 180

More information

Microsoft Word - 第6章.doc

Microsoft Word - 第6章.doc 第一章 : 范例 在这一章里将提供三个范例来说明如何使用 µc/os-ii 笔者之所以在本书一开始就写这一章是为了让读者尽快开始使用 µc/os-ii 在开始讲述这些例子之前, 笔者想先说明一些在这本书里的约定 这些例子曾经用 Borland C/C++ 编译器 (V31) 编译过, 用选择项产生 Intel/AMD80186 处理器 ( 大模式下编译 ) 的代码 这些代码实际上是在 Intel Pentium

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

嵌入式工程师考纲大纲(中级)

嵌入式工程师考纲大纲(中级) ARM9 嵌入式系统设计与开发应用 教学大纲 编写 : 熊茂华 本教材是为中国电子学会嵌入式设计工程师考试指定教材, 根据嵌入式设计工程师考试大纲 ( 中级 ) 要求, 制订了 ARM9 嵌入式系统设计与开发应用 课程的教学大纲 课程能力目标 : 通过本课程的教学, 掌握嵌入式应用系统的基本结构 嵌入式硬件接口和软件系统设计的方法 ; 利用嵌入式开发工具 ADS 1.2 开发基于 μc/os-ii

More information

01

01 ZEBRA 技术白皮书 条码编码 101 相关知识介绍 引言 20 70 数据 80 20 90 (JIT) AIAG EIA HIBCC HAZMAT 条码的优势提高数据准确性 99% 85% / / 提升效率 / 2 Zebra Technologies 保持一致性 ID 改进库存和资产管理 成本 / 效益分析 ID ID ID (ERP) RFID Zebra Technologies 3 ID

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

3.1 num = 3 ch = 'C' 2

3.1 num = 3 ch = 'C' 2 Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

Microsoft Word - 78.doc

Microsoft Word - 78.doc µc/os-ii 在离子色谱分析仪中的应用 马兴录, 陈为 ( 青岛科技大学信息科学技术学院, 山东青岛 266061) 摘要 : 在离子色谱分析仪的设计中, 采用了嵌入式 PC 以及 µc/os-ii 在介绍了离子色谱分析仪的工作原理之后, 详述了 µc/os-ii 下的底层驱动函数以及多任务应用程序的设计, 实现了稳定可靠的离子色谱分析仪 关键词 :µc/os-ii; 嵌入式 PC; 离子色谱分析仪中图分类号

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

V1.0 RT-Thread 开发者能力认证考试样题 (RCEA) 注 : 样题仅为部分题目 第一小卷 : 单选题 40 题 40 分钟 40.0 分 1 对两个字符 a 和 b 进行初始化 : char a[] = "ABCDEF"; char b[]={'a','b','c','d','e','

V1.0 RT-Thread 开发者能力认证考试样题 (RCEA) 注 : 样题仅为部分题目 第一小卷 : 单选题 40 题 40 分钟 40.0 分 1 对两个字符 a 和 b 进行初始化 : char a[] = ABCDEF; char b[]={'a','b','c','d','e',' RT-Thread 开发者能力认证考试样题 (RCEA) 注 : 样题仅为部分题目 第一小卷 : 单选题 40 题 40 分钟 40.0 分 1 对两个字符 a 和 b 进行初始化 : char a[] = "ABCDEF"; char b[]={'a','b','c','d','e','f'; 则以下叙述正确的是 (1 分 ) a 数组大小比 b 数组大小大 a 与 b 大小相同但两个数组不完全相同

More information

实验 1.3 多进程 ( 线程 ) 实现快速排序 - 内容 : 编多进程及多线程程序实现对 个随机数的快速排序算法 - 要求 : 产生 个随机数, 编写一个多进程 ( 线程 ) 实现快速排序算法 ; 要求说明你的程序运行的系统资源配置, 给出测试结果并对测试程序和结果做出说明

实验 1.3 多进程 ( 线程 ) 实现快速排序 - 内容 : 编多进程及多线程程序实现对 个随机数的快速排序算法 - 要求 : 产生 个随机数, 编写一个多进程 ( 线程 ) 实现快速排序算法 ; 要求说明你的程序运行的系统资源配置, 给出测试结果并对测试程序和结果做出说明 嵌入式实时操作系统 课程实验指导书 I 操作系统实验部分 实验 1 进程管理 实验 1.1 进程创建 - 内容 : 编写一段程序, 使用系统调用 fork( ) 创建两个子进程, 再用系统调用 signal( ) 让父进程捕捉键盘上来的中断信号 ( 即按 ctrl+c 键 ), 当捕捉到中断信号后, 父进程用系统调用 kill( ) 向两个子进程发出信号, 子进程捕捉到信号后, 分别输出下列信息后终止

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378>

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378> 第一章第二章 Q2 1: 高序 : 最低位字节存储在字的最低位 ; 低序 : 最低位字节存储在字的最高位 ; Q2 2: 冯. 诺依曼结构 : 数据和指令都存储在同一存储器中 ; 哈佛结构 : 数据和程序存储在各自独立的存储器中 Q2 3: a) ARM 有 16 个通用寄存器,r0 r15, 其中 r15 还被用作程序计数器 b) CPSR 是程序状态寄存器, 包含了条件码标识 中断禁止位 当前处理器模式和其他状态

More information

Cortex-M3体系结构与接口编程

Cortex-M3体系结构与接口编程 嵌入式培训专家 Cortex-M3 体系结构与接口编程 今天的内容 Cortex-M3 发展及应用 Cortex-M3 内核体系结构 Thumb2 指令集 Cortex-M3 接口设计 Cortex-M3 与操作系统 Cortext-M3 发展及应用 varm 公司简介 主要设计 ARM 系列 RISC 处理器内核 ( 芯片的体系结构设计与开发 ) 授权 ARM 内核给生产和销售半导体的合作伙伴,ARM

More information

提纲 1 2 OS Examples for 3

提纲 1 2 OS Examples for 3 第 4 章 Threads2( 线程 2) 中国科学技术大学计算机学院 October 28, 2009 提纲 1 2 OS Examples for 3 Outline 1 2 OS Examples for 3 Windows XP Threads I An Windows XP application runs as a seperate process, and each process may

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

Guava学习之CharSequenceReader

Guava学习之CharSequenceReader CharSequenceReader 类是以 CharSequence 的形式读取字符 CharSequenceReader 类继承自 Reader 类, 除了 remaining() hasremaining() 以及 checkopen() 函数之后, 其他的函数都是重写 Reader 类中的函数 CharSequenceReader 类声明没有用 public 关键字, 所以我们暂时还不能调用这个类

More information

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt MINIX ( 730000) ( 730000) MINIX MINIX2.0 MINIX : MINIX TP3 1 MINIX UNIX Tanenbaum UNIX MINIX LINUX MINIX MINIX MINIX1.0 UNIX V7 MINIX2.0[3] POSIX MINIX3 MINIX Gabriel A. Wainer 1994-1995 [5] 1998 I/O 2002

More information

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品 Autodesk Product Design Suite Standard 20122 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品设计 Autodesk Product Design Suite Standard 版本包包括以下软件产产品

More information

01

01 Zebra Technologies 白皮书 移动打印给仓储运营带来显著优势 综述 RFID RFID (RF) RFID RFID / ROI LAN 采用移动打印机, 享受显而易见的业务成效 - 49.74 28.11 Zebra 2 Zebra Technologies 移动打印机成本效益分析 示例数据固定式打印机移动打印机每年节省资金 10 10 8 8 48 48 3840 3840 15

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1 C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1 1 CARDGAME 1 CardGame 题目描述 桌上有一叠牌, 从第一张牌 ( 即位于顶面的牌 ) 开始从上往下依次编号为 1~n 当至少还剩两张牌时进行以下操作 : 把第一张牌扔掉, 然后把新的第一张放到整叠牌的最后 请模拟这个过程, 依次输出每次扔掉的牌以及最后剩下的牌的编号 输入 输入正整数 n(n

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

Microsoft PowerPoint - 01_Introduction.ppt

Microsoft PowerPoint - 01_Introduction.ppt Hello, World C 程序设计语言 第 1 章章观其大略 孙志岗 sun@hit.edu.cn http://sunner.cn prf("hello,, world\n"); 超级无敌考考你 : 如何把 hello 和 world 分别打印在两行? 2004-12-19 A Tutorial Introduction 2 hello.c 打印华氏温度与摄氏温度对照表 计算公式 : C=(5/9)(

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

嵌入式Linux/WinCE/VxWorks培训免费讲座

嵌入式Linux/WinCE/VxWorks培训免费讲座 走近 WinCE BSP 开发 www.farsight.com.cn 目录 1. Windows CE 系统概述 2. Windows Embedded 家族产品介绍 3. 技术特点 4. Platform Builder 开发环境简介 5. WinCE 5.0 的内存管理架构 6. WinCE 6.0 在内存管理方面的增强 Windows CE 系统概述 1. 良好的可裁剪性和可移植性 2. 具备足以满足绝大多数应用场合的实时性

More information

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63>

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63> 1 实验目的 实验 2 C 和汇编语言的混合编程实验 学习在 C 程序中使用嵌入式汇编编写程序 了解嵌入式汇编的格式 语言特点 2 实验设备 S3C2410 开发板 ADS1.2 集成开发环境,JTAG 调试器 串口连接线 3 实验原理 在 ARM 的应用开发中,C 语言功能强大且容易编写程序, 但是汇编程序在底层的操作仍然具有 C 程序无法替代的功能, 有时候我们需要在 C 程序中嵌入汇编程序来完成一些直接对底层的诸如寄存器的操作

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

幻灯片 1

幻灯片 1 操作系统课程实验 Lab1:bootloader 启动 ucore os 大纲 x86 启动顺序 C 函数调用 gcc 内联汇编 (inline assembly) x86-32 下的中断处理 理解 x86-32 平台的启动过程理解 x86-32 的实模式 保护模式理解段机制 x86 启动顺序 x86 启动顺序 寄存器初始值 摘自 "IA-32 Intel 体系结构软件开发者手册 " x86 启动顺序

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

况伟大 本文在住房存量调整模型基础上 考察了预期和投机对房价影响 理性预 期模型表明 理性预期房价越高 投机越盛 房价波动越大 适应性预期模型表明 当消费 性需求占主导时 上期房价越高 房价波动越小 当投机性需求占主导时 上期房价越高 房价波动越大 本文对中国 个大中城市 年数据的实证结果表明 预期及 其投机对中国城市房价波动都具有较强的解释力 研究发现 经济基本面对房价波动影 响大于预期和投机 但这并不意味着个别城市房价变动不是由预期和投机决定的

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

Microsoft PowerPoint - os_4.ppt

Microsoft PowerPoint - os_4.ppt 行 程 資 科 系 林 偉 川 行 程 概 念 行 程 與 程 式 主 要 的 不 同 點 : 程 式 是 被 放 在 外 部 的 儲 存 裝 置 如 磁 碟 上, 而 行 程 則 被 放 在 記 憶 體 中 程 式 在 儲 存 裝 置 中 是 靜 態 的, 而 行 程 在 記 憶 體 中 是 動 態 的, 它 會 隨 著 一 些 事 件 的 發 生 而 產 生 相 對 的 改 變 行 程, 就 是

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco Windows RTEMS 1 Danilliu MMI TCP/IP 80486 QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos ecos Email www.rtems.com RTEMS ecos RTEMS RTEMS Windows

More information

ST template WORD

ST template WORD 一种计算 CPU 使用率的方法及其实现原理 1 前言 出于性能方面的考虑, 有的时候, 我们希望知道 CPU 的使用率为多少, 进而判断此 CPU 的负载情况和对于当前运行环境是 否足够 胜任 本文将介绍一种计算 CPU 占有率的方法以及其实现原理 2 移植算法 2.1 算法简介 此算法是基于操作系统的, 理论上不限于任何操作系统, 只要有任务调度就可以 本文将以 FreeRTOST 为例来介绍本算法的使用方法

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

工程项目进度管理 西北工业大学管理学院 黄柯鑫博士 甘特图 A B C D E F G 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 甘特图的优点 : 直观明了 ( 图形化概要 ); 简单易懂 ( 易于理解 ); 应用广泛 ( 技术通用 ) 甘特图的缺点 : 不能清晰表示活动间的逻辑关系 WBS 责任分配矩阵 ( 负责〇审批

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

学习和掌握一种RTOS

学习和掌握一种RTOS 学习和掌握一种 RTOS 何小庆北京麦克泰软件技术有限公司 2016 年 10 月上海和北京 什么是 RTOS? R(real) T(time) OS (Operating System) 实时多任务操作系统 RTOS 一种操作系统, 属于嵌入式操作系统 RTOS 有三大特征 : 确定性, 实时性和可靠性 具有并行 异步处理和中断处理能力 RTOS 种类很多 ; 有商业,DIY 和开源 和其他嵌入式

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

MSP430µ¥Æ¬»úCÓïÑԺͻã±àÓïÑÔ»ìºÏ±à³Ì.doc

MSP430µ¥Æ¬»úCÓïÑԺͻã±àÓïÑÔ»ìºÏ±à³Ì.doc MSP430 单片机 C 语言和汇编语言混合编程 Mixing C and Assembler With the MSP430 刘玉宏 Liu,Yuhong 摘要 : 为了发挥 C 语言和汇编语言各自的优点, 二者需要相互调用函数 本文首先介绍了 MSP430 单片机的 C 语言函数的参数传递规则, 然后对 C 语言和汇编语言的混合编程进行了详细描述, 最后给出应用实例 关键字 :MSP430 单片机

More information