canopen 发表于 2012-12-12 20:42:00

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语法没错吧。

canopen 发表于 2012-12-12 20:42:58

(⊙o⊙)…
搞定了
默认 int为2字节
改 long ok了
神奇的gcc

aureole 发表于 2012-12-12 20:45:27

发展了这么多年,普通用户遇到编译器 bug的几率,几乎为 0。。。。。。

canopen 发表于 2012-12-12 20:55:46

aureole 发表于 2012-12-12 20:45 static/image/common/back.gif
发展了这么多年,普通用户遇到编译器 bug的几率,几乎为 0。。。。。。

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

canopen 发表于 2012-12-12 20:57:43

还有个问题。。。。。。。。。。。。。。定义了的函数,没有调用,gcc都要编译的?????????

USACH 发表于 2012-12-12 20:58:30

aureole 发表于 2012-12-12 20:45 static/image/common/back.gif
发展了这么多年,普通用户遇到编译器 bug的几率,几乎为 0。。。。。。

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

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


其它的我也没遇到。

RUANJI 发表于 2012-12-12 21:17:12

canopen 发表于 2012-12-12 20:55 static/image/common/back.gif
对的,,,,,,,,不过还是小郁闷啊。原来arm默认int都是32位的。。
还有 mega48 rom太小了,没写几句 ...

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

laujc 发表于 2012-12-12 21:35:33

RUANJI 发表于 2012-12-12 21:17 static/image/common/back.gif
ARM是32位的,int都是32位的,8位机的int一般都是16位的。

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

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

canopen 发表于 2012-12-12 21:39:33




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

试了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:}

canopen 发表于 2012-12-12 21:40:31

几句话。。。。。。。。。。。内存占去接近300字节。。。。。。。rom用了 3K左右。╮(╯▽╰)╭


无语了

8s209 发表于 2012-12-12 21:50:45

无语,拿杀鸡刀宰牛,却怪杀鸡刀不好用

canopen 发表于 2012-12-12 23:24:22

好吧。。。。。。。。。。。。
其实avr也蛮好用的。。。。。。。。。

duanll 发表于 2012-12-13 09:02:10

你把单片机当台式机用,当然不够用啦。

zhonggp 发表于 2012-12-13 09:06:35

楼主这种计算方法单片机能够计算成功就证明AVR很NB了,很多MCU复杂点的运算得分拆出来计算.

monkerman 发表于 2012-12-13 09:20:00

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

gao_hailong 发表于 2012-12-13 09:31:23

建议楼主优化一下算法,8位机不能当32位机用的{:biggrin:}

canopen 发表于 2012-12-13 10:40:10

嗯,优化等级高了,还是装不下。
直接把数据发给电脑,让电脑自己去处理吧{:lol:}

n_mos 发表于 2012-12-26 15:55:10

我也是碰到这事,用的是STM8单片机,环境STVD
原来是
OutCache |= (1<<i);
OutCache &= ~(1<<i);
改为就可以了
OutCache |= ((u32)1<<i);
OutCache &= ~((u32)1<<i);

logsoft 发表于 2012-12-27 03:07:08

试试temp=(unsigned char)temp1;

qwermhb 发表于 2012-12-27 10:09:49

这不是BUG啊,正常的很
页: [1]
查看完整版本: c语言移位小bug一枚。不知道是我还是编译器的问题