共4条
1/1 1 跳转至页
GCC,ICC,BUG 今天开始看和学GCC,实在收不了ICC的BUG了。。
问
答 1:
是了,GCCAVR有没有语法介绍的资料,感觉有点和标准C不同啊
答 2:
这两天我也在把以前写的代码移到CVAVR上.一个字:爽!
编译效率确实高了,而且自带的库函数非常好用!
ICC 真是...虽然好入门,但是BUG之多,忍无可忍... 答 3: GCC的文档在C:/WinAVR/doc/gnu/gcc下面。
其中的C-Extensions.html给出了GCC扩充的功能。
当然,最基本的是,GCC是ANSI兼容的。
对AVR处理器而言,硬件的特殊之处要看C:\WinAVR\doc\AVR-libc下面的文档。 答 4: 学用gcc在线汇编感觉有点怪怪的…… 答 5: 我强烈推荐你使用cvAVR 答 6: GCC, 绝对的趋势,每半年必有更新。 答 7: 是不是哦~~~ 答 8: 到http://sourceforge.net/projects/winAVR看看吧。如果你实在等不及,自己编译一个GCC出来吧:
http://www.gnu.org/software/gcc/gcc.html 答 9: 试着写了个I2c的gcc,只进行主控读写编译了一下,2,5K多!!!,虽然比以前汇编写的更完善了点,但也大多了,我用的M8才8K……,我想可能是刚学用c写程序,很多地方还不明白,以至于多了不少没用的代码。听说写c程序有不少窍门,可以提高代码的效率,比如用#ifdef之类的替换if,还有头文件的引入等,各位C高手们能不能提示一下啊!
多谢 先了! 答 10: Anitya:代码效率不能这样比在同一种芯片上,完成相同的任务,试着自己写一段汇编,再写一段等价的C程序,用不同的编译器编译后看一下产生的lst文件,看看编译器输出的结果和你手工写出的汇编码有多大区别?我想GCC的输出结果应该会让你满意的。
GCC编译输出的机器码中含初始化和退出代码,单纯看字节数是不公正的。 答 11: 多谢mxh0506的指点我去看了一下c生成的.lss和.lst文件两个文件,但是.lst看不大懂,对我来说可以说是乱七八糟的一堆东西,好不容易找了个汇编命令,可是看过去格式又好象不对,一些奇怪的变量名、符号,汇编中没这样用的。.lss文件还不错,看得比较明白,但发现了个问题:我手头上有一本介绍gcc的书,上面说gcc函数调用规则是函数的参数由左到右分配给R25-R8,但看到.lss中,有的函数有按照这样的规则,不过更多的好象是从R24开始,比如我的一个函数:
int TW_Read_Byte(uint8_t addr,uint8_t len,uint8_t *buf)
调用时
uint8_t count=TW_Read_Byte(0x00,0x20,buf);
编译成
388: ae 01 movw r20, r28
38a: 4f 5f subi r20, 0xFF ; 255
38c: 5f 4f sbci r21, 0xFF ; 255
38e: 60 e2 ldi r22, 0x20 ; 32
390: 80 e0 ldi r24, 0x00 ; 0
而且R23好象也漏了~~,是我理解错误?还是程序会自动选择? 答 12: C语言在进行函数调用/返回以及表达式计算时所有短于int类型宽度的数据类型首先会转化为int,因此空了r23。
关于这条规则,请看我刚贴的《C语言表达式中的int规则》。
答 13: 去看看先
编译效率确实高了,而且自带的库函数非常好用!
ICC 真是...虽然好入门,但是BUG之多,忍无可忍... 答 3: GCC的文档在C:/WinAVR/doc/gnu/gcc下面。
其中的C-Extensions.html给出了GCC扩充的功能。
当然,最基本的是,GCC是ANSI兼容的。
对AVR处理器而言,硬件的特殊之处要看C:\WinAVR\doc\AVR-libc下面的文档。 答 4: 学用gcc在线汇编感觉有点怪怪的…… 答 5: 我强烈推荐你使用cvAVR 答 6: GCC, 绝对的趋势,每半年必有更新。 答 7: 是不是哦~~~ 答 8: 到http://sourceforge.net/projects/winAVR看看吧。如果你实在等不及,自己编译一个GCC出来吧:
http://www.gnu.org/software/gcc/gcc.html 答 9: 试着写了个I2c的gcc,只进行主控读写编译了一下,2,5K多!!!,虽然比以前汇编写的更完善了点,但也大多了,我用的M8才8K……,我想可能是刚学用c写程序,很多地方还不明白,以至于多了不少没用的代码。听说写c程序有不少窍门,可以提高代码的效率,比如用#ifdef之类的替换if,还有头文件的引入等,各位C高手们能不能提示一下啊!
多谢 先了! 答 10: Anitya:代码效率不能这样比在同一种芯片上,完成相同的任务,试着自己写一段汇编,再写一段等价的C程序,用不同的编译器编译后看一下产生的lst文件,看看编译器输出的结果和你手工写出的汇编码有多大区别?我想GCC的输出结果应该会让你满意的。
GCC编译输出的机器码中含初始化和退出代码,单纯看字节数是不公正的。 答 11: 多谢mxh0506的指点我去看了一下c生成的.lss和.lst文件两个文件,但是.lst看不大懂,对我来说可以说是乱七八糟的一堆东西,好不容易找了个汇编命令,可是看过去格式又好象不对,一些奇怪的变量名、符号,汇编中没这样用的。.lss文件还不错,看得比较明白,但发现了个问题:我手头上有一本介绍gcc的书,上面说gcc函数调用规则是函数的参数由左到右分配给R25-R8,但看到.lss中,有的函数有按照这样的规则,不过更多的好象是从R24开始,比如我的一个函数:
int TW_Read_Byte(uint8_t addr,uint8_t len,uint8_t *buf)
调用时
uint8_t count=TW_Read_Byte(0x00,0x20,buf);
编译成
388: ae 01 movw r20, r28
38a: 4f 5f subi r20, 0xFF ; 255
38c: 5f 4f sbci r21, 0xFF ; 255
38e: 60 e2 ldi r22, 0x20 ; 32
390: 80 e0 ldi r24, 0x00 ; 0
而且R23好象也漏了~~,是我理解错误?还是程序会自动选择? 答 12: C语言在进行函数调用/返回以及表达式计算时所有短于int类型宽度的数据类型首先会转化为int,因此空了r23。
关于这条规则,请看我刚贴的《C语言表达式中的int规则》。
答 13: 去看看先
共4条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |