版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电子实验中心电子实验中心 项目驱动项目驱动 -单片机应用设计技术单片机应用设计技术 电子实验中心电子实验中心 一、前后台系统与嵌入式系统的不同一、前后台系统与嵌入式系统的不同 设计:每按一次按键,发光二极管改设计:每按一次按键,发光二极管改 变一次状态。(电路略)变一次状态。(电路略) 1、前后台系统示例程序如下:、前后台系统示例程序如下: 沐风书苑沐风书苑 电子实验中心电子实验中心 Sbit LED = P11; Sbit KEY = P21; Void delay(unsigned int i) while(i-); Void main() while(1) if(KEY=0) 沐风书苑沐
2、风书苑 电子实验中心电子实验中心 delay(1000); if(KEY=0) LED != LED; while(KEY=0); 沐风书苑沐风书苑 电子实验中心电子实验中心 vTinyOS示例程序如下:示例程序如下: void main (void) static void _taskKEY(void); static void _taskLED(void); _timer0Init(); tnOsInit(); tnOsTaskCreate(_taskKEY, _GucTaskStks0); tnOsTaskCreate(_taskLED, _GucTaskStks1); tnOsStar
3、t(); 沐风书苑沐风书苑 电子实验中心电子实验中心 v static void _taskKEY (void) v v tnOsSemCreate( v while (1) v while (KEY != 0) v v tnOsTimeDly(TICKS_PER_SEC / 100); v v tnOsSemPost( v while ( KEY = 0) v v tnOsTimeDly(TICKS_PER_SEC / 100); v v v 沐风书苑沐风书苑 电子实验中心电子实验中心 vstatic void _taskLED (void) v v while (1) v v tnOsSe
4、mPend( v LED != LED; v v 沐风书苑沐风书苑 电子实验中心电子实验中心 二、嵌入式基础知识二、嵌入式基础知识 当使用操作系统时,如果将这些当使用操作系统时,如果将这些“可执可执 行的程序单元行的程序单元”进行分类,即可得到在操作进行分类,即可得到在操作 系统调度下的系统调度下的“用户任务用户任务”,简称任务,简称任务 (Task)。当任务)。当任务“独占独占”CPU 的运行期间,的运行期间, 则一个任务看不见另一个任务,也就是说,则一个任务看不见另一个任务,也就是说, 一个任务不可能象调用一个任务不可能象调用“子程序子程序”那样调用那样调用 另一个任务,因此任务之间的信息
5、传递只能另一个任务,因此任务之间的信息传递只能 通过通过“异步异步”的方式来完成,即由操作系统的方式来完成,即由操作系统 的各种的各种“通信通信”机制来实现,比如,机制来实现,比如,信号量信号量 (Semaphore)与消息邮箱()与消息邮箱(Message Postbox)等。等。 沐风书苑沐风书苑 电子实验中心电子实验中心 并发性(并发性(Concurrent)与调度()与调度(Scheduling v 简单应用的典型设计为顺序运行,一简单应用的典型设计为顺序运行,一 次执行一条指令,按预先设定的顺序运行,次执行一条指令,按预先设定的顺序运行, 然而这种模式对于嵌入式实时应用是不合然而这种
6、模式对于嵌入式实时应用是不合 适的,因为通常要在紧密的时间约束内处适的,因为通常要在紧密的时间约束内处 理多个输入和输出,假设在多理多个输入和输出,假设在多CPU 系统中,系统中, 每个任务都有自己的每个任务都有自己的CPU,那么它们的运,那么它们的运 行状态就是真正的行状态就是真正的“并发运行并发运行”。 沐风书苑沐风书苑 电子实验中心电子实验中心 并发性(并发性(Concurrent)与调度()与调度(Scheduling) 沐风书苑沐风书苑 电子实验中心电子实验中心 并发性(并发性(Concurrent)与调度()与调度(Scheduling) 沐风书苑沐风书苑 电子实验中心电子实验中心
7、 任务状态任务状态 沐风书苑沐风书苑 电子实验中心电子实验中心 任务之间的关系任务之间的关系 任务同步(任务同步(Synchronization) 任务间的同步是一种直接作用,任务间的同步是一种直接作用,“任务同步任务同步”是指系统中的是指系统中的 多个任务之间存在某种时序关系,需要相互协作才能共同完成一多个任务之间存在某种时序关系,需要相互协作才能共同完成一 项任务。比如,一个任务运行到某一时间点时,要求另一个任务项任务。比如,一个任务运行到某一时间点时,要求另一个任务 为它提供消息,在未获得消息之前,该任务处于阻塞状态,获得为它提供消息,在未获得消息之前,该任务处于阻塞状态,获得 消息后被
8、唤醒进入就绪状态。消息后被唤醒进入就绪状态。 任务互斥(任务互斥(Exclusion) 任务间的互斥是一种间接作用,由于内存中的多个任务要求任务间的互斥是一种间接作用,由于内存中的多个任务要求 共享某一资源,而有些资源必须互斥,因此各任务之间只能竞争共享某一资源,而有些资源必须互斥,因此各任务之间只能竞争 使用这些资源。使用这些资源。“任务间的互斥任务间的互斥”是指当有若干任务都要使用某是指当有若干任务都要使用某 一共享资源时,最多允许一个任务使用,而其它要使用该资源的一共享资源时,最多允许一个任务使用,而其它要使用该资源的 任务必须阻塞,直到占有该资源的任务释放为止。比如,当有人任务必须阻塞
9、,直到占有该资源的任务释放为止。比如,当有人 使用厕所时,则其它人都不能使用,直到当前使用者出来后,其使用厕所时,则其它人都不能使用,直到当前使用者出来后,其 他人才能使用。他人才能使用。 沐风书苑沐风书苑 电子实验中心电子实验中心 临界资源(临界资源(Critical Resources)与临界区()与临界区(Critical Section) 任务间的互斥涉及到共享资源的竞争使用,因任务间的互斥涉及到共享资源的竞争使用,因 此竞争使用这些资源的任务在执行使用这些资源的程此竞争使用这些资源的任务在执行使用这些资源的程 序时也会受到一定的限制,从而也就引出了临界资源序时也会受到一定的限制,从而
10、也就引出了临界资源 与临界区的概念。与临界区的概念。 (1)临界资源)临界资源 在操作系统中将一次只允许一个任务使用的资源称之在操作系统中将一次只允许一个任务使用的资源称之 为临界资源。为临界资源。 (2)临界区)临界区 在操作系统中将并发任务中访问临界资源的程序称之在操作系统中将并发任务中访问临界资源的程序称之 为临界区,临界区也常常叫做互斥区。为临界区,临界区也常常叫做互斥区。 沐风书苑沐风书苑 电子实验中心电子实验中心 上下文切换(上下文切换(Context Switch) 沐风书苑沐风书苑 电子实验中心电子实验中心 可重入性(可重入性(Reentrant) 由于任务的并发性,因此经常会
11、出现调用同一个由于任务的并发性,因此经常会出现调用同一个 函数的情况,如果一段程序可以被多个任务同时调用,函数的情况,如果一段程序可以被多个任务同时调用, 而不必担心数据被破坏,那么这样的程序就是可重入而不必担心数据被破坏,那么这样的程序就是可重入 的程序。的程序。 一般来说,具有可重入性的函数应该只使用局部一般来说,具有可重入性的函数应该只使用局部 变量,因为函数的局部变量保持在变量,因为函数的局部变量保持在CPU 内部的寄存内部的寄存 器或堆栈中,所以可以保证不同的任务调用同一个函器或堆栈中,所以可以保证不同的任务调用同一个函 数时不会发生冲突。如果函数一定要使用全局变量的数时不会发生冲突
12、。如果函数一定要使用全局变量的 话,那么一定要对使用的全局变量进行必要的保护。话,那么一定要对使用的全局变量进行必要的保护。 由此可见,由此可见,C 编译器也应该具有产生可重入代码的能编译器也应该具有产生可重入代码的能 力。力。 沐风书苑沐风书苑 电子实验中心电子实验中心 成于大气成于大气 信达天下信达天下 程序存储区 2040H 83 2121H 45 2041H 2120H 47 当前PC 指令代码 单片机工作机制单片机工作机制 沐风书苑沐风书苑 电子实验中心电子实验中心 子程序调用及返回指令子程序调用及返回指令 长调用长调用 LCALL addr16 ;PC addr16 addr158
13、 12H 机器码机器码 addr70 三字节指令三字节指令 ;PC (PC)+3 ;SP (SP)+1, (SP) PC70 ;SP (SP)+1, (SP) PC158 ;在调用子程序之前,保护断点地址在调用子程序之前,保护断点地址 几条重要的汇编语言几条重要的汇编语言 沐风书苑沐风书苑 电子实验中心电子实验中心 绝对调用绝对调用 ACALL addr11 双字节指令双字节指令 ; PC (PC)+ 2 ; SP (SP)+1, (SP) PC70 ; SP (SP)+1, (SP) PC158 ; 在调用子程序之前,保护断点地址在调用子程序之前,保护断点地址 A10A9A810001 A7
14、 A0 机器码机器码 ; PC100 A100 沐风书苑沐风书苑 电子实验中心电子实验中心 子程序返回子程序返回 RET ; PC158 (SP) , SP (SP) - 1 22H 机器码机器码 单字节指令单字节指令 中断返回中断返回 RETI 32H 机器码机器码 单字节指令单字节指令 ; PC70 (SP) , SP (SP) - 1 ; PC158 (SP) , SP (SP) - 1 ; PC70 (SP) , SP (SP) - 1 “0”触发触发 器器 优先级优先级 状态状态 沐风书苑沐风书苑 电子实验中心电子实验中心 vPC例程讲解例程讲解 。 。 a+; Delay();()
15、; b+; 。 。 沐风书苑沐风书苑 电子实验中心电子实验中心 setjmp 与与longjmp 的实现的实现 本书所有例子均是基于本书所有例子均是基于SDCC51 编译器来实现的,为了编译器来实现的,为了 提高兼容性,所以提高兼容性,所以SDCC51 提供的库函数都很复杂。为了简提供的库函数都很复杂。为了简 化这两个函数,于是约定以下规则:化这两个函数,于是约定以下规则: 1. 限定限定SDCC51 为小模式为小模式(-model-small); 2. 限定限定SDCC51 的的 integer 和和long 库被编译成可重入的库被编译成可重入的 (- int-long-reent); 3.
16、 限定限定SDCC51 所有函数被编译成可重入的所有函数被编译成可重入的(-stack-auto); 4. 修改修改setjmp 与与longjmp 的返回值为的返回值为char; 5. 取消取消longjmp 的第的第2 个参数,当调用个参数,当调用longjmp 时,则让时,则让 setjmp 的返回值始终为的返回值始终为1。 由于制定了以上规则,则完全可以使用由于制定了以上规则,则完全可以使用C 语言来编写语言来编写 setjmp 和和longjmp 了。了。 沐风书苑沐风书苑 电子实验中心电子实验中心 (1)jmp_buf jmp_buf 定义定义(setjmp.h) #define
17、_SP_SIZE 1 /*堆栈指针长度堆栈指针长度 */ #define _BP_SIZE _SP_SIZE /*编译器虚拟的寄存器,用于重入编译器虚拟的寄存器,用于重入*/ #define _RET_SIZE 2 /*返回地址长度返回地址长度 */ typedef unsigned char jmp_buf_RET_SIZE + _SP_SIZE + _BP_SIZE; 沐风书苑沐风书苑 电子实验中心电子实验中心 (2)setjmp setjmp 就是将相应的寄存器和就是将相应的寄存器和setjmp 的返回地的返回地 址保存到址保存到jmp_buf 数组类型的变量中,即保存的寄存数组类型的变
18、量中,即保存的寄存 器只有变量器只有变量bp 的当前值、堆栈指针的当前值(的当前值、堆栈指针的当前值(SP) 和返回地址和返回地址addr15addr0。对于。对于80C51 系列单片机系列单片机 来说,由于调用函数是使用来说,由于调用函数是使用ACALL 或或LCALL 来指令来指令 实现的,因此这些指令会将函数的返回地址实现的,因此这些指令会将函数的返回地址(两个字两个字 节节)保存在堆栈中。保存在堆栈中。 由于由于setjmp 不需要在堆栈中保存其它的数据,因此不需要在堆栈中保存其它的数据,因此 可以用程序清单可以用程序清单5.7(46)和程序清单和程序清单5.7(47)保存返回保存返回
19、 地址,根据约定函数最后返回地址,根据约定函数最后返回0,setjmp()定义详见定义详见 程序清单程序清单5.7。 沐风书苑沐风书苑 电子实验中心电子实验中心 39 char setjmp (jmp_buf jbBuf) 40 41 data unsigned char *pucBuf = (data void*)0; 42 /* 指向上下文信息存储位置的指针指向上下文信息存储位置的指针 */ 43 pucBuf = (data unsigned char *)jbBuf; 44 *pucBuf+ = bp; /* 保存保存bp 的当前值的当前值 */ 45 *pucBuf+ = SP; /
20、* 保存保存sp 的当前值的当前值 */ 46 *pucBuf+ = *(unsigned char data *)SP); /* 保存返回地址的高保存返回地址的高8 位位 */ 47 *pucBuf = *(unsigned char data *)(char)(SP - 1); /* 保存返回地址的低保存返回地址的低8 位位 */ 48return 0; 49 沐风书苑沐风书苑 电子实验中心电子实验中心 (3)longjmp longjmp()定义如程序清单定义如程序清单5.8 所示,所示, 首先从参数首先从参数jbBuf 中恢复中恢复bp 的值,并从的值,并从 jbBuf 中取出堆栈指针
21、的原始值保存到中取出堆栈指针的原始值保存到 ucSpSave 变量中,然后将返回地址保存变量中,然后将返回地址保存 到到ucSpSave 指向的位置,接着将当前堆指向的位置,接着将当前堆 栈指针设置为栈指针设置为ucSpSave 的值,最后函数的值,最后函数 返回返回1。 沐风书苑沐风书苑 电子实验中心电子实验中心 58 char longjmp (jmp_buf jbBuf) 59 60 unsigned char ucSpSave; /* 保存的堆栈指针保存的堆栈指针 */ 61 data unsigned char *pucBuf = (data void *)0; /* 指向上下文信息
22、存储位置的指针指向上下文信息存储位置的指针 */ 63 pucBuf = (data unsigned char *)jbBuf; 64 bp = *pucBuf+; /* 恢复恢复bp */ 65 ucSpSave = *pucBuf+; /* 读取堆栈指针读取堆栈指针 */ 66 *(unsigned char data *)ucSpSave) = *pucBuf+; 67 /* 恢复返回地址的高恢复返回地址的高8 位位 */ 67 *(unsigned char data *)(char)(ucSpSave - 1)= *pucBuf; /* 恢复返回地址的低恢复返回地址的低8 位位 */ 68 SP = ucSpSave; /* 恢复堆栈指针恢复堆栈指针 */ 69 return 1; 70 沐风书苑沐风书苑 电子实验中心电子实验中心 范例分析范例分析 setjmp 与与longjmp 在后续的操作系统中起到在后续的操作系统中起到 了至关重要的作用,因此初学者必须搞清楚它们了至关重要的作用,因此初
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年数据隐私保护与赔偿协议
- 2024年度影视制作合同:电视剧《时代先锋》的制作与发行
- 2024年摄影作品版权转让合同
- 2024年新式知识产权质押协议
- 2024年新建办公楼工程竣工验收合同
- 2024年数据驱动营销合作合同
- 2024年房地产开发商与建筑公司工程承包合同
- 2024年教育机构教室出租合同
- 美术信息技术2.0教研计划(11篇)
- 2024年北京房产交易合同参考样式
- 国开(甘肃)2024年春《地域文化(专)》形考任务1-4终考答案
- 档案整理及数字化服务方案(技术标 )
- 公路铣刨机整机的设计含全套CAD图纸
- 机器人学课程教学大纲
- 浙江世贸君澜酒店集团介绍
- GHTF—质量管理体系--过程验证指南中文版
- 铝及铝合金焊接作业指导书
- 水利工程质量与安全监督工作实务PPT课件
- 放射性口腔粘膜炎的发病机制及危险因素
- 加油站特殊作业安全管理制度(完整版)
- 质量风险抵押金管理办法
评论
0/150
提交评论