主要是日常的一些繁琐的编程问题,死活查不出来,个人新手,如果有问题或者不全面,请指正!
一、指针部分
1、同时定义两个指针注意
C语言语法规则。
int* a,b; //a为指针,b不为指针
2、指针和普通变量定义和赋值先后注意
原因暂未知。
错误示例
uchar led_wr(uchar num){ //错误,Keil C51编译器报错,左值错误
uchar* xdata i;
i=0xe000; //先定义和初始化指针
uchar code led_num[12]= //后定义数组变量
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x00,0xff};
*i=led_num[num];
return 0;
}
正确示例
uchar led_wr(uchar num){ //Keil C51编译器编译通过
uchar code led_num[12]= //先定义数组变量
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x00,0xff};
uchar* xdata i;
i=0xe000; //后定义和初始化指针
*i=led_num[num];
return 0;
}
3、C51中,定义外部存储指针数据注意
对C语言指针符号“*”,认识不深入。
char * xdata p=0x0000; //表示指针p本身在外部存储地址空间,而非指针指向的内容
char xdata * p=0x0000; //表示指针p指向的内容在外部存储地址空间,即常用的寻址外部地址指令用法。
二、C51代码部分(keil u5编译器)
1、数码管显示子函数内加入自定义的延时函数(原目的是想延时让数字显示暂留一定时间,让人眼可见……结果想多了),会导致proteus仿真异常(无显示或者显示全亮异常)。
暂解决办法:扫描显示子函数内不加延时函数,直接快速扫描显示。或者减少子函数内运行时长(精简复杂语句和循环体之类的高开销语句)
原因,暂认为是C51子函数不能负担太多指令和运行时间。
(顺带说一句,keil5编译好差劲,要么显示莫名其妙的语法错误……本人C语言底子也不好,要么直接不显示错误……这就是编译器问题了搞得我头疼,proteus仿真也很差,单片机程序运行结果真的很“飘忽不定”,因为一遍一遍测试,同一个代码结果就是不同……我都不敢看仿真结果了,所以仿真只能当前期的简陋测试吧,别太较真)
2、写了代码但是完全没执行结果,我找了半天,可能是变量定义在子函数文件里用不了啦,可能是没把子函数声明在头文件里啦,可能是子函数声明出岔子啦……但编译器一直没报错,郁闷……
原因:子函数的C源文件没添加到工程里!(对自己无语……)
子函数虽然在头文件里正确声明了,但函数本身文件未添加到工程,编译器确实不会报错,只当这个子函数是个空函数,什么都不做。
我经常把子函数尽量孤立的写入独立源文件,以方便各个程序工程之间增删使用,所以子函数一多也就可能忘了添加进当前工程,导致这个问题现象,真是粗心。
三、keil在线调试部分
1、简单的做了个程序框架,子函数都是空函数,编译没问题,但在线调试老是运行不下去,每到一个空子函数就调回程序头,或者卡在STARTUP.A51启动文件里死循环不出来。
找了半天原因,原来是我使用了空的字函数原因。每次运行到字函数体,便会转到STARTUP.A51启动文件的一个固定代码处,然后就……不知道怎么开始卡在那里死循环了。
查的这个博客,作者博客总结了很多调试问题和解决办法,挺靠谱我就搬过来:《Keil使用Debug调试模式时出现的几种错误总结》https://www.cnblogs.com/lucky-3/p/11176515.html。 里面有一个问题描述,和我的问题状况相符:
“4.在debug模式下进行调试时,发现程序没有从main函数进行运行,而是一直在汇编代码BKPT那里停下,当点复位时,到了systemInit那里”
“3).程序中存在的问题,就好比上述使用了未实现 printf() 函数或未实现的函数、条件宏等;”
“我的问题就出在第三点,函数中使用了printf函数,但是没有在Target Options Configure的Target那栏里把Use MicroLIB这个选项选择上。之后将其选择上编译下载程序,就能在debug下进入到main函数。”