作者
QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118
参考
MULTIPLE CALL TO FUNCTION
这是因为我在main,timer0和timer3的中断函数都调用了一个STC库函数PWMx_SetPwmWide_int
导致的,参考***WARNING L15: MULTIPLE CALL TO SEGMENT,采用了一个比较笨的方法,将函数PWMx_SetPwmWide_int
拷贝了两遍分别用于timer0和timer3的中断函数。
UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS
解决无用代码占用ROM空间和去除编译告警,
然后,
前后对比,
Program Size: data=21.6 xdata=3413 code=58108
Program Size: data=21.6 xdata=2763 const=0 code=43872
节省代码空间
数据类型
在keil C51或者iar for c8051编译器下,
- int 占两个字节 范围:-32768~+32767
- long占四个字节 范围:-2147483648~+2147483647
- float占四个字节 范围:3.40E+38 ~ +3.40E+38
- double占8个字节 范围:-1.79E+308 ~ +1.79E+308
printf
STC8A单片机,Keil4,下面的printf会错乱,
printf("int[%d]:%d\r\n", i, vali);
printf("float[%d]:%f\r\n", f, valf);
只有一个参数不会,
printf("int:%d\r\n", vali);
printf("float:%f\r\n", valf);
int用d,long使用ld来打印,如果把数据类型由int升级到long,要记得把d改成ld,否则打印出错。
sprintf
格式和数据类型必须一一对应,否则乱码,
%d -> int
%lu -> unsigned long
Keil 0xfd问题
Keil编辑器设置Ascii编码,字符串中输入中文直接显示,发现汉字待和过乱码,这两个字均包含0xfd,在字符串中添加0xfd即可,
"待\xfd机 ",
后续发现这是Keil的bug,需要打补丁。
数据溢出
这样的写法ccpCount1[0] = ((ccpCfCnt - ccpCfCntBase[0]) << 16) + (CCAP0H << 8) + CCAP0L;
数据会溢出,
//ccpCount1[0] = ((ccpCfCnt - ccpCfCntBase[0]) << 16) + (CCAP0H << 8) + CCAP0L;
ccpCount1[0] = (ccpCfCnt - ccpCfCntBase[0]);
ccpCount1[0] <<= 8;
ccpCount1[0] += CCAP0H;
ccpCount1[0] <<= 8;
ccpCount1[0] += CCAP0L;