C8051F120代码超过64K后的分页处理
- 格式:pdf
- 大小:1.29 MB
- 文档页数:19
系统内存蓝屏的错误代码大全系统内存蓝屏的错误代码大全0 0x00000000 作業完成。
1 0x00000001 不正确的函數。
2 0x00000002 系統找不到指定的檔案。
3 0x00000003 系統找不到指定的路徑。
4 0x00000004 系統無法開啓檔案。
5 0x00000005 拒絕存取。
6 0x00000006 無效的代碼。
7 0x00000007 儲存體控制區塊已毀。
8 0x00000008 儲存體空間不足,無法處理這個指令。
9 0x00000009 儲存體控制區塊地址無效。
10 0x0000000A 環境不正确。
11 0x0000000B 嘗試加載一個格式錯誤的程序。
12 0x0000000C 存取碼錯誤。
13 0x0000000D 資料錯誤。
14 0x0000000E 儲存體空間不夠,無法完成這項作業。
15 0x0000000F 系統找不到指定的磁盤驅動器。
16 0x00000010 無法移除目錄。
16 0x00000010 無法移除目錄。
17 0x00000011 系統無法将檔案移到其它的磁盤驅動器。
18 0x00000012 沒有任何檔案。
19 0x00000013 儲存媒體爲寫保護狀态。
20 0x00000014 系統找不到指定的裝置。
21 0x00000015 裝置尚未就緒。
22 0x00000016 裝置無法識别指令。
23 0x00000017 資料錯誤 (cyclic redundancy check)24 0x00000018 程序發出一個長度錯誤的指令。
25 0x00000019 磁盤驅動器在磁盤找不到持定的扇區或磁道。
26 0x0000001A 指定的磁盤或磁盤無法存取。
27 0x0000001B 磁盤驅動器找不到要求的扇區。
28 0x0000001C 打印機沒有紙。
29 0x0000001D 系統無法将資料寫入指定的磁盤驅動器。
30 0x0000001E 系統無法讀取指定的裝置。
巧用C-51的BANK编译模式朱咏梅(上海电子信息职业技术学院,上海200000)1引言随着C-51编译器被广泛地应用于51系列单片机软件的开发,大批的开发人员从繁琐的汇编语言编程中解放出来.C-51不仅缩短了软件的开发周期,而且使应用软件具有较好的结构性和可维护性.在使用C-51编译器的应用设计中,大多数程序代码都不超过51系列单片机的最大寻址空间64K,但在实际应用中也有程序代码超出64K的情况.这种情况虽然可以通过更换高档CPU来解决,但在产品批量较大且对CPU性能要求并不高时,不希望使用高档CPU,因为这样会增加产品的成本.那么能否在廉价的51系列单片机中突破代码64K空间的限制而进行产品的开发呢C-51编译器的BANK模式正是为了解决此问题.作者通过对C-51编译器BANK模式的使用,总结出一套该模式的使用方法.本文对这一使用方法进行说明,并对代码和数据混合使用BANK的特殊用法作了介绍.2BANK的工作方式C-51的BANK模式对应用系统的代码存储器结构有特殊要求.图1为C-51BANK模式下代码存储器的物理结构.代码地址空间的上半部,以重叠BANK0的物理地址空间,硬件设计了n个存储器页面来存储程序代码.在任一时刻BANK0~n中,只能有一个BANK处于激活状态.当BANKi处于激活状态时,其物理地址空间为BankBaseAddr~0xFFFF.只有当BANK处于激活状态时,BANK中的程序代码才可以运行.为了寻址任意BANK中的过程代码,C-51编译器为过程调用生成了如下的BANK地址:Base地址是可变的,但为译码方便,一般选为8000H.当某过程调用任一不在同一BANK中的其它过程时,BANK地址中的BANK NUMBER被送到切换BANK的译码电路,而16位的偏移地址被送往地址总线,从而实现不同BANK中的过程调用.下半部分的代码空间没有作BANK处理,它被称为ROOTBANK.这是因为C-51编译器仅对过程调用产生BANK地址,而对于过程调用之外的所有其它部分如CONST等不产生BANK地址,ROOTBANK即用来存放这部分代码.除此之外,ROOTBANK一般还用来存放下列代码:C-51的库函数,所有的变量初始化数据,中断服务程序代码,CSTARTUP代码.编译器总是以NON BANK方式对这一类代码进行操作.3使用C-51BANK模式的步骤假设软件已经按C-51的大模式进行了设计,那么为了使用C-51的BANK模式,要进行以下3个步骤的工作.3.1设计硬件C-51的BANK模式需要硬件来支持.硬件必须设计适当的译码电路来支持存储器的页面结构.尽管C-51编译系统可支持256个存储器BANK页面,但一般的应用系统4个~8个存储器页面即可满足设计要求.在确定了所需存储器页面的个数后,BANK页面的译码地址位也就确定了.假设译码的地址为n位,那么n与BANK页面数的关系满足式(1).2n≥最大所需的BANK页面数n取最小值(1)支持页面结构存储器的译码电路,因使用存储器芯片的空间大小和片数多少的不同而不同.对于n位译码地址的锁存,则有两种方法,最为简单的方法是直接使用CPU多余的口线,若没有多余的口线可用,则需要使用第二种方法,即扩展锁存器对BANK译码地址进行锁存,这时锁存器的锁存地址既可以使用外部RAM空间译码产生,也可以用外部ROM空间译码产生,如使用ROM空间译码产生,要注意地址不能与代码可能占用的地址空间冲突.3.2写BANK模式的源程序C-51BANK模式下的源程序与大模式下的源程序没有太大区别,只是在BANK模式下要注意以下几点:(1)合理规划代码空间规划代码空间就是决定哪一部分代码放在ROOTBANK中,哪一部分代码放在BANK中.前面已经提到,有几种类型代码是必须放在ROOTBANK中的,而对于其它代码来说,既可以放在BANK中,也可以放在ROOTBANK,但为了提高系统的运行效率,对经常被调用的公共程序模块,应尽可能放在ROOTBANK中,以减少BANK的切换.而对于用汇编语言编写的程序模块,如果将其放在BANK中,则需要人工在汇编程序中添加对BANK切换的操作,这项工作非常繁琐,因此用汇编语言编写的程序模块,一般也放在ROOTBANK中.(2)检查源程序模块大小任一个C程序模块,在编译时都要生成一个CODE段,而linker不可能把一个模块的CODE分配到多个BANK中,因此每个程序模块的大小都必须小于或等于一个BANK空间,否则就要把一个程序模块分为两个或多个模块.只要不超出BANK的空间,linker可以把多个程序模块的代码放入一个BANK中,由此看出将每个程序模块最小化,便可以充分利用BANK的空间资源.(3)充分利用非BANK的调用在BANK模式中,当编译器不知道调用与被调用是否在同一个BANK时,就会按照BANK调用方式产生程序代码.但在下列4种情况中,编译器能够知道调用与被调用是否处在一个物理BANK中.这时编译器将产生空间少,速度快的非BANK调用的程序代码.第一种情况是,当调用与被调用过程在同一个源程序模块时,编译器可知道它们在同一个物理BANK中.这时编译器使用非BANK方式产生函数调用代码.第二种情况是,当过程被说明为static类型时,编译器认定所有对static过程的调用均在本程序模块中,编译器产生非BANK的调用方式.第三种情况是,对于被说明为interrupt的中断过程,编译器总是产生非BANK的调用方式对其调用,因中断过程总要放在ROOTBANK中.第四种情况是,根据BANK的分配情况,使用non banked编译条件对源程序中的过程进行说明,人为地控制编译器产生非BANK方式的调用.(4)检查汇编语言程序模块中是否有对BANK中过程的调用在由大模式程序向BANK模式转换时,要检查汇编语言程序中是否有对BANK中C过程的调用.如果汇编程序中有对C过程的调用,必须对调用进行改写,即增加对BANK切换的操作.3.3改变编译,链接开关和函数库3.3.1改变编译开关改变编译开关就是要修改makefike文件中的编译选项.这里要改变的就是将ml改为mb.对于放在ROOTBANK中的模块,其编译选项中还要增加一项RCODE.3.3.2改变链接开关改变链接开关要在.XCL文件中进行.首先在链接开关Z选项中增加RCODE,即:Z(CODE)INTVEC,RCODE,D_CDA TA,I_CDATA,CONST=0该开关用于列出除CODE段之外的所有段的排放次序.除了进行上面的修改外,还要增加如下的链接选项:A表示bank_number的起始值是0B表示bank的16位偏移地址起始值为8000HC表示CODE段应放入2000H字节长度的BANK中D表示bank_number应按0001H的步长增加E表示bank的16位偏移地址按0000H步长增加,这意味着对任意bank,其16位偏移地址总为8000H3.3.3改变库函数改变库函数就是将大模式下链接所需的库CL8051L.R03换成BANK模式的库函数CL8051B.R03.而最为重要的就是改写CL8051B.R03中的L18.S03汇编语言模块.该程序模块是BANK工作模式下实现BANK切换的核心.它完成将bank number送到BANK切换的译码电路.这个模块要根据具体的译码电路进行改写.4代码和数据的混合BANK技术有一些应用程序,不仅程序代码超过64K,而且还有大量的常数数据,笔者在开发带拼字检查的电动打字机时就遇到了这种情况.该打字机为了对打出的单词进行正确性检查,必须附带一个词典.词典必须占用ROM空间,所以也必须为词典分配BANK页面.然而,C-51的BANK编译模式中无法解决问题.为此采用代码和数据混合的BANK技术.该技术的操作步骤如下: (1)不考虑数据BNAK的存在,仅对程序代码进行BANK方式处理.但要注意,将对数据直接操作的过程模块定位在ROOTBANK中,而对于间接操作数据的过程即可放在ROOTBANK中,也可放在BANK中.(2)查看链接后的MAP文件.检查系统自动为代码分配的BANK页面占用情况,由此确定将数据定位在未被系统占用的BANK页面中.(3)根据数据被定位的BANK页面,改写直接操作数据的过程.在此过程里程序可直接激活所需要的数据页.(4)重新对程序进行编译链接.5结束语C-51的BANK模式由于突破了51系列单片机的64K程序空间的限制,因此具有较高的实用价值.采用这一技术,能够在较低成本下开发本来要用高档CPU才能完成的产品.由于大大降低了产品成本,必然能够为产品带来较高的经济效益.因此该技术具有推广应用价值.【资料】【短信】【引用】【编辑】C8051 F12X中多bank的分区跳转处理在8051核单片机庞大的家族中,C8051F系列作为其中的后起之秀,是目前功能最全、速度最快的8051衍生单片机之一,正得到越来越广泛的应用。
夏普复印机故障代码解决方法清除键——插入键——0键——插入键——主代码——开始键——副代码——开始键(复印件记录输入值)H2热敏电阻断开错误H3定影温度异常(高温检测)H4定影温度异常(底温检测)CC原稿检测传感器错误U2-04EEPROM通讯错误-11计数器错误-12调整值错误F5暴光灯错误F9-00打印交换通信故障-10打印交换故障-80打印交换通信故障(通信协议)-81打印交换通信故障(检测)-82打印交换通信故障(溢出)-84打印交换通信故障(信息包)-88打印交换通信故障(时间限制)E1-00电子分页器交换通信错误-10电子分页器交换故障-11图象控制错误-12图象缩小错误-13FLASHROM错误-14RAM错误-15页存储器错误-16SIMM存储错误-17画像旋转用储存器错误-80电子分页器交换通信故障(通信协议)-81电子分页器交换通信故障(检测)-82电子分页器交换通信故障(溢出)-84电子分页器交换通信故障(信息包)-88电子分页器交换通信故障(时间限制)U9-00操作交换通信故障-80操作交换通信故障(通信协议)-81操作交换通信故障(检测)-82操作交换通信故障(传送过速)-84操作交换通信故障(信息包)-88操作交换通信故障(时间限制)L8-01零交叉脉冲故障E7-03激光装置错误-04CCD白电平故障-05CCD黑电平故障-12校正故障U3-29反射镜原始位置错误L1-00反射镜进给故障L3-00反射镜返回故障L4-01主电机锁死L6-10多面镜电机被锁紧F1-06配页器电机故障L4-10隔离器电机故障U95操作连接异常示例:主代码副代码内容14 清除U2以外的故障15 清除U2故障24 7 光鼓计数清除厦普AR1818出现H、4交替闪烁:故障代码消除方法如下:快速按C键、暂停/插入键、0键、暂停/插入键这时所有灯消失,然后按1、4键、再按复印键。
大功告成。
1818小人解决办法20-1是消掉鼓记数的.24-7 .是消掉鼓时间记数的.操作如下.C-插入-C-插入-20-复印键-1-复印键完成后.按CA键即可.我是上海的。
DELL服务器SEL显示代码含义原因纠正措施保修期内先抄下来服务器快速服务代码,然后座机拨打8008580950E1000 Failsafe voltage error. Contact support.(故障保护电压错误。
请联络支持人员。
)查看系统事件记录以了解严重故障事件。
断开系统的交流电源10 秒,然后重新启动系统。
如果问题仍然存在,请参阅"获得帮助"。
E1114 Ambient Temp exceeds allowed range.(环境温度超过了许可范围。
)环境温度到了超出许可范围的某个点。
请参阅"系统冷却问题故障排除"。
E1116 Memory disabled, temp above range. Power cycle AC.(已禁用内存,温度超出范围。
请关闭交流电源再打开。
)内存已超过许可温度,系统已将其禁用以防止组件损坏。
断开系统的交流电源10 秒,然后重新启动系统。
请参阅"系统冷却问题故障排除"。
如果问题仍然存在,请参阅"获得帮助"。
E1210 Motherboard battery failure.Check battery.(母板电池故障。
请检查电池。
)CMOS 电池丢失,或电压超出许可范围。
请参阅"系统电池故障排除"。
E1211 RAID Controller battery failure.Check battery.(RAID 控制器电池故障。
请检查电池。
)RAID 电池丢失、损坏或因温度问题而无法再充电。
重新插入RAID 电池连接器。
请参阅"安装RAID 电池"和"系统冷却问题故障排除"。
E1216 3.3V Regulator failure. Reseat PCIe cards.(3.3V 稳压器故障。
请重置PCIe 卡。
如何实现单片机程序代码的反汇编如何实现单片机程序代码的反汇编要正确获取程序的目标代码,首先要明确程序代码的存放地点。
51单片机的程序存储器最大空间为64KB,在一个实际的应用系统中,程序存储器的分布情况可能有以下几种:(1)只使用了片内程序空间。
而没有使用片外的程序空间。
其硬件特征为:/EA引脚接VCC;/PSEN引脚为空脚。
这种情况比较简单,全部应用程序都在单片机内部的程序存储器中,我们只要使用编程器将程序代码读出来,保存为一个目标代码文件就可以了。
要注意的是,有一些新型的单片机具有加密功能,如果进行了加密,其中的程序代码就是不能读出。
(2)没有使用片内程序空间,片外程序空间由单个存储芯片构成。
其硬件特征为:/EA引脚接GND;/PSEN引脚接到一个存储芯片上。
这种情况下,全部应用程序都在单片机外部的程序存储器中,原则上我们只要使用编程器将程序代码读出来,保存为一个目标代码文件就可以了。
但要注意的是,这样得到的并不一定是真正的目标代码,因为,为了防止程序代码被读取、反汇编,很多设计人员都采取跳接线的方法,将某些地址线跳接或将某些数据线跳接或将地址线、数据线都进行跳接,从而保护自己的程序不被反汇编(参见图1~图4)。
这样一来,我们从存储器中读取的就不是真正的程序目标代码,必须进行某种变换,将其转换为真正的程序目标代码,才能进行反汇编。
要进行目标代码的变换,首先必须根据硬件画出实际的地址和数据的接线图,然后借助于工具软件进行变换。
在“51汇编集成开发环境”(其下载网址为www1.skycn.com/SOFt/15074/html)中,提供了一个变换工具,从软件界面的[辅助工具]—[目标代码转换]-[bin代码还原]就可以启动这个工具。
单击[浏览]可以选择要转换的代码文件,注意:这里的代码文件只能是二进制代码文件,。
0 0x0000 作业完成。
1 0x0001 不正确的函数。
2 0x0002 系统找不到指定的档案。
3 0x0003 系统找不到指定的路径。
4 0x0004 系统无法开启档案。
5 0x0005 拒绝存取。
6 0x0006 无效的代码。
7 0x0007 储存体控制区块已毁。
8 0x0008 储存体空间不足,无法处理这个指令。
9 0x0009 储存体控制区块地址无效。
10 0x000A 环境不正确。
11 0x000B 尝试加载一个格式错误的程序。
12 0x000C 存取码错误。
13 0x000D 资料错误。
14 0x000E 储存体空间不够,无法完成这项作业。
15 0x000F 系统找不到指定的磁盘驱动器。
16 0x0010 无法移除目录。
16 0x0010 无法移除目录。
17 0x0011 系统无法将档案移到其它的磁盘驱动器。
18 0x0012 没有任何档案。
19 0x0013 储存媒体为写保护状态。
20 0x0014 系统找不到指定的装置。
21 0x0015 装置尚未就绪。
22 0x0016 装置无法识别指令。
23 0x0017 资料错误(cyclic redundancy check)24 0x0018 程序发出一个长度错误的指令。
25 0x0019 磁盘驱动器在磁盘找不到持定的扇区或磁道。
26 0x001A 指定的磁盘或磁盘无法存取。
27 0x001B 磁盘驱动器找不到要求的扇区。
28 0x001C 打印机没有纸。
29 0x001D 系统无法将资料写入指定的磁盘驱动器。
30 0x001E 系统无法读取指定的装置。
31 0x001F 连接到系统的某个装置没有作用。
32 0x0020 The process cannot access the file because it is beingused by another process.33 0x0021 档案的一部份被锁定,现在无法存取。
34 0x0022 磁盘驱动器的磁盘不正确。
内存错误代码解决方法内存错误是在计算机编程中经常遇到的问题之一,它会导致程序崩溃、数据丢失甚至系统崩溃。
解决内存错误代码是一个繁琐而重要的任务,本文将为您介绍内存错误的几种常见类型以及解决方法。
一、空指针错误(Null Pointer Error)空指针错误是程序中最常见的内存错误之一,它通常发生在程序试图对一个没有被初始化或释放的指针进行操作时。
出现空指针错误会导致程序崩溃或不可预测的行为。
解决空指针错误的方法包括:1. 初始化指针:在使用指针之前,确保为其分配内存并进行初始化操作,避免指针为空的情况。
2. 检查空指针:在访问指针指向的内存之前,先判断指针是否为空,以避免程序异常。
二、内存泄漏(Memory Leak)内存泄漏是指在程序运行过程中,分配的内存没有被正确释放而造成的内存浪费。
长时间运行的程序中存在内存泄漏,会逐渐消耗系统资源,导致系统性能下降。
解决内存泄漏的方法包括:1. 释放内存:在程序不再使用某些变量或数据结构时,及时释放对应的内存空间,避免长时间占用内存不释放。
2. 使用自动内存管理:如使用编程语言中提供的垃圾回收机制,自动跟踪和释放不再使用的内存,避免手动管理内存出错。
三、越界访问(Out-of-Bounds Access)越界访问是指程序试图读取或写入超出数组或缓冲区边界的内存位置。
这种错误可能导致程序运行异常,数据损坏或系统崩溃。
解决越界访问的方法包括:1. 检查索引值:在访问数组或缓冲区时,始终确保索引值在合法范围内,避免越界访问。
2. 使用函数库:使用安全的函数库,如strncpy()代替strcpy(),会在拷贝字符串时检查边界,避免越界访问造成的错误。
四、重复释放(Double Free)重复释放错误是指程序对同一个内存块进行多次释放,这会导致内存空间被重复释放,并可能导致程序运行异常或崩溃。
解决重复释放的方法包括:1. 确保释放一次:在代码中对内存块进行释放时,确保只调用一次释放函数,避免重复释放。
W i n d o w s系统错误代码大全------------------------------------------作者xxxx------------------------------------------日期xxxxMicrosoft Windows 系统错误代码简单分析:0000 操作已成功完成。
0001 错误的函数。
0002 系统找不到指定的文件。
0003 系统找不到指定的路径。
0004 系统无法打开文件。
0005 拒绝访问。
0006 句柄无效。
0007 存储区控制块已损坏。
0008 可用的存储区不足,无法执行该命令。
0009 存储区控制块地址无效。
0010 环境错误。
0011 试图使用不正确的格式加载程序。
0012 访问代码无效。
0013 数据无效。
0014 可用的存储区不足,无法完成该操作。
0015 系统找不到指定的驱动器。
0016 无法删除该目录。
0017 系统无法将文件移到其他磁盘驱动器上。
0018 没有其他文件。
0019 媒体写保护。
0020 系统找不到指定的设备。
0021 设备尚未准备好。
0022 设备无法识别该命令。
0023 数据错误(循环冗余检查)。
0024 程序发出命令,但是该命令的长度错误。
0025 驱动器在磁盘上无法定位指定的区域或磁道。
0026 无法访问指定的磁盘或软盘。
0027 驱动器找不到所请求的扇区。
0028 打印机缺纸。
0029 系统无法写入指定的设备。
0030 系统无法读取指定的设备。
0031 与系统连接的设备不能正常运转。
0032 其他进程正使用该文件,因此现在无法访问。
0033 另一进程已锁定该文件的某一部分,因此现在无法访问。
0034 驱动器中的软盘不正确。
请将 %2 (卷标序列号: %3)插入驱动器 %1。
0036 打开共享的文件太多。
0038 已到达文件结尾。
0039 磁盘已满。
0050 不支持此网络请求。
0051 远程计算机无法使用。
C8051F120代码超过64K后的分页处理(Keil uV5)1工程设置Device项设置:Target项的设置:Output项的设置:Listing项的设置:C51项的设置:BL51 Locate项的设置:Debug项的设置:2L51_BANK.A51文件设置使用新华龙提供的代码分页例程的L51_BANK.A51文件,具体内容详见附录1——《L51_BANK.A51》;其使用的是用户自定义的分页方式,即B_MODE 为4。
3代码分组设置工程建立好之后,新建4个分组,分别是Common、Bank1、Bank2、Bank3,或者取其他的名字,但是要能使自己明白和记住那些程序是放在哪个程序块里的就可以。
Common组的选项设置:其他的分项C51和A51默认即可!Bank1组的选项设置:其他的组Bank2和Bank3以此类推。
4详细代码加载设置首先将一些重要的驱动和启动文件放到Common组,即Bank0块内,注意不能使该组编译后的代码超过32K。
注意:必须要将L51_BANK.A51和STARTUP.A51文件,以及Main.c文件加入该块!其他文件加载到不同的Bank块内,也需要注意不能使该组编译后的代码超过32K。
加载完程序后,对项目工程进行编译:会产生3个编译文件,分别是.B01、.B02、.B03。
此时,打开系统工程目录下的List文件夹下的.M51文件,找到“* * * * * * * C O D E M E M O R Y * * * * * * *”段的内容,如果该段的起始内容是如下的杂乱无章的话,即表示Keil 软件对工程的代码的地址分配不好:这样的话,即使编译通过,下载到芯片里面之后,程序的运行也会乱跳,并且无法执行。
所以要对其进行更精确的地址分配,打开工程的选项设置,选择“BL51 Locate”项,在Code后面,将需要特殊处理的函数、变量、模块等进行指定地址的分配。
具体的分配格式详见附录2——Keil 中代码、变量、堆栈、函数定位方式:再次对项目工程进行编译,再次查看.M51文件的“* * * * * * * C O D E M E M O R Y * * * * * * *”段内容,会发现已经很整齐了:至此,代码分页处理已经完成90%了,剩下的是如何批量生产时的代码烧写准备工作了。
5程序烧写设置代码的批量烧写要使用“Silicon Labs MCU Production Programmer”工具,然后点击Program Menu选项的“Configure Programming Settings”,进行如下设置:保存配置,然后点击“Accept Settings”,然后点击“Program Device”按钮,最后等待弹出如下所示信息,则表示写入完毕:附录1——《L51_BANK.A51》$NOMOD51 NOLINES$NOCOND;------------------------------------------------------------------------------; This file is part of the BL51 / LX51 Banked Linker/Locater package; Copyright (c) 1988 - 2000 Keil Elektronik GmbH and Keil Software, Inc.; Version 2.08 (Code and Variable Banking for Classic 8051 Derivatives);------------------------------------------------------------------------------;************************ Configuration Section*******************************?B_NBANKS EQU 4 ; Define max. Number of Banks *; ; The following values are allowed: 2, 4, 8, 16, 32 *; ; the max. value for ?B_BANKS is 32 *; *?B_MODE EQU 4 ; 0 for Bank-Switching via 8051 Port *; ; 1 for Bank-Switching via XDATA Port *; ; 4 for user-provided bank switch code *; *?B_RTX EQU 0 ; 0 for applications without RTX-51 FULL *; ; 1 for applications using RTX-51 FULL *; *?B_VAR_BANKING EQU 0 ; Enable Variable Banking in XDATA and CODE memory *; ; 0 Variable Banking is disabled *; ; 1 XDATA and CODE banking with same address lines *; ; 2 XDATA uses a different banking port *; Note Variable Banking is only supported with the LX51 linker/locater *; *?B_RST_BANK EQU 0FFh ; specifies the active code bank number after CPU *; ; Reset. Used to reduce the entries in the *; ; INTERBANK CALL TABLE. The value 0xFF disables *; ; this LX51 linker/locater optimization. *; Note interbank call table optimization is only possible with LX51. *; *;-----------------------------------------------------------------------------*; *IF ?B_MODE = 4; *;-----------------------------------------------------------------------------*; if ?BANK?MODE is 4 define the following switch macros *; For bank switching via user-provided bank switch code you must define for *; each memory bank a own macro which contains the bank switch code. The * ; following example shows how to use the I/O lines P1.4 and P1.7 for bank *; switching. Since you can select just 4 banks with two address lines, just *; four macros are defined. The number of macros must conform with the number * ; ?B_NBANKS number, i.e. for an application with 16 memory banks you must * ; define 16 macros. *; *; IMPORTANT NOTES: *; 1. Eeach SWITCH macro must generate the same code size, otherwise the *; BANKSWITCH code does not work correctly. *; 2. The bankswitch logic must be initialized before using it. Please add *; the following two lines of code at the end of the STARTUP.A51 file: *; : *; EXTRN CODE (?B_SWITCH0); CALL ?B_SWITCH0 ; init bank mechanism to code bank 0; LJMP ?C_START ; line already exits at the end of file *; : *; 3. If you are using the RTX-51 real-time operating system this banking *; mode cannot be used. *; *PSBANK DATA 0B1H ; PSBANK Address *; *SWITCH0 MACRO ; Switch to Memory Bank #0 *MOV PSBANK, #00h ; Set PSBANK *ENDM *; *SWITCH1 MACRO ; Switch to Memory Bank #1 *MOV PSBANK, #11h ; Set PSBANK *ENDM *; *SWITCH2 MACRO ; Switch to Memory Bank #2 *MOV PSBANK, #22h ; Set PSBANK *ENDM *; *SWITCH3 MACRO ; Switch to Memory Bank #3 *MOV PSBANK, #33h ; Set PSBANK *ENDM *; *;-----------------------------------------------------------------------------*ENDIF; *; *;******************************************************************** **********; *; THEORY OF OPERATION *; ------------------- *; The section below describes the code generated by BL51 or L251 and the *; operation of the L51_BANK.A51 module. BL51/L251 generates for each *; function that is located in a code memory bank and called from the common * ; area or a different code bank and entry into the INTRABANK CALL TABLE. The * ; INTRABANK CALL TABLE is located in the SEGMENT ?BANK?SELECT and listed in *; the Linker MAP file. The entries in that TABLE have the following format: *; *; ?FCT?1: MOV DPTR,#FCT ; Load Address of target FCT *; JMP ?B_BANKn ; Switch to Bank and Jump to Target Code *; *; Instead of directly calling the function FCT, the Linker changes the entry *; to ?FCT?1. This entry selects the bank where the function FCT is located *; and calls that function via the routines defined in this L51_BANK.A51 file. *; The L51_BANK.A51 file contains two sets of functions for each bank: *; *; ?B_BANKn is a routine which saves the entry of the ?B_SWITCHn function *; for the current active bank on the STACK and switches to the *; bank 'n'. Then it jumps to the address specified by the DPTR *; register. It is allowed to modify the following registers in *; the ?B_BANKn routine: A, B, R0, DPTR, PSW *; *; ?B_SWITCHn is a function which selects the bank 'n'. This function is *; used at the end of a user function to return to the calling *; code bank. Only the following registers may be altered in the *; ?B_SWITCHn function: R0, DPTR *; *; The current active bank is stored in ?B_CURRENTBANK. RTX-51 uses this *; variable to restore the code bank after a task switch. To get correct *; results, ?B_CURRENTBANK must be set to the code bank before the hardware * ; switch is done, or the code banking sequences must be interrupt protected. *;******************************************************************** **********NAME ?BANK?SWITCHINGPUBLIC ?B_NBANKS, ?B_MODE, ?B_CURRENTBANK, ?B_MASKPUBLIC ?B_FACTOR, ?B_RST_BANK; Standard SFR Symbols required in L51_BANK.A51ACC DATA 0E0HB DATA 0F0HDPL DATA 82HDPH DATA 83HIE DATA 0A8HEA BIT IE.7; generate Mask and Bank Number InformationIF ?B_NBANKS <= 2MASK EQU 00000001BELSEIF ?B_NBANKS <= 4MASK EQU 00000011BELSEIF ?B_NBANKS <= 8MASK EQU 00000111BELSEIF ?B_NBANKS <= 16MASK EQU 00001111BELSEMASK EQU 00011111BENDIFIF ?B_MODE =4 ;**************************************************************?B_FACTOR EQU 0 ; Dummy Declarations?B_FIRSTBIT EQU 0?B_MASK EQU MASK?BANK?SELECT SEGMENT CODE?BANK?DATA SEGMENT DATARSEG ?BANK?DATA?B_CURRENTBANK: DS 1BANK MACRO NPUBLIC ?B_BANK&N?B_BANK&N:PUSH ?B_CURRENTBANKMOV A,#HIGH ?BANK?SWITCHPUSH ACCPUSH DPLPUSH DPHENDMSWITCH MACRO NPUBLIC ?B_SWITCH&N?B_SWITCH&N:MOV ?B_CURRENTBANK,#LOW ?B_SWITCH&NSWITCH&NRETENDM?BANK?SWITCH SEGMENT CODE PAGERSEG ?BANK?SWITCHB_SWITCH_START EQU $; Generate ?B_SWITCHn functionsCNT SET 0REPT ?B_NBANKSBANK %CNTSWITCH %CNTCNT SET CNT+1ENDMB_SWITCH_SIZE EQU $-B_SWITCH_STARTIF (B_SWITCH_SIZE > 256)__ERROR__ "BANK SWITCH CODE BIGGER THAN 256 BYTES (reduce number of banks or macro code)"ENDIFCOMMON_XDATA MACRO ; Switch back to common XDATA bankSWITCH1 ; Switch to XDATA Bank 1ENDMENDIF ; close block IF ?B_MODE = 4*******************************************RSEG ?BANK?SELECT;************************ SWITCHBANK FUNCTION*******************************; *; SWITCHBANK allows use of bank-switching for C programs *; *; prototype: extern switchbank (unsigned char bank_number); *; *;******************************************************************** **********PUBLIC _SWITCHBANK_SWITCHBANK: MOV A,R7IF ?B_MODE =4 ;**************************************************************S_ENTRY MACRO NDB LOW ?B_SWITCH&NENDM_SWITCHBANK_A:ADD A,#switch_tab+3-$MOVC A,@A+PCMOV DPTR,#?BANK?SWITCHJMP @A+DPTRswitch_tab:CNT SET 0REPT ?B_NBANKSS_ENTRY %CNTCNT SET CNT+1ENDMENDIF ; close block IF ?B_MODE = 4*******************************************END附录2——Keil 中代码、变量、函数定位方式使用BL51 Locate选项格式说明:?PR? 表示program 意思是 Executable program code(可执行程序段);?CO?表示code意思是code变量;?XD?表示xdata意思是xdata变量;?ID?表示idata意思是idata变量;?DT? 表示data意思是data变量;?PD?表示pdata意思是pdata变量;代码和函数定位:比如在main.c中定义了一个MyFunc2函数,并且要将该函数定位到代码区C:0x2000,则从菜单中选择Project->Options for Target 'Target1',在弹出的对话框中选择BL51 Locate页,在下面的code栏中写上“?PR?MYFUNC2?MAIN(0x2000)”即可。