基于页的8051多任务模型
发布时间:2008/8/16 0:00:00 访问次数:560
从变量存取带宽的角度,将该模型与重入堆栈方案进行对比,确定新模型中变量存取速度可获得最高为3.75倍的提升;最后列出一些设计上的限制及对策。
随着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对外部数据来分页,该方式的操作指令。指令中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)更高的变量存取
从变量存取带宽的角度,将该模型与重入堆栈方案进行对比,确定新模型中变量存取速度可获得最高为3.75倍的提升;最后列出一些设计上的限制及对策。
随着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对外部数据来分页,该方式的操作指令。指令中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)更高的变量存取