对dsPIC系列单⽚机C语⾔编程中乘除法计算的编程感悟个⼈使⽤单⽚机有些时间了,尤其是在这个快速变化的时代,数字编程已经是⼯科⽣必备的素养了。
虽然说单⽚机现在也⽀持C语⾔编程了,但是和计算机的C语⾔编程也存在⼀些差异,尤其是在进⾏数据乘除法计算的时候。
有些单⽚机不⼀定使⽤的标准C语⾔编译器,请注意不同单⽚机的编程风格,具体请
单⽚机从以前的汇编,逐渐⽀持C语⾔编译器,但是可能⽀持部分C语⾔,不⼀定是标准的C语⾔编译器。
以dsPIC单⽚机为例,以下有两种C语⾔除法编程风格:
uint16_t a;
uint16_t temp;
uint16_t b;
//example 1:标准C语⾔编译器的除法
b = (a << 10)/1023;
//example 2: dsPIC 单⽚机⽀持的乘法与除法
temp = __builtin_muluu(a,1024);
b = __builtini_divud(temp,1023);
上⾯两种写法,第⼀种计算结果是正确的,只有第⼆种写法在dsPIC单⽚机上才能得到正常的结果。
根本的原因在于编译器对整形乘除数据,处理⽅式不⼀样。
以下有两种C语⾔乘法编程风格:
uint16_t a;
uint16_t b;
long c;
long d;
c语言编译器ide代码编辑a = 32676;
b = 32676;
//example 1: 标准C语⾔的⽆符号整数乘法
c = a * b;
//example 2: dsPIC内部⾃带的⽆符号整数乘法
d = __builtin_muluu(a,b);
uint16_t a;
uint16_t b;
long c;
long d;
a = 256;
b = 256;
/
/example 3: 标准C语⾔的⽆符号整数乘法
c = a * b;
//example 4: dsPIC内部⾃带的⽆符号整数乘法
d = __builtin_muluu(a,b);
上⾯两种写法,第⼀种计算的结果是错误的,第⼆种计算的结果是正确的。
原因是dsPIC单⽚机没有合适的⼯作寄存器来存储a*b的值。所以计算结果不同。
当a*b的值⼩于65535时,两种计算⽅式的计算结果都是正确的。
uint16_t a;
uint16_t b;
long c;
long d;
a = 100;
b = 100;
//example 5: 标准C语⾔的⽆符号整数乘法
c = a * b;
//example 6: dsPIC内部⾃带的⽆符号整数乘法
d = __builtin_muluu(a,b);
uint16_t a;
uint16_t b;
long c;
long d;
a = 256;
b = 255;
//example 7: 标准C语⾔的⽆符号整数乘法
c = a * b;
//example 8: dsPIC内部⾃带的⽆符号整数乘法
d = __builtin_muluu(a,b);
C语⾔编译器的不同,对于a*b结果的中间⼯作寄存器不同,导致标准C语⾔的写法在单⽚机上不能正确的编译。
为了以后的⼯作中少⾛弯路,学弟学妹们,
请优先学习该单⽚机的官⽅的参考⽂档;
请优先使⽤内部⾃带的函数;
请优先学习官⽅IDE的Help⽂档;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论