基于页的8051多任务模型
时间:09-25
来源:互联网
点击:
随着8051微控制器性能的不断提高,使用多任务操作系统对单片机进行资源管理已成为当代开发的需要。由于受静态链接的限制,8051系统的多任务开发需要处理代码重入(reentrance)的问题。
为了实现重入,通常可以利用Keil C51的关键字reentrant,将函数声明为重人类型。通过在重入堆栈分配局部变量,使函数具有可重入性;但该重入方案的实时性较差。
为提高多任务系统的实时性,本文介绍一种新方案——基于页的多任务模型。
1 重入函数的原理与不足
当使用Kcil C51的关键字reentrant来指定函数届性时,即得重入函数(reentrant function)。
1.1 重入函数的原理
重入函数的原理是Keil C编译器建立一个软件操作的重入堆栈。重入函数能自动为不同的调用者在重入堆栈中分配独立局部变量,使函数具备重入性。
变量分配过程如图l所示,函数人口首先申请存储空间。函数返回前,必须将所申请的存储空间归还。变量分配和回收的位置都是重入堆栈的栈顶。
1.2 重入函数的不足
重入堆栈的最大缺点为效率低,Keil C51用户手册中已有明确记载。
由图l可作以下分析:首先,每次使用局部变量都需要计算变量地址,大大降低了变量存取速度,也消耗了处理器时间;其次,因为重入堆栈是纯软件实现的,因此反复进行的堆栈操作使重入函数的实时性进一步恶化。
2 基于页的多任务模型原理与实现
2.1 原理
解决函数重入的关键在于局部变量的分配,可以从8051存储器类型的分析和选择入手。
8051控制器能直接寻址的存储器类型很丰富。在这些类型中,我们注意到了页变量(pdata)及其与众不同的特性。
(1)页变量pdata
根据Intel公司的用户手册,805l的页存储器就是指单字节地址方式操作的外部存储器。使用单字节地址方式时,允许使用P2对外部数据来分页,该方式的操作指令为“MOVX@Ri”。指令中R0或R1提供页内地址(低8位地址),P2寄存器隐藏地提供页地址(高8位地址)。
单字节地址方式将8051的64 KB外部存储器分成256个页面,如图2所示。其硬件特征如下:①系统的256个页面的存储结构完全一致;②工作页面可以被指定为这256页中的任意一页;③页地址由P2隐式提供给地址总线,且页地址可以由程序修改。
工具方面,Keil C51专用关键字pdata表示单字节方式寻址的外部数据类型,pdata变量即页变量。编译后的页变量具有以下特性:①页变量操作严格对应单字节地址方式;②页变量全部转换成了静态页内地址。
(2)页函数
根据页变量性质,只要函数的所有局部变量都被指定为页变量类型,那么,函数所生成的代码就可以工作于系统任一页面上。
当操作系统为一个函数分配多个页面时,该函数与每一个页面上的局部变量均构成一个进程。
与重入函数不同,这类函数本身不能自动分配变量,因此没有重入性。只有在操作系统的协助下,为其分配工作页后,页函数才是可重入的。页函数中变量使用静态地址,因此其存取速度得到大幅提升,改善了系统的实时性。
为区别Keil C51定义的重入函数(reentrant func-tion),我们称这种只使用页变量的函数为“基于页的重入函数(page-based reentrant function)”,简称为“页函数”。
2.2 实现
根据原理分析中的可行性,笔者设计了名为Celia的基于页的占先式8051多任务调度内核。沿用μC/OS-II的结构框图与处理流程,在TCB(Task Control Block,任务控制块)中增加一个字节的页面字段,并改写了部分程序。有μC/OS-II为参照,使该调度内核的设计可以很快完成。经过在以W78P438为核心的平台上实测,该系统调度正常,程序运行正确。这证明该重入方案可行。
3 基于页的多任务模型性能分析
基于页的多任务模型的程序结构与μC/OS-II基本一致,其区别主要是页函数与重入函数的区别,因此,这里主要分析页变量存取与重入堆栈变量存取的性能对比。
3.1 优点
(1)更高的变量存取带宽
8051为8位总线接口,单字节存取是其基本操作。研究单字节变量的存取带宽可以从根本上说明页变量的优点。
805l系统操作外部存储器使用的是MOVX指令。执行该指令需要2个机器周期。在标准8051中,1个机器周期为12/fOSC,则总线带宽如式(1)所示。其中fOSC为晶振频率。
如图l,重入函数操作单字节变量i=0xaa,共需要15个机器周期。其中仅计算变量地址就需要12个机器周期。因此,重入堆栈的实际存取带宽如式(2)所示。
相对地,页函数中变量地址是确定的。因为不需要计算地址的额外操作,其变量操作速度比重入堆栈有大幅提高。如图3所示,页函数中操作单字节变量只需要4个机器周期。页变最的实际存取带宽如式(3):
各种带宽的对比如下:
进一步分析可知,操作多字节变量时,重入函数也只需要计算一次变量地址。故进行单字节变量存取时,重入堆栈的存取带宽就是最低值。
综上所述,相对重入堆栈,存取单字节变量过程中,页函数的带宽加速比达到最大值Rmax=3.75,如式(4)所示。这表示相对于过去的重入函数,页函数具有更高的执行效率和实时性。
另外,如果页函数不需要计算和操作重入堆栈指针,则不需要图1中函数入口和出口处的指针操作(C?ADDXBP),可再次节省22个(首尾各11)指令周期。
为了实现重入,通常可以利用Keil C51的关键字reentrant,将函数声明为重人类型。通过在重入堆栈分配局部变量,使函数具有可重入性;但该重入方案的实时性较差。
为提高多任务系统的实时性,本文介绍一种新方案——基于页的多任务模型。
1 重入函数的原理与不足
当使用Kcil C51的关键字reentrant来指定函数届性时,即得重入函数(reentrant function)。
1.1 重入函数的原理
重入函数的原理是Keil C编译器建立一个软件操作的重入堆栈。重入函数能自动为不同的调用者在重入堆栈中分配独立局部变量,使函数具备重入性。
变量分配过程如图l所示,函数人口首先申请存储空间。函数返回前,必须将所申请的存储空间归还。变量分配和回收的位置都是重入堆栈的栈顶。
1.2 重入函数的不足
重入堆栈的最大缺点为效率低,Keil C51用户手册中已有明确记载。
由图l可作以下分析:首先,每次使用局部变量都需要计算变量地址,大大降低了变量存取速度,也消耗了处理器时间;其次,因为重入堆栈是纯软件实现的,因此反复进行的堆栈操作使重入函数的实时性进一步恶化。
2 基于页的多任务模型原理与实现
2.1 原理
解决函数重入的关键在于局部变量的分配,可以从8051存储器类型的分析和选择入手。
8051控制器能直接寻址的存储器类型很丰富。在这些类型中,我们注意到了页变量(pdata)及其与众不同的特性。
(1)页变量pdata
根据Intel公司的用户手册,805l的页存储器就是指单字节地址方式操作的外部存储器。使用单字节地址方式时,允许使用P2对外部数据来分页,该方式的操作指令为“MOVX@Ri”。指令中R0或R1提供页内地址(低8位地址),P2寄存器隐藏地提供页地址(高8位地址)。
单字节地址方式将8051的64 KB外部存储器分成256个页面,如图2所示。其硬件特征如下:①系统的256个页面的存储结构完全一致;②工作页面可以被指定为这256页中的任意一页;③页地址由P2隐式提供给地址总线,且页地址可以由程序修改。
工具方面,Keil C51专用关键字pdata表示单字节方式寻址的外部数据类型,pdata变量即页变量。编译后的页变量具有以下特性:①页变量操作严格对应单字节地址方式;②页变量全部转换成了静态页内地址。
(2)页函数
根据页变量性质,只要函数的所有局部变量都被指定为页变量类型,那么,函数所生成的代码就可以工作于系统任一页面上。
当操作系统为一个函数分配多个页面时,该函数与每一个页面上的局部变量均构成一个进程。
与重入函数不同,这类函数本身不能自动分配变量,因此没有重入性。只有在操作系统的协助下,为其分配工作页后,页函数才是可重入的。页函数中变量使用静态地址,因此其存取速度得到大幅提升,改善了系统的实时性。
为区别Keil C51定义的重入函数(reentrant func-tion),我们称这种只使用页变量的函数为“基于页的重入函数(page-based reentrant function)”,简称为“页函数”。
2.2 实现
根据原理分析中的可行性,笔者设计了名为Celia的基于页的占先式8051多任务调度内核。沿用μC/OS-II的结构框图与处理流程,在TCB(Task Control Block,任务控制块)中增加一个字节的页面字段,并改写了部分程序。有μC/OS-II为参照,使该调度内核的设计可以很快完成。经过在以W78P438为核心的平台上实测,该系统调度正常,程序运行正确。这证明该重入方案可行。
3 基于页的多任务模型性能分析
基于页的多任务模型的程序结构与μC/OS-II基本一致,其区别主要是页函数与重入函数的区别,因此,这里主要分析页变量存取与重入堆栈变量存取的性能对比。
3.1 优点
(1)更高的变量存取带宽
8051为8位总线接口,单字节存取是其基本操作。研究单字节变量的存取带宽可以从根本上说明页变量的优点。
805l系统操作外部存储器使用的是MOVX指令。执行该指令需要2个机器周期。在标准8051中,1个机器周期为12/fOSC,则总线带宽如式(1)所示。其中fOSC为晶振频率。
如图l,重入函数操作单字节变量i=0xaa,共需要15个机器周期。其中仅计算变量地址就需要12个机器周期。因此,重入堆栈的实际存取带宽如式(2)所示。
相对地,页函数中变量地址是确定的。因为不需要计算地址的额外操作,其变量操作速度比重入堆栈有大幅提高。如图3所示,页函数中操作单字节变量只需要4个机器周期。页变最的实际存取带宽如式(3):
各种带宽的对比如下:
进一步分析可知,操作多字节变量时,重入函数也只需要计算一次变量地址。故进行单字节变量存取时,重入堆栈的存取带宽就是最低值。
综上所述,相对重入堆栈,存取单字节变量过程中,页函数的带宽加速比达到最大值Rmax=3.75,如式(4)所示。这表示相对于过去的重入函数,页函数具有更高的执行效率和实时性。
另外,如果页函数不需要计算和操作重入堆栈指针,则不需要图1中函数入口和出口处的指针操作(C?ADDXBP),可再次节省22个(首尾各11)指令周期。
- 单片机智能频率信号装置(11-25)
- 单片机在医学信号检测仪中的应用(02-07)
- 单片机应用编程技巧(02-25)
- DSP与单片机通信的多种方案设计(03-08)
- 单片机与PC机串行通信的实现方法 (02-25)
- 单片机与PC通信的简化接口 (05-11)