共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |