Keil C51注意事项

作者

QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118

参考

***WARNING L15: MULTIPLE CALL TO SEGMENT
呵,你会51单片机的精确延时吗?

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空间和去除编译告警,
3
然后,
4
前后对比,

Program Size: data=21.6 xdata=3413 code=58108
Program Size: data=21.6 xdata=2763 const=0 code=43872

节省代码空间

66

数据类型

在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;
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值