项目驱动——编程入门.ppt_第1页
项目驱动——编程入门.ppt_第2页
项目驱动——编程入门.ppt_第3页
项目驱动——编程入门.ppt_第4页
项目驱动——编程入门.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

电子实验中心 项目驱动 单片机应用设计技术 一 前后台系统与嵌入式系统的不同 设计 每按一次按键 发光二极管改变一次状态 电路略 1 前后台系统示例程序如下 SbitLED P1 1 SbitKEY P2 1 Voiddelay unsignedinti while i Voidmain while 1 if KEY 0 delay 1000 if KEY 0 LED LED while KEY 0 TinyOS示例程序如下 voidmain void staticvoid taskKEY void staticvoid taskLED void timer0Init tnOsInit tnOsTaskCreate taskKEY GucTaskStks 0 tnOsTaskCreate taskLED GucTaskStks 1 tnOsStart staticvoid taskKEY void tnOsSemCreate staticvoid taskLED void while 1 tnOsSemPend 二 嵌入式基础知识 当使用操作系统时 如果将这些 可执行的程序单元 进行分类 即可得到在操作系统调度下的 用户任务 简称任务 Task 当任务 独占 CPU的运行期间 则一个任务看不见另一个任务 也就是说 一个任务不可能象调用 子程序 那样调用另一个任务 因此任务之间的信息传递只能通过 异步 的方式来完成 即由操作系统的各种 通信 机制来实现 比如 信号量 Semaphore 与消息邮箱 MessagePostbox 等 并发性 Concurrent 与调度 Scheduling 简单应用的典型设计为顺序运行 一次执行一条指令 按预先设定的顺序运行 然而这种模式对于嵌入式实时应用是不合适的 因为通常要在紧密的时间约束内处理多个输入和输出 假设在多CPU系统中 每个任务都有自己的CPU 那么它们的运行状态就是真正的 并发运行 并发性 Concurrent 与调度 Scheduling 并发性 Concurrent 与调度 Scheduling 任务状态 任务之间的关系 任务同步 Synchronization 任务间的同步是一种直接作用 任务同步 是指系统中的多个任务之间存在某种时序关系 需要相互协作才能共同完成一项任务 比如 一个任务运行到某一时间点时 要求另一个任务为它提供消息 在未获得消息之前 该任务处于阻塞状态 获得消息后被唤醒进入就绪状态 任务互斥 Exclusion 任务间的互斥是一种间接作用 由于内存中的多个任务要求共享某一资源 而有些资源必须互斥 因此各任务之间只能竞争使用这些资源 任务间的互斥 是指当有若干任务都要使用某一共享资源时 最多允许一个任务使用 而其它要使用该资源的任务必须阻塞 直到占有该资源的任务释放为止 比如 当有人使用厕所时 则其它人都不能使用 直到当前使用者出来后 其他人才能使用 临界资源 CriticalResources 与临界区 CriticalSection 任务间的互斥涉及到共享资源的竞争使用 因此竞争使用这些资源的任务在执行使用这些资源的程序时也会受到一定的限制 从而也就引出了临界资源与临界区的概念 1 临界资源在操作系统中将一次只允许一个任务使用的资源称之为临界资源 2 临界区在操作系统中将并发任务中访问临界资源的程序称之为临界区 临界区也常常叫做互斥区 上下文切换 ContextSwitch 可重入性 Reentrant 由于任务的并发性 因此经常会出现调用同一个函数的情况 如果一段程序可以被多个任务同时调用 而不必担心数据被破坏 那么这样的程序就是可重入的程序 一般来说 具有可重入性的函数应该只使用局部变量 因为函数的局部变量保持在CPU内部的寄存器或堆栈中 所以可以保证不同的任务调用同一个函数时不会发生冲突 如果函数一定要使用全局变量的话 那么一定要对使用的全局变量进行必要的保护 由此可见 C编译器也应该具有产生可重入代码的能力 成于大气信达天下 当前PC 指令代码 单片机工作机制 子程序调用及返回指令 长调用 LCALLaddr16 三字节指令 在调用子程序之前 保护断点地址 几条重要的汇编语言 绝对调用 ACALLaddr11 双字节指令 在调用子程序之前 保护断点地址 子程序返回 RET 单字节指令 中断返回 RETI 单字节指令 0 触发器 优先级状态 PC例程讲解 a Delay b setjmp与longjmp的实现 本书所有例子均是基于SDCC51编译器来实现的 为了提高兼容性 所以SDCC51提供的库函数都很复杂 为了简化这两个函数 于是约定以下规则 限定SDCC51为小模式 model small 限定SDCC51的integer和long库被编译成可重入的 int long reent 限定SDCC51所有函数被编译成可重入的 stack auto 修改setjmp与longjmp的返回值为char 取消longjmp的第2个参数 当调用longjmp时 则让setjmp的返回值始终为1 由于制定了以上规则 则完全可以使用C语言来编写setjmp和longjmp了 1 jmp bufjmp buf定义 setjmp h define SP SIZE1 堆栈指针长度 define BP SIZE SP SIZE 编译器虚拟的寄存器 用于重入 define RET SIZE2 返回地址长度 typedefunsignedcharjmp buf RET SIZE SP SIZE BP SIZE 2 setjmpsetjmp就是将相应的寄存器和setjmp的返回地址保存到jmp buf数组类型的变量中 即保存的寄存器只有变量bp的当前值 堆栈指针的当前值 SP 和返回地址addr15 addr0 对于80C51系列单片机来说 由于调用函数是使用ACALL或LCALL来指令实现的 因此这些指令会将函数的返回地址 两个字节 保存在堆栈中 由于setjmp不需要在堆栈中保存其它的数据 因此可以用程序清单5 7 46 和程序清单5 7 47 保存返回地址 根据约定函数最后返回0 setjmp 定义详见程序清单5 7 39charsetjmp jmp bufjbBuf 40 41dataunsignedchar pucBuf datavoid 0 42 指向上下文信息存储位置的指针 43pucBuf dataunsignedchar jbBuf 44 pucBuf bp 保存bp的当前值 45 pucBuf SP 保存sp的当前值 pucBuf unsignedchardata SP 保存返回地址的高8位 47 pucBuf unsignedchardata char SP 1 保存返回地址的低8位 48return0 49 3 longjmplongjmp 定义如程序清单5 8所示 首先从参数jbBuf中恢复bp的值 并从jbBuf中取出堆栈指针的原始值保存到ucSpSave变量中 然后将返回地址保存到ucSpSave指向的位置 接着将当前堆栈指针设置为ucSpSave的值 最后函数返回1 58charlongjmp jmp bufjbBuf 59 60unsignedcharucSpSave 保存的堆栈指针 dataunsignedchar pucBuf datavoid 0 指向上下文信息存储位置的指针 63pucBuf dataunsignedchar jbBuf 64bp pucBuf 恢复bp 65ucSpSave pucBuf 读取堆栈指针 unsignedchardata ucSpSave pucBuf 恢复返回地址的高8位 67 unsignedchardata char ucSpSave 1 pucBuf 恢复返回地址的低8位 68SP ucSpSave 恢复堆栈指针 69return1 70 范例分析setjmp与longjmp在后续的操作系统中起到了至关重要的作用 因此初学者必须搞清楚它们之间的关系 否则将无法掌握操作系统的设计思想和实现原理 下面将通过一个实例来说明setjmp与longjmp的具体作用 详见程序清单5 5 include29jmp bufjbTest 30unsignedcharucSum0 31unsignedcharucSum1 32unsignedcharucSum2 41voidfunc0 void 42 43ucSum0 44longjmp jbTest 1 ucSum0 程序始终不会执行到这里 46 55voidfunc1 void 程序始终

温馨提示

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

最新文档

评论

0/150

提交评论