c语言移位小bug一枚。不知道是我还是编译器的问题
在avr stdio中定义 temp为 unsigned int temp=0; 局部变量
temp1=0x79
temp=temp1;
temp=temp<<16;
USART_Transmit(temp>>16);
串口发回的结果 0x00
若 temp1=0x79
temp=temp1;
temp=temp<<8
USART_Transmit(temp>>8);
则返回正常 0x79
貌似c语法没错吧。 (⊙o⊙)…
搞定了
默认 int为2字节
改 long ok了
神奇的gcc 发展了这么多年,普通用户遇到编译器 bug的几率,几乎为 0。。。。。。 aureole 发表于 2012-12-12 20:45 static/image/common/back.gif
发展了这么多年,普通用户遇到编译器 bug的几率,几乎为 0。。。。。。
对的,,,,,,,,不过还是小郁闷啊。原来arm默认int都是32位的。。
还有 mega48 rom太小了,没写几句,就要装不下了。 还有个问题。。。。。。。。。。。。。。定义了的函数,没有调用,gcc都要编译的?????????
aureole 发表于 2012-12-12 20:45 static/image/common/back.gif
发展了这么多年,普通用户遇到编译器 bug的几率,几乎为 0。。。。。。
这个不是的,新的处理器架构,新的编译器,出错的概率,唉。。。。。
msp430出新架构的时候,IAR5.x和TI自己的ccs编译都出错。升级以下就都好啦。
这个bug已经被TI确定啦,刚好被我碰上,太郁闷啦。
其它的我也没遇到。 canopen 发表于 2012-12-12 20:55 static/image/common/back.gif
对的,,,,,,,,不过还是小郁闷啊。原来arm默认int都是32位的。。
还有 mega48 rom太小了,没写几句 ...
ARM是32位的,int都是32位的,8位机的int一般都是16位的。 RUANJI 发表于 2012-12-12 21:17 static/image/common/back.gif
ARM是32位的,int都是32位的,8位机的int一般都是16位的。
我用到16位时,都是定义成short型,好像这个在几个平台上都是16位。
在新的平台上,还是测试一下比较好。 嗯
好操蛋啊。。。。。。。。
试了3钟办法做这个运算。。。。。。。。。。。。。结果rom ram都不够用。。。。。。。。
/*
dT = d2 - Prom*pow(2,8);
OFF = Prom*pow(2,17) + dT*Prom/pow(2,6);
SENS = Prom*pow(2,16) + dT*Prom/pow(2,7);
T = (2000+(dT*Prom)/pow(2,23))/100.0;
P = (((d1*SENS)/pow(2,21) - OFF)/pow(2,15))/100.0;
*/
/*
dT = d2 - Prom*256;
OFF = Prom*131072 + dT*Prom/64;
SENS = Prom*65536 + dT*Prom/128;
T = (2000+(dT*Prom)/8388608)/100.0;
P = (((d1*SENS)/2097152 - OFF)/32768)/100.0;
*/
/*
dT = d2 - Prom*(1<<8);
OFF = Prom*(1<<17) + dT*Prom/(1<<6);
SENS = Prom*(1<<16) + dT*Prom/(1<<7);
T = (2000+(dT*Prom)/(1<<23))/100.0;
P = (((d1*SENS)/(1<<21) - OFF)/(1<<15))/100.0;
*/
看来mega48不怎么适合写复杂点的程序。。。。
{:mad:} 几句话。。。。。。。。。。。内存占去接近300字节。。。。。。。rom用了 3K左右。╮(╯▽╰)╭
无语了
无语,拿杀鸡刀宰牛,却怪杀鸡刀不好用 好吧。。。。。。。。。。。。
其实avr也蛮好用的。。。。。。。。。 你把单片机当台式机用,当然不够用啦。 楼主这种计算方法单片机能够计算成功就证明AVR很NB了,很多MCU复杂点的运算得分拆出来计算. 要编译时第一件事就是看编译器手册, 查一下先. 标准规定int至少和short一样大, 没说就一定是32位的, 另外楼主用 long, DSP 的 long 还有是40字节的. 所以你这个还是有点小问题.
楼主可以试试把优化等级开到最高试试????可以查GCC手册看怎么优化到最好. 我也是初学, 希望能帮到你. 建议楼主优化一下算法,8位机不能当32位机用的{:biggrin:} 嗯,优化等级高了,还是装不下。
直接把数据发给电脑,让电脑自己去处理吧{:lol:} 我也是碰到这事,用的是STM8单片机,环境STVD
原来是
OutCache |= (1<<i);
OutCache &= ~(1<<i);
改为就可以了
OutCache |= ((u32)1<<i);
OutCache &= ~((u32)1<<i); 试试temp=(unsigned char)temp1; 这不是BUG啊,正常的很
页:
[1]