搜索
bottom↓
回复: 19

c语言移位小bug一枚。不知道是我还是编译器的问题

[复制链接]

出0入0汤圆

发表于 2012-12-12 20:42:00 | 显示全部楼层 |阅读模式
在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语法没错吧。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-12-12 20:42:58 | 显示全部楼层
(⊙o⊙)…
搞定了
默认 int为2字节
改 long ok了
神奇的gcc

出0入0汤圆

发表于 2012-12-12 20:45:27 | 显示全部楼层
发展了这么多年,普通用户遇到编译器 bug的几率,几乎为 0。。。。。。

出0入0汤圆

 楼主| 发表于 2012-12-12 20:55:46 | 显示全部楼层
aureole 发表于 2012-12-12 20:45
发展了这么多年,普通用户遇到编译器 bug的几率,几乎为 0。。。。。。

对的,,,,,,,,不过还是小郁闷啊。原来arm默认int都是32位的。。
还有 mega48 rom太小了,没写几句,就要装不下了。

出0入0汤圆

 楼主| 发表于 2012-12-12 20:57:43 | 显示全部楼层
还有个问题。。。。。。。。。。。。。。定义了的函数,没有调用,gcc都要编译的?????????

出0入0汤圆

发表于 2012-12-12 20:58:30 | 显示全部楼层
aureole 发表于 2012-12-12 20:45
发展了这么多年,普通用户遇到编译器 bug的几率,几乎为 0。。。。。。

这个不是的,新的处理器架构,新的编译器,出错的概率,唉。。。。。

msp430出新架构的时候,IAR5.x和TI自己的ccs编译都出错。升级以下就都好啦。
这个bug已经被TI确定啦,刚好被我碰上,太郁闷啦。


其它的我也没遇到。

出0入0汤圆

发表于 2012-12-12 21:17:12 | 显示全部楼层
canopen 发表于 2012-12-12 20:55
对的,,,,,,,,不过还是小郁闷啊。原来arm默认int都是32位的。。
还有 mega48 rom太小了,没写几句 ...

ARM是32位的,int都是32位的,8位机的int一般都是16位的。

出0入4汤圆

发表于 2012-12-12 21:35:33 | 显示全部楼层
RUANJI 发表于 2012-12-12 21:17
ARM是32位的,int都是32位的,8位机的int一般都是16位的。

我用到16位时,都是定义成short型,好像这个在几个平台上都是16位。

在新的平台上,还是测试一下比较好。

出0入0汤圆

 楼主| 发表于 2012-12-12 21:39:33 | 显示全部楼层



好操蛋啊。。。。。。。。

试了3钟办法做这个运算。。。。。。。。。。。。。结果rom ram都不够用。。。。。。。。
/*
        dT = d2 - Prom[5]*pow(2,8);
        OFF = Prom[2]*pow(2,17) + dT*Prom[4]/pow(2,6);
        SENS = Prom[1]*pow(2,16) + dT*Prom[3]/pow(2,7);
        T = (2000+(dT*Prom[6])/pow(2,23))/100.0;
        P = (((d1*SENS)/pow(2,21) - OFF)/pow(2,15))/100.0;
*/
/*
        dT = d2 - Prom[5]*256;
        OFF = Prom[2]*131072 + dT*Prom[4]/64;
        SENS = Prom[1]*65536 + dT*Prom[3]/128;
        T = (2000+(dT*Prom[6])/8388608)/100.0;
        P = (((d1*SENS)/2097152 - OFF)/32768)/100.0;
       
*/
/*
        dT = d2 - Prom[5]*(1<<8);
        OFF = Prom[2]*(1<<17) + dT*Prom[4]/(1<<6);
        SENS = Prom[1]*(1<<16) + dT*Prom[3]/(1<<7);
        T = (2000+(dT*Prom[6])/(1<<23))/100.0;
        P = (((d1*SENS)/(1<<21) - OFF)/(1<<15))/100.0;
*/

看来mega48不怎么适合写复杂点的程序。。。。

出0入0汤圆

 楼主| 发表于 2012-12-12 21:40:31 | 显示全部楼层
几句话。。。。。。。。。。。内存占去接近300字节。。。。。。。rom用了 3K左右。╮(╯▽╰)╭


无语了

出0入0汤圆

发表于 2012-12-12 21:50:45 来自手机 | 显示全部楼层
无语,拿杀鸡刀宰牛,却怪杀鸡刀不好用

出0入0汤圆

 楼主| 发表于 2012-12-12 23:24:22 | 显示全部楼层
好吧。。。。。。。。。。。。
其实avr也蛮好用的。。。。。。。。。

出0入0汤圆

发表于 2012-12-13 09:02:10 | 显示全部楼层
  你把单片机当台式机用,当然不够用啦。

出0入0汤圆

发表于 2012-12-13 09:06:35 | 显示全部楼层
楼主这种计算方法单片机能够计算成功就证明AVR很NB了,很多MCU复杂点的运算得分拆出来计算.

出0入0汤圆

发表于 2012-12-13 09:20:00 | 显示全部楼层
要编译时第一件事就是看编译器手册, 查一下先. 标准规定int至少和short一样大, 没说就一定是32位的, 另外楼主用 long, DSP 的 long 还有是40字节的. 所以你这个还是有点小问题.
楼主可以试试把优化等级开到最高试试????可以查GCC手册看怎么优化到最好. 我也是初学, 希望能帮到你.

出0入0汤圆

发表于 2012-12-13 09:31:23 | 显示全部楼层
建议楼主优化一下算法,8位机不能当32位机用的

出0入0汤圆

 楼主| 发表于 2012-12-13 10:40:10 | 显示全部楼层
嗯,优化等级高了,还是装不下。
直接把数据发给电脑,让电脑自己去处理吧

出0入0汤圆

发表于 2012-12-26 15:55:10 | 显示全部楼层
我也是碰到这事,用的是STM8单片机,环境STVD  
原来是
OutCache |= (1<<i);
OutCache &= ~(1<<i);
改为就可以了
OutCache |= ((u32)1<<i);
OutCache &= ~((u32)1<<i);

出0入0汤圆

发表于 2012-12-27 03:07:08 来自手机 | 显示全部楼层
试试temp=(unsigned char)temp1;

出0入0汤圆

发表于 2012-12-27 10:09:49 | 显示全部楼层
这不是BUG啊,正常的很
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 06:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表