带Arduino的Avr GCC

带Arduino的Avr GCC,c,ubuntu,arduino-uno,avr-gcc,C,Ubuntu,Arduino Uno,Avr Gcc,如何在Ubuntu上用C语言编程我的Arduino。我听说过avr gcc,但所有的在线教程似乎都非常乏味,而且没有带Arduino引导加载程序的avr芯片选项。有谁能帮我在Ubuntu上安装avr gcc并开始用C为Arduino编程 我推荐以下一组用于编译的命令行选项: avr-gcc -c -std=gnu99 -Os -Wall -ffunction-sections -fdata-sections -mmc

如何在Ubuntu上用C语言编程我的Arduino。我听说过avr gcc,但所有的在线教程似乎都非常乏味,而且没有带Arduino引导加载程序的avr芯片选项。有谁能帮我在Ubuntu上安装avr gcc并开始用C为Arduino编程

我推荐以下一组用于编译的命令行选项:

avr-gcc -c
        -std=gnu99
        -Os
        -Wall
        -ffunction-sections -fdata-sections
        -mmcu=m328p
        -DF_CPU=16000000
以及连结:

avr-gcc -Os
        -mmcu=m328p
        -ffunction-sections -fdata-sections
        -Wl,--gc-sections
在哪里

  • -c
    表示“仅编译到对象文件,不链接”
  • -std=gnu99
    表示“我的代码符合C99,我使用GNU扩展”
  • -Os
    的意思是“优化可执行文件的大小而不是代码速度”
  • -Wall
    表示“打开(几乎)所有警告”
  • -ffunction sections-fdata sections
    对于
    -Wl,--gc sections
    优化是必需的
  • -mmcu=m328p
    表示“MCU零件号为ATmega 328P”
  • -DF_CPU=16000000
    表示“时钟频率为16 MHz”(根据实际时钟频率进行调整)
  • -Wl,--gc sections
    的意思是“告诉链接器删除未使用的函数和数据节”(这有助于减少代码大小)
为了实际编译代码,首先要发出带有“仅编译标志”的
avr gcc
命令,如下所示:

avr-gcc -c -std=gnu99 <etc.> MyProgram.c -o MyProgram.o
最后,您需要AVRdude将十六进制文件的内容上传到MCU:

avrdude -C /path/to/avrdude.conf
        -p m328p
        -c PROGRAMMER_NAME
        -b 19600
        -P PORT_NAME
        -U flash:w:TheExecutable.ihex:i
在哪里

  • -C/path/to/avrdude.conf
    表示“将此文件用作配置文件”
  • -c PROGRAMMER\u NAME
    的意思是“我正在使用一个类型为PROGRAMMER\u NAME的程序员”(根据您使用的程序员类型,您需要自己填写)
  • -b 19600
    是波特率(您可能需要根据设置的波特率或已预编程到引导加载程序中的波特率进行调整)
  • -P PORT_NAME
    表示“程序员已连接到PORT_NAME”。在Linux上,它通常类似于
    /dev/ttyusbN
    ,其中N是一些数字
  • -U flash:w:TheExecutable.ihex:i
    表示“将Intel十六进制格式的TheExecutable.ihex的内容写入闪存”

如果您只想将C代码与已安装引导加载程序的Arduino一起使用。您可以在ArduinoIDE中用C编写代码,并像往常一样进行编译。草图实际上是一组头文件和宏

这是用C写的眨眼示意图:

#include <avr/io.h> //defines pins, ports etc
#include<util/delay.h> //functions for wasting time

int main (void) {
//init
DDRB |= (1<<PB5); //Data Direction Register B:
//writing a 1 to the Pin B5 bit enables output
//Event loop
  while (1) {
    PORTB = 0b00100000; //turn on 5th LED bit/pin in PORT B (Pin13 in Arduino)
    _delay_ms (1000); //wait

    PORTB = 0b00000000; //turn off all bits/pins on PB    
    _delay_ms (1000); //wait
  } //end loop
  return(0); //end program. This never happens.
}
#包括


祝你好运,玩得开心:)

你为什么要这样?您已经在Arduino IDE中用C编程了。是否有任何东西只能通过手动编译C代码来实现?我建议坚持使用Arduino IDE。@adam10603例如,如果有人不喜欢Arduino IDE,那么它对Java的依赖性;也许他想把这个项目与另一个构建系统(例如make)等集成在一起。有很多原因你想做。@ AdUn0.603的ARDUINO语言非常类似于C++,但是我试图用C编程,因为我想从嵌入式C.@ ADAM10603开始,我喜欢C在所有平台上提供的手动内存控制。您仍然可以使用
malloc
free
以及Arduino IDE中的指针,它们的工作方式相同。非常感谢。然而,我必须询问在哪里下载和安装一个运行正常的AVRCC版本。编译和链接之间有什么区别?此外,此设置是否适用于预装Arduino引导加载器的Atmega芯片?@ApplicationDeveloper“在哪里下载并安装运行正常的avr gcc版本”—只需谷歌一下即可。“编译和链接之间有什么区别?”——说来话长,用谷歌搜索就知道了。“此设置是否适用于预装Arduino引导加载程序的Atmega芯片?”–是的。感谢您所做的一切。
avrdude -C /path/to/avrdude.conf
        -p m328p
        -c PROGRAMMER_NAME
        -b 19600
        -P PORT_NAME
        -U flash:w:TheExecutable.ihex:i
#include <avr/io.h> //defines pins, ports etc
#include<util/delay.h> //functions for wasting time

int main (void) {
//init
DDRB |= (1<<PB5); //Data Direction Register B:
//writing a 1 to the Pin B5 bit enables output
//Event loop
  while (1) {
    PORTB = 0b00100000; //turn on 5th LED bit/pin in PORT B (Pin13 in Arduino)
    _delay_ms (1000); //wait

    PORTB = 0b00000000; //turn off all bits/pins on PB    
    _delay_ms (1000); //wait
  } //end loop
  return(0); //end program. This never happens.
}