keil中如何让一个keil 条件断点一定并运行之后的所有函数,我已经用过了if,switch,do-while,for甚至goto。。

题目:求1+2+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(A?B:C) - ProgramVAE的博客 - CSDN博客
题目:求1+2+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(A?B:C)
&&& 这个问题本身没有太多的实际意义,但不少面试官认为这个可以考察应聘者发散思维能力的题目,而发散思维能够反映出应聘者知识面
的宽度,以及对编程相关技术理解的深度。
&& &通常求1+2+..+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思想,由于已经明确限制for和while的使用,循环已经不能再用了。
递归函数也需要用if语句或者条件判断语句来判断是继续递归下去还是终止递归,但现在题目已经补允许使用这两种语句了。
&&& 解法一:利用构造函数求解
&& &我们仍然围绕循环做文章,循环只是让相同的代码重复执行n遍而已,我们完全可以不用for和while来达到这个效果。比如我们先定义
一个类型,接着创建n个该类型的实例,那么这个类型的构造函数将确定会被调用n次。我们可以将与累加相关的代码放到构造函数里面里。
int Sum_Solution1(int n);
class Temp
Temp() { ++N;Sum += N; }
int GetSum() const { return S }
static int N;
static int S
int Temp::N = 0;
int Temp::Sum = 0;
int main()
cout&&&sum=&&&Sum_Solution1(100)&&
int Sum_Solution1(int n)
Temp *a = new Temp[n];
delete []a;
return a-&GetSum();
&& & 解法二:利用虚函数求解
&& & 我们同样也可以围绕递归做文章。既然不能在一个函数中判断是不是应该终止递归,那么我们不妨定义两个函数,一个函数充当递归函数
的角色,另一个函数处理终止递归的情况,我们需要做的是在两个函数里二选一。从二选一我们很自然的想到布尔变量,比如值为true(1)的时候
调用第一个函数,值为false(0)的时候调用第二个函数。那现在的问题是如何把数值变量n转换为布尔值。如果对n连续做两次反运算,即!!n
,那么非零的n转换为true,0转换为false。
int Sum_Solution2(int n);
A *Array[2];
virtual int Sum(int n)
class B:public A
virtual int Sum(int n)
return Array[!!n]-&Sum(n-1) +
int main()
cout&&&SUM=&&&Sum_Solution2(100)&&
int Sum_Solution2(int n)
Array[0] = &a;
Array[1] = &b;
int value = Array[1]-&Sum(n);
&& &解法三:利用函数指针求解
&& &在纯C语言的编程环境中,我们不能使用虚函数,此时可以用函数指针来模拟,这样代码可能还更加直观一些。
#include&stdio.h&
typedef int (*fun) (int);
int Sum_Solution3_Teminator(int n)
int Sum_Solution3(int n)
fun f[2] = {Sum_Solution3_Teminator,Sum_Solution3};
return n + f[!!n]( n - 1 );
int main()
printf(&sum=%d\n&,Sum_Solution3(100));
此外,我们还可以让编译器帮助完成类似于递归的运算。
template&int n&
struct Sum_Solution4
enum Value { N = Sum_Solution4&n-1&::N + n };
template&& struct Sum_Solution4&1&
enum Value{ N = 1 };
int main()
cout&&Sum_Solution4&100&::N&&
Sum_Solution4&100&::N就是1+2+3+...+100的结果。当编译器看到Sum_Solution4&100&时,就会为模板类Sum_Solution4以参数100生成该类型的代码。但以100为参数的类型需要得到以99为参数的类型,因为Sum_Solution4&100&::N = Sum_Solution4&99&::N + 100.这个过程会递归一直到参数为1的类型,由于该类型已经显示定义,编译器无须生成,递归编译到此结束。由于这个过程是在编译过程中完成的,因此要求输入n必须是在编译期间就能确定的常量,不能动态输入,这时该方法最大的缺点。而且编译器对递归编译代码的递归深度是有限制的,也就是要求n不能太大。
我的热门文章JAVA之旅(二)——if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结
JAVA的思想真的很重要,所以要专心的学&&献给刚入门的小程序员们
一般语句也就三个类型
判断语句 if 选择语句 switch 循环语句 for 当然,还有其他的
我们这里一个一个来讲
if,如果,就是判断,if(条件){}
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
int a = 5;
if (a & 10) {
System.out.println(&我比10大&);
System.out.println(&我比10小&);
输出的结果
这里我们来写一个经典的在题目
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
// 根据1-7来判断使星期几
int day = 3;
if (day == 1) {
System.out.println(&今天星期一&);
} else if (day == 2) {
System.out.println(&今天星期二&);
} else if (day == 3) {
System.out.println(&今天星期三&);
} else if (day == 4) {
System.out.println(&今天星期四&);
} else if (day == 5) {
System.out.println(&今天星期五&);
} else if (day == 6) {
System.out.println(&今天星期六&);
} else if (day == 7) {
System.out.println(&今天星期七&);
System.out.println(&不是1-7范围内的数字&);
应该很容易看懂吧,根据day的值来判断是星期几,如果不是1-7的话就提示不在范围内
所以输出的结果
当然,如果你要判断季节什么的,也可以用逻辑运算来判断,这里就不讲了;vcD4NCjwvYmxvY2txdW90ZT4NCjxoMyBpZD0="2switch">2.switch
这个就是选择了,结构是
switch (表达式) {
case 取值1:
//最终执行
我们具体来看看怎么执行的吧
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
int a = 3;
switch (a) {
System.out.println(&1&);
System.out.println(&2&);
System.out.println(&3&);
System.out.println(&4&);
System.out.println(&5&);
// 最终执行
System.out.println(&都不是&);
这里可以看到,根据a的值来选择要执行的代码块,所以这里输出的是3,如果你把a改成6,那就会输出都不是了
我们这里也来做一个挺经典的题目
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
* 根据用户指定的月份,打印相应的季节
int month = 7;
switch (month) {
System.out.println(&春&);
System.out.println(&夏&);
System.out.println(&秋&);
System.out.println(&冬&);
System.out.println(&输入不再范围内&);
这里,输出的是秋
if和switch很像,那什么时候使用呢?如果判断的具体数值不多,而是符合byte short int char 类型,使用switch,其他情况,使用if,虽然都可以,但是switch效率据说稍微高一点点&
循环语句的一种,循环有三种
while do while for
先来看看while
while (条件) {
代码来说明
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
int a = 5;
// 循环5次
while (a & 10) {
System.out.println(&a = & + a);
这个代码是while,他会一直循环,当我们循环第一次的时候,a他自增就是6了,他继续循环,。一直到他&10,这样就循环了五次,我们看看输出结果
4. do while
do while要结合while语句这样更容易说明一些事情
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
int a = 1;
System.out.println(&a = & + a);
} while (a & 10);
这里运行的结果
我们可以得到的区别就是while会先判断条件再去执行语句,而后者是先去执行再去判断是否要循环
这个是个大学问,我们看一下语法格式
* 条件表达式 循环条件表达式
循环后的操作表达式
for (int i = 0; i & str. i++) {
//执行语句
我们再具体的看
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
* 条件表达式 循环条件表达式 循环后的操作表达式
for (int i = 0; i & 10; i++) {
// 执行语句
System.out.println(&i = & + i);
让i去自增十次
这个过程其实while也是可以写的
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
int i = 0;
while (i & 10) {
System.out.println(&i = & + i);
运行的结果都是一样的,那这两个有什么区别呢?
作用域不同
我们还是以小练习为主吧
首先我们看第一个
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
* 获取1-10的和并且打印
// 用于存储不断变化的和
int sum = 0;
// 记录累加的值
for (int i = 1; i & 11; i++) {
System.out.println(&和为:&+sum);
这里打印值
好,是不是很简单,我们继续来看下一个
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
* 打印1-100之间7倍数的个数
int temp = 0;
for (int i = 1; i &= 100; i++) {
if (i % 7 == 0) {
System.out.println(&个数为:& + temp);
这个是不是也很简单,最重要的是思路
6.语句嵌套
就是语句中还有语句,上面那个例子就是,不过我们这里主讲双层for循环,又叫循环嵌套
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
for (int i = 0; i & 3; i++) {
for (int j = 0; j & 4; j++) {
System.out.println(&Hello&);
这种格式的,所以我们可以利用这种特点打印一个长方形
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
for (int i = 0; i & 4; i++) {
for (int j = 0; j & 4; j++) {
System.out.print(&*&);
System.out.println();
这样,我们再来打印一个直角三角形
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
for (int i = 0; i & 10; i++) {
for (int j = 0; j & j++) {
System.out.print(&*&);
System.out.println();
得到的结果
那我们换种思路去写一个倒的
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
for (int i = 0; i & 10; i++) {
for (int j = j & 10; j++) {
System.out.print(&*&);
System.out.println();
小练习是好玩,也是大学时候的经典,我们继续
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
for (int i = 0; i & 6; i++) {
for (int j = 1; j & j++) {
System.out.print(& &+j);
System.out.println();
这些都不算难的,我们来一个九九乘法表,还记得大学里面学这个也费了不少功夫
import java.time.Y
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
* 九九乘法表
for (int i = 1; i & 10; i++) {
for (int j = 1; j & i + 1; j++) {
System.out.print(j + &*& + i + & = & + j * i + & &);
System.out.println(& &);
打印下结果
7.流程控制语句
这个是什么意思呢
break : 跳出 选择和循环结构 continue: 继续 循环结构
根本在于,这两个只要不是应用在应用范围内,就是无效的了,这两个语句下面都不能有语句,因为不会执行,continue是结束本次循环继续下次循环,作用范围,我们来案例
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
for (int i = 0; i & 3; i++) {
System.out.println(&i : & + i);
// 跳出循环
运行的结果
当我们循环第一次的时候,break已执行就跳出循环体了,也就不再循环了
那我们再来看看continue
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
for (int i = 0; i & 10; i++) {
if (i % 2 == 1) {
// 继续循环
System.out.println(&i : & + i);
打印的结果
当符合i % 2 == 1的时候就继续循环,不再执行下面的语句了
好的,我们语句就暂时到这里,我们用一个等腰三角形的练习来结束
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
* 等腰三角形
for (int i = 0; i & 5; i++) {
for (int j = i + 1; j & 5; j++) {
System.out.print(& &);
for (int z = 0; z &= z++) {
System.out.print(&* &);
System.out.println();
函数是什么?
函数就是定义在类中具有特定功能的一段独立小程序,函数也称方法
修饰符 返回类型 函数名 (参数1&参数2){ 执行语句 return 返回值}
毕竟文笔不好,还是直接用代码表达
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
* 求任何数+5的和
System.out.println(getNum(5));
private static int getNum(int a) {
return a + 5;
这样,我们输出的结果
由此可以看出函数的特点
便于对该功能进行复用 函数只有被调用的时候才会执行 函数的出现提高了代码的复用性 对于函数没有具体返回值的情况,返回值类型可以用void,那么return就可以不用写了
要注意的是
函数中只能调用函数,不可以在函数内部定义函数 定义函数时,函数的结果返回给调用者,交由调用者处理
我们还是通过实际案例来吧
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
System.out.println(getNum());
private static int getNum() {
return 6 + 5;
这样就知道打印了6+5的值
函数的重载,我们在构造方法中是见过的,我们来说一下特点
在同一个类中,允许存在一个以上的同名函数,只要他们的参数或者参数类型不同即可
与返回值类型无关,只看参数列表
方便,优化程序设计
public class HelloJJAVA {
// 公共的 静态 无返回值 main方法 数组
public static void main(String[] str) {
private static int getNum(int a) {
private static int getNum(int a, int b) {
return a +
private static int getNum(int a, int b, int c) {
return a + b +
这就是重载
什么时候用重载?
当定义的功能相同、但参与的未知运算不同 ,那么,就定义一个函数名称以表示功能,方便阅读,而通过参数列表的不同来区分同名函数
OK,这个重载的示例就不写了,我们本篇就先到这里吧,下节我们讲数组之类的数据处理,嘻嘻!在Keil c51中怎么用一个带参数的函数实现在不同的I/O端口之间进行切换! - 嵌入式系统编程 -
电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 2252|回复: 6
在Keil c51中怎么用一个带参数的函数实现在不同的I/O端口之间进行切换!
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
在程序中有很多函数,各函数都有可能对不同的端口进行同样的操作,不知能否写一个函数,此函数带一个参数,在函数中通过对此参数的值进行判断来切换端口,每次执行一次此函数后再执行其它函数时,其它函数都对刚才切换的端口进行操作。我写了如下的代码,但不起作用。
sbit DQ=P1^4;
void Switch_DQ(uchar i)
& &Switch(i)
& && & case(1):
& && &&&DQ=P1^3;
& && & case(2):
& && &&&DQ=P1^4;
& && & case(3):
& && &&&DQ=P1^5;
& && & default:
& && &&&DQ=P1^4;
void main()
& &Switch_DQ(1);
& &其它操作函数;
执行后不能切换到P1^3口,还是在最初的P1^4口,请问各位高手应该如何实现此功能?谢谢!
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
sbit定义,不像变量定义,而更像是符号定义
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
你已经将DQ定义成P1^4,怎么能切换倒P1^3呢?
给个建议:
利用按键记忆进行切换[code]
sbit DQ=P1^4;
sbit K1=P3^1;
void main()
&&Switch(ID)
&&其它操作函数;
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
还不如在h文件里定义一串sbit,像数组那样,用下标来选择。
函数的传入参数就是下标。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
请教各位,有没有什么办法通过定义一个变量来指向不同的端口,也就是一个变量其值可以指向不同的端口?
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
Keil c51 不支持指向位的指针,因为51单片机机器级指令都不支持位的间接寻址。如果keil自动生成等价代码,
要覆盖所有的位,代码量太大了,一点都不划算。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
如果是单在同一组端口还是可以的,比如置零:
void clr1(uchar bits)
P1=P1&(~(0x01&&bits));
void set1(uchar bits)
P1=P1|(0x01&&bits);
EEWORLD 官方微信
EE福利 唾手可得
Powered bykeil所有错误
编辑:www.fx114.net
本篇文章主要介绍了"keil所有错误",主要涉及到keil所有错误方面的内容,对于keil所有错误感兴趣的同学可以参考一下。
C51编译器识别错类型有三种
1、致命错误:伪指令控制行有错,访问不存在的原文件或头文件等。
2、语法及语义错误:语法和语义错误都发生在原文件中。有这类错误时,给出
提示但不产生目标文件,错误超过一定数量才终止编译。
3、警告:警告出现并不影响目标文件的产生,但执行时有可能发生问题。程序
员应斟酌处理。
D.1 致命错误
C_51 FATAL_ERROR
ACTION: &当前行为&
LINE: &错误所在行&
ERROR: &错误信息& terminated
或C_51 FATAL ERROR
ACTION: &当前行为&
FILE: &错误所在文件&
ERROR: &错误信息& terminated
C_51 TERMINATED C_51
(1) ACTION 的有关信息
*PARSING INVOKE-/#PRAGMA_LINE
在对#pragma 指明的控制行作此法分析时出错。
*ALLOCATING MEMORY
系统分配存储空间时出错。编译较大程序需要512k空间。
*OPENING INPUT_FILE
打开文件时,未找到或打不开源文件/头文件。
*CREATE LIST_FILE/OBJECT_FILE/WORK_FILE
不能创建上述文件。可能磁盘满或文件已存在而且写保护。
*PARSING SOURCE_FILE/ANALYZING DECLARATIONS
分析源程序时发现外部引用名太多。
*GENERATING INTERMEDIATE CODE
源代码被翻译成内部伪代码,错误可能来源于函数太大而超过内部极限。
*WRITING TO FILE
在向文件(work,list,prelist或object file)写时发生错误。
(2)ERROR的有关信息
*MEMORY SPACE EXHAUSTED
所有可用系统空间耗尽。至少需要512k 字节空间。没有足够空间,用户必须检查常驻内存
的驱动程序是否太多。
*FILE DOES NOT EXIST
FILE 行定的文本文件名未发现。
*CAN’T CREAT FILE
FILE 行定义的文件不能被创建。
*SOURCE MUST COME FROMA DISK_FILE
源文件和头文件必须存在于硬盘或软盘上。控制台、CON、CI 或类似设备不允许作为输入
*MORE THAN 256 SEGMENTS/PUBLICS/EXTERNALS
受OMF_51的历史限制,一个源程序不能超过256个各种函数的类型段,256个全局变量,
256 个公共定义或外部引用名。不使用为变量可以减少使用的段数。使用static 存储类型说
明符可减少全局变量的使用数目。合理调整定义性说明的位置可减少外部引用名的使用数
*FILEWRITE ERROR
当向list、prelist、work或object文件中写内容时,由于空间不够而发生错误。
*NON_NULLARGUMENT EXPECTED
所选的控制参数需要一个括号内的变量,如一个文件夹或一个数。
*“(”AFTER CONTROL EXPECTED
变量的左括号丢失。
*“)”AFTER PARAMETER EXPECTED
变量的右括号丢失。
*RESPECIFIED OR CONFLICTING CONTROL
所选的控制参数与前面发生冲突或重复,例如CODE和NOCOND
*BAD DECIMAL NUMBER
控制参数的数字含有非法数,需要使用十进制数。
*OUT OF RANGE DECIMAL NUMBER
控制参数的数字越界,例如OPTIMIZE 的参量为0-5。
*IDENTIFIER EXPECTED
控制参数DEFINE 需要一个标识符做参量,与C语言的规则相同。
*PARSE STACK OVERFLOW
分析栈溢出。可能是源程序包含特别复杂的表达式,或功能块嵌套数超过15。
*PREPOCESSOR: MACRO TO NESTED
宏扩展期间,预处理器的栈耗用太大。表明宏嵌套太多,或有递归宏定义。
*PREPOCESSOR: LINE TOO LONG(510)
宏扩展后行超过510个字符。
*CAN’T HAVE GENERAL CONTROL IN INVOCATION LINE
一般控制(如EJECT)不能是命令行的一部分,应将它们放入源文件“pragma”预处理行
D.2 语法及语义错误
D.2.1 错误格式
这类错误在列表文件中产生如下格式的信息:
***ERROR&number&IN LINE&line&OF&file&:error message
***WARING&number&IN LINE&line&OF&file&:warning message
&number&表示错误行;
&line&表示源文件或头文件中与错误或警告相关的行;
&file&指明了错误所在的源文件或头文件;
D.2.2 错误信息及可能发生的原因
*ERROR100:unprintable character 0x??skipped
源文件中发现非法字符(注意,注解内的字符不做检查)。
*ERROR101:unclosed string
串未用引号结尾。
*ERROR 102:string too long
串不得超过511 个字符。为了定义更长的串,用户必须使用续行符‘\’逻辑的继续该串,
在词汇分析时遇到以该符号结尾的行会与下行连接起来。
*ERROR 103: invalid character constant
试图再声明一个已定义的宏,已存在的宏可以用#undef指令删除。预定义的宏不能删除。
*ERROR 104: identifier expected
预处理器指令期望产生一个标示符,如ifdef&name&。
*ERROR 105: unclosed comment
当注解无结束界定符(*/)时产生此错误。
*EROOR 106: unbalanced#if-endif controls
endif的数量与if或ifdef的数量不匹配。
*ERROR 107:include file nesting exceeds 9
include指令后的文件名无效或丢失
*ERROR 108: expected string,如#error “string”
预处理器指令期望一个串变量。
*ERROR 109:&user error text&
由#error 伪指令引入的错误信息以错误信号形式显示。
*ERROR 110:missing directive
预处理行#后缺少伪指令。
*ERROR 111:unknown directive
预处理行#后不是伪指令。
*ERROR 112:misplaced ‘elif’
*ERROR 113:misplaced ‘else’
*ERROR 114:misplaced ‘endif’
指令 elif/else/endif 只有在if、ifdef、ifndef指令内才是合法的。
*ERROR 117:bad integer expression
if/elif指令的数值表达式有语法错误。
*ERROR 118:missing’(‘after macro identifier
宏调用中实参表的左括号丢失
*ERROR 119:reuse of macro formal parameter
宏定义形参名重复使用
*ERROR 120:‘C’unexpected in formal list
形参表中不允许有字符‘c’,应用逗号代替
*ERROR 121:missing ‘)’after actual parameter
宏调用实参表的右括号丢失
*ERROR 122:illegal macro invocation
宏调用的实参表与宏定义中的形参表不同
*ERROR 123:missing macro name after ‘define’
#define 伪指令后缺预定义的宏
*ERROR 124:expected macro formal parameter
宏定义要求形参名
*ERROR 125:declarater too complex
说明过于复杂
*ERROR 126:type-stack underflow
对象的声明至多只能包含20 个类型修饰符(【】,*,(),)错误126 经常在错误125 之前,
两者一起发生。
*ERROR 127:invalid storage class
对象用无效的存储类所说明。当在函数外用auto/register 存储时会发生这种情况。
*ERROR 128:memory space: illegal memory space ‘memory space ’used
函数参数的存储类由存储模式(SMALL LARGE COMPACT)决定用户不能改变,使用不同
于存储模式的自动变量应该为静态的存储类
*ERROR 129:missing’ ;’before ‘token’
该错误表示分号丢失,通常该错误会引发一连串的错误,引发的这些错误无关紧要。因为缺
少分号后编译器不能做正确的语法分析
*ERROR 130:value out of range
using 或interrupt 指令后参数越限。using 用的寄存器组号位0-3,interrupt 需要0-15 的中
*ERROR 131:duplicate function-parameter
函数中形参名重复,形参名应彼此不同
*ERROR 132:not in formal parameter list
函数内参数声明使用的名字未出现在参数表中
*ERROR 133:char function(v0,v1,v2)
Char*v0,*v1,*v5;/ *’v5’在形参中未出现
*ERROR 134:xdata/idata/pdata/data on function not permitted
函数总是驻留于0x5xxxx 的code存储区,不能位于xdata/idata/pdata/data 空间
*ERROR 135:bad storage class for bit
位变量的定义可以接受static或extern的存储类,用REGIESTER和ALIEN 都是非法的
*ERROR 136:‘void’on variable
‘void’类型只允许作为函数的返回类型或与指针类型合用(void*)
*ERROR 137:illegal parameter type:’function’
函数参数的类型不能是函数,然而函数指针可以作为参数
*ERROR 138:interrupt ()may not receive or return value (s)
中断函数既不能有参数又不能有返回值
*ERROR 139:illegal use of ‘alien’
关键字alien 将函数定义为PL/M51 规定的过程与函数结构。这意味着C函数中有参数的缩
记符号(即funct(…);)时是不能用alien的
*ERROR 140:bit in illegal memory-space
位变量的定义可包含修饰符DATA,如果无修饰符则假定为DATA。因为位变量始终位于
0x4xxx 的内部数据存储器中,当试图采用其他存储空间就会产生这个错误。
*ERROR 141:NEAR&token&:expected&token&
编译器所见的单词是错误的。期望正确的单词
*ERROR 142:invalid base address
Sfr 说明中的基址有错。有效基址为0x80-0xff。如果声明采用base^pos 形式,则基址是8的
*ERROR 143:invalid absolute bit position
Sbit 说明中位地址必须在0x80-0xff之间
*ERROR 144:base^pos:invalid bit position
Sbit 说明中位pos必须在0~7之间
*ERROR 145:undeclared sfr
Sfr 未说明
*ERROR 146:invalid sfr
绝对位地址说明(base^pos)包含无效的基地址。这个基地址必须与sfr 名相对应
*ERROR 147:object too large
对象不能超过65536(64k)字节
*ERROR 148:field not permitted in union
联合不能包含位成员,这个限制是由8051结构决定的。
*ERROR 149:function member in struct/union
结构或者联合不能包含函数类型的成员。但是指向函数的指针是允许的
*ERROR 150:bit member in struct/union
结构或者联合不能包含位类型的成员,这个限制是由8051 结构决定的
*ERROR 151:self relative struct/union
结构或者联合不能包含自身
*ERROR 152:bit field type too small for number of bits
位域声明中指定的位数超过所给原型中位的数量
*ERROR 153:named bit-field cannot have 0 width
命名的域宽度为0 错误,只有未命名的位域允许是0宽度
*ERROR 154:pro to field
无指向位域指针的类型
*ERROR 155:char/int required for fields
位域基类型要求char 或int类型,unsigned char 或unsigned int 也有效
*ERROR 156:alien permitted on function only
Alien 只能用于函数
*ERROR 157:var_parms on alien function
有变参数的函数不能用alien ,因为PL/M51函数只能用固定数量的参数
*ERROR 158:function contains unnamed parameter
函数定义的参数表中包含无名参数。无名参数只允许用于函数的原型中
*ERROR 159:type follows void
函数原型声明中可含一个空的参数表f(void)。Void后不能再用其他类型定义
*ERROR 160:void invalid
Void类型只能与指针合用或表明函数没有返回值
*ERROR 161:formal parameter ignored
函数内的外部函数引用声明使用了无类型的参数表。例如“ extern(a,b,c);”要求形参表
*ERROR 162:duplicate function-parameter
函数内参数名重复
*ERROR 163:unknown array size
一般的不管是一维数组还是多维数组或外部数组,都需要指定数组的大小,这个大小是由编
译器的初始化时计算,这个错误表明试图为一个未定维的数组使用sizeof运算符,会哦着一
个多维数组的附加元素未定义。
*ERROR 164:ptr to null
这一个错误通常是由前一个错误造成的
*ERROR 165:ptr to bit
指向位的指针不是合法的类型
*ERROR 166:array of function
数组不能包含函数,但可能包含指向函数的指针。
*ERROR 167:array of fields
位域不能安排为数组
*ERROR 168:array of bit
数组没有位类型
*ERROR 169:function returns function
函数不能返回函数,但可以返回一个指向函数的指针
*ERROR 170:function returns array
函数不能返回数组,但可返回指向数组的指针
*ERROR 171:missing enclosing swith
Break/continue 语句只能出现在for,while,do while或switch语句中间。
*ERROR 172:missing enclosing swith
Case语句只能用在switch语句中
*ERROR 173:missing return-expression
返回类型不是integer 的函数必须包含一条代表达式的return 语句。由于要与老版本兼容,
编译器对返回整形值的函数不做检查
*ERROR 174:return-expression on void-function
Void 函数不能返回值,因此不能包含带表达式return的语句
*ERROR 175:duplicate case value
每个case 语句必须包含一个常量表达式做其变量,这个值不能在switch 语句的各级中出现
*ERROR 176:more than one default
Switch语句中不能包含多于一个的default语句
*ERROR 177:different struct/union
赋值或参数传递中使用了结构/联合的不同类型
*ERROR 178:struct/union comparison illegal
根据ANSI C,两个结构或联合的比较是不允许的
*ERROR 179:cannot/cast from/to void-type
将void类型转化为其他类型数据或将其他类型转化为void类型都是非法的
*ERROR 180:cannot cast to’function’
转化为function是非法的,使用函数指针指向不同的函数
*ERROR 181:incompatible operand
在所给的运算符中至少有一个操作符类型是无效的
*ERROR 182:point to different object
报告指针使用不一致
*ERROR 183:unmodifiable value
预修改的对象位于CODE 存储区,因而不能修改
*ERROR 184:sizeof :illegal operand
Sizeof运算符不能决定函数或位域大小
*ERROR 185:different memory space
对象说明的存储空间与前面的不一致
*ERROR 186:invalid dereference
这条错误信息可能由编译器内部问题产生的
*ERROR 187:not an lvalue
所需参量必须是可变对象的地址
*ERROR 188:unknown object size
无法计算对象的大小,因为缺少数组的维数或因为通过void指针的间接访问
*ERROR 189:‘&’on bit/sfr illegal
地址操作符‘&’不允许用于位对象或sfr
*ERROR 190:’&’:not an lvalue
地质部是可变的对象,不能作为左值
*ERROR 191:‘&’on constant
试图为所列类型常数建立指针
*ERROR 192:‘&’on array/function
地址操作符&不允许用于数组或函数,函数和数组本身都代表了地址
*ERROR 193:illegal op-type(s)
*ERROR 193:illegal add/sub on ptr
*ERROR 193:illegal operation on bit(s)
*ERROR 193:bad operand type
当一个表达式使用给定运算符的非法操作类型时就会出现该错误,使用个定运算符的非法操
作类型的无效的表达式,例如bit+bit,ptr+ptr,或ptr*&any&。错误信息包括引起错误的运算符。
下列运算可使用位操作符
赋值(=)
OR/复合OR(|,|=)
AND/复合AND(&,&=)
XOR/复合XOR(^,^=)
位或常数的安位比较(= =,!=)
*ERROR 194:’*’indirection to object of unknown size
间接操作符*不能用于void指针(void*),因为指针所指的对象的大小时未知的
*ERROR 195:’*’illegal indirection
间接操作符*不能用于非指针变量
*ERROR 196:mspace probably invalid
产生此警告是因为某些常数值赋给指针并且常数没有形成一个有效的指针值,有效的指针常
数类型为long/unsigned long。编译器对指针对象采用24bit(3 字节),低16 位表示偏移,高
8 位表示存储类的选择,在低字节中,值从1 到5 表明了xdata/pdata/idata/data/和code 的存
*ERROR 197:illegal pointer assignment
试图将一个非法变量赋给指针,只有另一个指针或指针变量可以赋给指针
*ERROR 198:size of returns zero
求某些对象长度得到0,如果对象是外部的或一个数组中并非所有维的大小都是已知时得到
0,这时候该值可能是错的。
*ERROR 199:left size of’-&’requires struct/union pointer
-&操作符的左边变量必须是结构或变量
*ERROR 200:left size of ‘.’requires struct/union
操作符的左边变量必须是结构/联合
*ERROR 201:undefined struct/union tag
所给的结构/联合标记名是未知的
*ERROR 202:undefined identifier
所给的标示符未定义
*ERROR 203:bad storage class(nameref)
该错误表示编译器的内部有问题
*ERROR 204:undefined member
所给的结构/联合成员名未定义
*ERROR 205:cannot call an interrupt function
中断函数不能像普通函数那样调用,因为这种函数的头端和尾端是为中断特殊编码的
*ERROR 206:missing function-prototype
调用的函数缺少原型说明
*ERROR 207:declared with ‘void’ parameter list
用void参数说明的函数不接受调用者传来的参数
*ERROR 208:too many actual parameter
函数调用包含了多余的实参
*ERROR 209:too few actual parameter
函数调用时传递的实参过少
*ERROR 210:too many nested calls
超过了10 个函数嵌套调用的极限
*ERROR 211:call not to a function
函数调用时没有函数的地址或未对指向函数的指针赋值
*ERROR 212:indirect call with parameter
由于参数传递方法的限制,通过指针的间接函数调用不能直接作为实参。这种参数传递方法
要求被调用的函数名已知,因为参数的写入要被写入调用函数的数据段。然而间接调用时函
数的的名字时未知的
*ERROR 213:left side of assign_op not an lvalue
在赋值操作符左边要求可变的对象
*ERROR 214:cannot cast non_pointer to pointer
非指针不能转化为指针
*ERROR 215:cannot cast pointer to not_int/pointer
指针可以转化为另一个指针或整数,但不能转化为其他类型
*ERROR 216:subscript on non_array or too many dimensions
对非数组使用了下标或数组维数过多
*ERROR 217:non_integral index
数组的下标表达式必须是整型类型
*ERROR 218:void_type in controlling expression
While,for 或do while语句中表达式不能是void类型
*ERROR 219:long constant truncated to int
企图把长整型常量截断为整型数是错误的
*ERROR 220:illegal constant expression
非法常量表达式
*ERROR 221:non_constant case/dim expression
Case值或下标值([])要求用常量表达式
*ERROR 222:div by zero
*ERROR 223:mod by zero
编译器检测到0 除或0 模的错误
*ERROR 224:illegal operation on float/double
AND 和NOT一类的运算符不允许作用于float/double
*ERROR 225:expression too complex ,simplify
表达式太复杂,必须简化
*ERROR 226:duplicate struct/union/enum tag
结构/联合/枚举类型中有重复标记
*ERROR 227:not a union tag
所给的标记名虽已定义,但不是联合的标记
*ERROR 228:not a struct tag
所给的标记名虽已定义,但不是结构的标记
*ERROR 229:not an enum tag
所给的标记名虽已定义,但不是枚举的标记
*ERROR 230:unknown struct/union/enum tag
所给的结构/联合/枚举标记名未定义
*ERROR 231:redefinition
所给的名字已经定义,不能再定义
*ERROR 232:duplicate label
所给的标号已经订义
*ERROR 233:undefined label
当对函数进行分析后,编译器检查到函数有未定义的标号,发出错误信息
*ERROR 234:‘{’scope stack overflow(31)
超过了最大为31 个的功能嵌套极限,多余的块被忽略
*ERROR 235:parameter&number&:different type
函数实参类型与函数原型中的不同
*ERROR 236:different length of parameter lists
所给的函数是参量与函数原型中的不同
*ERROR 237:function already has body
试图定义已经定义过的函数
*ERROR 238:duplicate member
*ERROR 239:duplicate parameter
重复定义结构成员或函数参数
*ERROR 240:more than 128 local bit’s
位变量定义总数不能超过128
*ERROR 241:auto segment too large
局部对象要求的空间超过了该模式的最大值。最大栈长定义如下:SMALL-128 字
节,COMPACT-256字节,LARGE-64k
*ERROR 242:too many initializers
初始化对象超限
*ERROR 243:string out of bounds
串中字符数超过了字符数组要求初始化的字符数
*ERROR 244:can’t initialize .bad type or class
试图初始化位或sfr
*ERROR 245:unknown pragma, line ignored
未知的pragma 语句,因此该行被忽略
*ERROR 246:floating point error
本错误发生在浮点变量超过32 位有效字长时,32 位IEEE 格式的浮点值的取值范围是±
1.75494E-38~±3.402832E+38
*ERROR 247:non_address +/-constant initializer
有效的初始化表达式必须是非地址量+/-常量
*ERROR 248:aggregate initialization needs curly braces
所有的组合变量(数组/结构或联合)初始化时要用花括号括起来
*ERROR 249:segment&name&:segment too large
编译器检测到过大的数据段,最大数据段长取决于存储器空间
*ERROR 250:‘\esc’;value exceeds 255
串常数中\esc转义序列的值超过有效域
*ERROR 251:illegal octal digit
不是有效的八进制数字
*ERROR 252:misplace primary control、line ignored
一次性使用的编译控制伪指令必须在C模块开头指定,在#INCLUDE 语句和变量说明之前
*ERROR 253:internal ERROR(ASMGEN\CLASS)
这种错误在以下情况下发生⑴内部函数(如testbit)被不正确激活。它发生在函数原型和实
参表不存在匹配问题的时候。基于这个原因,头文件中的使用要适当(intrins.h,string.h)。
⑵C51识别出存在内部一致性错误,请向您的销售代理商查询
*ERROR 255:switch expression has illegal type
Switch语句中的case语句必须具有类型(u)char,(u)int 或(u)short,其他类型不允许(如bit)
*ERROR 256:conflicting memory model
Alien 属性的函数只能使用SMALL模式。函数的参数必须位于内部数据存储空间
*ERROR 257:alien function can not be reentrant
“alien”属性的函数不能同时具有“reentrant”属性,函数的参数不能通过重入栈传递,这也
适用于外部“alien”声明和“alien”函数
*ERROR 258:mspace illegal on struct/union member
不能为结构联合成员指定存储空间,但指向对象的指针可以
*ERROR 259:pointer: different mspace
当为指针赋值或做指针比较时,指针未指向存储在同一存储空间的对象时,会产生错误或者
警告。如:
Char xdata */*px to char in xdata memory*/
Char code */*pc to char in code memory*/
Void main()
If(px==pc)++c;/*warning 259*/
*ERROR 260:pointer truncation
指针转换时部分偏移量被截断,此时指针常量(如char xdata)转为一个具有较小偏移区的
指针(如char idata)
*ERROR 261:bit in reentrant function
重入函数不能包含位变量,因为位变量不能存于重入栈,而只能位于MCS51CPU的可位寻
址存储区中如:
Void test () reentrant
{ bit b0;/*illegal*/
Static bit b1;/*legal*/
*ERROR 262:’using/disable’: function returns bit
使用属性using选择寄存器组的函数或使用关中断(#pragma disable)功能的函数不能返回
bit类型。如:
Bit test ()using 3/*error 261*/
return(b0);
*ERROR 263:save-stack overflow/underflow
“#pragama save”最大嵌套级为8 级。Save 和restore 指令按FIFO 原则工作
*ERROR 264:intrinsic&intrinsic_name&:declaration/ activation error
内部参数定义不正确
*ERROR 265:&name&recursive call to non_reentrant function
发现非重入函数被递归调用。直接递归用生成代码可有效查出,间接递归调用由L51 发现
L51 连接定位器使用错误提示
警告并不终止L51 的执行。这时产生的程序模块由程序员自己斟酌使用还是不使用。但是
此时的列表文件和屏幕显示可能非常有用。
错误并不终止L51 的执行。这时产生的模块是不能使用的。但是此时的列表文件和屏幕显
示可能非常有用。
3 致命错误
致命错误发生时立即终止L51 的执行。
*WARNING1:UNSOLVED EXTERNAL SYMBOLS
SYMBOLS: external_name
MODULE: filename (modulename)
指定模块的外部符号在PUBLIC符号表中找不到
*WARNING2:REFERENCE MADE TO UNSOVED EXTERNAL
SYMBOLS: external_name
MODULE: filename (modulename)
ADDRESS:code_address
访问了未能匹配的外部符号code地址
*WARNING4:DATA SPACE MEMORY OVERLAP
FROM:byte,bit,address
TO: byte,bit,address
数据空间指定范围出现覆盖
*WARNING5:CODE SPACE MEMORY OVERLAP
FROM:byte,bit,address
TO: byte,bit,address
程序空间指定范围出现覆盖
*WARNING6:XDATA SPACE MEMORY OVERLAP
FROM:byte,bit,address
TO: byte,bit,address
外部数据空间指定范围出现覆盖
*WARNING7:MODULE NAME NOT UNIQUE
MODULE:filename(modulename)
模块名重名。模块未处理
*WARNING8:MODULE NAME EXPLICITLY REQUESTED FROMANOTHER FILE
MODULE:filename(modulename)
其他文件指名要求本模块名
*WARNING9:EMPTYABSOLUTE SEGMENT
MODULE:filename(modulename)
本模块包含空的绝对段,因未定位,它可能在不通知的情况下随时被覆盖
*WARNING10:CANNOT DETERMINE ROOT SEGMENT
L51 对输入文件要求分辨是C51还是PL/M文件,然后进行流程分析,在无法确定的时候,
发出本警告。它发生在主程序被汇编调用的时候,需要程序员用OVERLAP 特殊控制选项
*WARNING11:CANNOT FIND SEGMENT OR FUNCTION NAME
NAME:overlap_control_name
在目标模块中找不到OVERLAP控制选项中规定的段或者函数间调用
*WARNING12:NO REFERENCE BETWEEN SEGMENTS
SEGMENT1:segment_name
SEGMENT2:segment_name
试图用OVERLAP控制选项删除本来不存在的段间访问或者函数间调用
*WARNING13:RECURSIVE CALL TO SEGMENT
SEGMENT:segment_name
CALLER:segment_name
CALLER段递归调用SEGMENT段。PL/M51和C51的非重入函数不允许递归调用
*WARNING14:IMCOMPIABLE MEMORYMODEL
MODULE:filename(modulename)
MODEL:memory_model
指定模块试图与以前不同的存储模式编译。
*WARNING15:MULTICALL TO SEGMENT
SEGMENT:segment_name
CALLER1:segment_name
CALLER2:segment_name
两个函数调用同一个函数(如主函数和中断函数),参数和局部变量将被覆盖
*WARNING15:UNCALLED SEGMENT,IGNORED FOR OVERLAP PROCESS
SEGMENT:segment_name
所给的段未被调用,已被排除在覆盖过程之外。
*ERROR101: SEGMENT COMBINATION ERROR
SEGMENT:segment_name
MODULE:filename(modulename)
由于连接错误所给段未能连入类型总段,并被忽略
*ERROR102:EXTERN ATTRIBUTE MISMATCH
SYMBOL:external_name
MODULE:filename(modulename)
所给外部符号名属性错,并被忽略
*ERROR103:EXTERN ATTRIBUTE DO NOTMATCH PUBLIC
SYMBOL:public_name
MODULE:filename(modulename)
所给外部符号名属性与公用符号名不匹配,并被忽略
*ERROR104:MUTIPULIC DEFINITION
SYMBOL:pulic_name
MODULE:filename(modulename)
所给公用符号重名
*ERROR105:PUBLIC REFERS TO IGNORED SEGMENT
SYMBOL:public_name
MODULE:filename(modulename)
所给外部符号名属性错,并被忽略
*ERROR106: SEGMENT OVERFLOW
SEGMENT:segment_name
所给段长超过64,未处理
*ERROR107:ADDRESS SPACE OVERLAP
SPACE:space_name
SEGMENT:segment_name
由于存储空间不够,所给类型总段未能装入,已被忽略
*ERROR108:SEGMENT IN LOCATING CONTROL CANNOTALLOCATED
SEGMENT:segment_name
命令行定位控制中的段由于属性问题未能分配
*ERROR109:EMPTY RELOCATABLE SEGMENT
SEGMENT:segment_name
可在定位类型总段长度为零,未定位
*ERROR110:CANNOT FIND SEGMENT
SEGMENT:segment_name
命令行所给的段在输入模块中未找到,被忽略
*ERROR111:SPECIFIED BITADDRESS NOT ON BYTE MEMORY
SEGMENT:segment_name
位地址不在字界上,位段被忽略
*ERROR112:SEGMENT TYPE NOT LEGAL FOR COMMAND
SEGMENT:segment_name
命令行所给的段类型非法,被忽略
*ERROR114:SEGMENT DOES NOT FIT
SPACE:space_name
SEGMENT:segment_name
BASE:base_address
LENGTH: segment_length
由于所给段的长度或者基地址未定位,故被忽略
*ERROR115:INPAGE SEGMENT IS GREATER THAN 256 BYTES
SEGMENT:segment_name
所给INPAGE 属性的段长于256字节未能连入类型总段,并被忽略
*ERROR116:INBLOCK SEGMENT IS GREATER THAN 2048 BYTES
SEGMENT:segment_name
所给INBLOCK 属性的段长于2048字节未能连入类型总段,被忽略
*ERROR117:BITADDRESSABLLE SEGMENT IS GREATER THAN 16 BYTE
SEGMENT:segment_name
所给BITADDRESSABLE 属性的段长于16 字节未能连入类型总段,被忽略
*ERROR118:REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL:symbol_name
MODULE:file_name(modulename)
ADDRESS:code_address
企图访问错误的外部程序地址
*ERROR119:REFERENCE MADE TO ERRONEOUS SEGMENT
SYMBOL:symbol_name
MODULE:file_name(modulename)
ADDRESS:code_address
企图访问错误段的程序地址
*ERROR120:CONTENT BELONGS TO ERROREOUS SEGMENT
SEGMENT:segment_name
MODULE:file_name(modulename)
该内容属于有错误的段
*ERROR121:IMPROPER FIXUP
MODULE:file_name(modulename)
SEGMENTsegment_name
OFFSET:segment_name
根据所给段和偏移地址的到的是不当的地址
*ERROR122:CANNOT FIND MODULE
MODULE:file_name(modulename)
命令行所给的模块未能找到
L51 致命错误
*FATAL ERROR201:INVALID COMMAND LINE SYNTAX
Partial command line
命令行句法错。命令行显示到出错处。
*FATAL ERROR202:INVALID COMMAND LINE ,TOKEN TOO LONG
Partial command line
非法命令行,单词太长。命令行显示到出错处
*FATAL ERROR203:EXPECTED ITEM MISSING
Partial command line
缺项。命令行显示到出错处。
*FATAL ERROR204:INVALID KEYWORD
Partial command line
非法关键字
*FATAL ERROR205:CONSTANT TOO LONG
Partial command line
常量大于0xffff。命令行显示到出错处。
*FATAL ERROR206:INVALID CONSTANT
Partial command line
命令行常量无效(如16 进制数以字母开头)。命令行显示到出错处。
*FATAL ERROR207:INVALID NAME
Partial command line
模块名或段名无效。命令行显示到出错处。
*FATAL ERROR208:INVALID FILENAME
Partial command line
文件名无效。命令行显示到出错处。
*FATAL ERROR209:FILE USED IN CONLICTING CONTEXTS
FILE:filename
所给的文件名用于有矛盾之处。命令行显示到出错处。
*FATAL ERROR210:I/O ERROR ON INPUT FILE
System error message
FILE:filename
访问输入文件时检测到有错,并有后面的EXCEPTION 给出具体的错误描述
*FATAL ERROR211:I/O ERROR ON OUTPUT FILE
System error message
FILE:filename
访问输出文件时检测到有错,并有后面的EXCEPTION 给出具体的错误描述
*FATAL ERROR212:I/O ERROR ON LISTING FILE
System error message
FILE:filename
访问列表文件时检测到有错,并有后面的EXCEPTION 给出具体的错误描述
*FATAL ERROR213:I/O ERROR ONWORK FILE
System error message
FILE:filename
访问工作文件时检测到有错,并有后面的EXCEPTION 给出具体的错误描述
*FATAL ERROR214:I/O INPUT PHASE ERROR
MODULE:filename(modulename)
L51 在进行第二次扫描时遇到不同的数据发生该错误,可能是因汇编错误引起
*FATAL ERROR215:CHECK SUM ERROR
MODULE:filename(modulename)
校验和与文件内容不一致
*FATAL ERROR216:INSUFFICIENTMEMORY
MODULE:filename(modulename)
执行L51 的内存空间不够
*FATAL ERROR217:NO MODULE TO BE PROCESSED
缺少应该被处理的模块
*FATAL ERROR218:NOTAN OBJECT FILE
FILE:filename
所给文件非目标文件
*FATAL ERROR219:NOTAN 8051 OBJECT FILE
FILE:filename
所给文件非8051 目标文件
*FATAL ERROR220:INVALID INPUTMODULE
FILE:filename
所给输入模块无效,可能是由汇编错误引起的
*FATAL ERROR221:MODULE SPECIFIED MORE THAN ONCE
Partial command line
命令行上多次包含同一模块。命令行显示到出错处
*FATAL ERROR222:SEGMENT SPEXIFIED MORE THAN ONCE
Partial command line
命令行上多次包含同一段。命令行显示到出错处
*FATAL ERROR224:DUPLICATE KEYWORD OR CONFLICATING CONTROL
Partial command line
命令行上多次包含同一关键字或者存在相互矛盾的控制选项。命令行显示到出错处
*FATAL ERROR225:SEGMENTADDRESS ARE NOT IN ASCENDING ORDER
Partial command line
定位控制的段地址未按照升序显示。命令行显示到出错处
*FATAL ERROR226:SEGMENTADDRESS INVALID FOR CONTROL
Partial command line
定位控制的段的段地址无效。命令行显示到出错处
*FATAL ERROR227:PARAMETER OUT RANGE
Partial command line
所给PAGEWIDTH 和PAGELENGTH 参数越界。命令行显示到出错处
*FATAL ERROR228:PARAMETER OUT RANGE
Partial command line
命令行上RAMSIZE 参数越界。命令行显示到出错处
*FATAL ERROR229:INTERAL PROCESS ERROR
Partial command line
L51 检测到内部处理错。请询问代理商
*FATAL ERROR230:STRARTADDRESS SPECIFIED MORE THAN ONCE
Partial command line
命令行上包含多个未命名组段的起始地址。命令行显示到出错处
*FATAL ERROR233:ILLEGAL USE OF *IN OVERLAY CONTROL
Partial command line
命令行OVERLAY 定位选择非法使用了*号(如*!*或*~*)。命令行显示到出错处
E.5 异常信息
L51 某些错误的原因由系统的EXCEPTION 给出。
*EXCEPTION 0021:PATH OR FILE NOT FOUND
路径名或文件名未找到。
*EXCEPTION 0026H:ILLEGAL FILE ACCESS
试图写或者删除写保护文件。
*EXCEPTION 0029H:ACCESS FILE DENIED
所给的文件实际是目录。
*EXCEPTION 002AH:I/O-ERROR
欲写的驱动器已满或未准备好。
*EXCEPTION 0101H:ILLEGAL CONTEXT
命令行的语意非法。如对打印机进行读操作。
附录 F C51的极限值
*标示符最长255 个字符,一般取32 字符。大小写不敏感。
*case语句的变量个数没有限制,仅受可用内存容量和函数的最大长度限制。
*函数嵌套调用最大深度为10。
*功能块{….}最大嵌套深度为15。
*宏最多嵌套为8。
*函数以及宏的参数最多为32个。
*语句行和宏定义最多510 个字符(宏扩展后是510个字符)
*头文件嵌套深度为20。
*预处理器中的条件编译层最多为20。
*关于INTEL目标模块格式(OMF-51)的极限值。
*函数类型段总和最多256 个。
*全局符号(PUBLIC)最多256 个。
*外部符号(EXTERNAL)最多256 个。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:

我要回帖

更多关于 keil 条件编译 的文章

 

随机推荐