【问题标题】:Avr-GCC with ArduinoAvr-GCC 与 Arduino
【发布时间】:2015-12-01 13:13:19
【问题描述】:

如何在 Ubuntu 上使用 C 语言对我的 Arduino 进行编程。我听说过 avr-gcc,但所有在线教程似乎都非常乏味,并且没有带有 Arduino 引导加载程序的 AVR 芯片的选项。谁能帮助我用一种更简单的方法在 Ubuntu 上安装 avr-gcc 并开始使用 C 语言为 Arduino 编程?

【问题讨论】:

  • 你为什么想要那个?您已经在 Arduino IDE 中使用 C 语言进行编程。有什么只能通过手动编译 C 代码来实现吗?我建议坚持使用 Arduino IDE。
  • @adam10603 例如,如果有人不喜欢 Arduino IDE,它对 Java 的依赖;也许他想将该项目与另一个构建系统(例如 Make)等集成。您想要这样做的原因有很多。
  • @adam10603 Arduino 语言与 C++ 最相似,但我正在尝试用 C 对其进行编程,因为我想开始使用嵌入式 C。
  • @adam10603 另外,我喜欢 C 在所有平台上提供的手动内存控制。
  • 您仍然可以在 Arduino IDE 中使用 mallocfree 以及指针,它们的工作方式相同。

标签: c ubuntu arduino-uno avr-gcc


【解决方案1】:

如果您只想在已安装引导加载程序的 Arduino 上使用 C 代码。您可以在 Arduino IDE 中用 C 语言编写代码并照常编译。 Sketch 实际上是一堆头文件和宏。

这是用 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.
}

将其粘贴到 IDE 中并亲自尝试。

如果您想从 Arduino 转移到没有引导加载程序的 AVR 编程,我可以推荐 Elliot Williams 的精彩网络广播作为介绍。 - https://www.youtube.com/watch?v=ERY7d7W-6nA

祝你好运,玩得开心:)

【讨论】:

    【解决方案2】:

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

    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
    

    然后您将对所有源文件重复此操作。最后,您可以通过在链接模式下调用 AVR-GCC 将生成的目标文件链接在一起:

    avr-gcc -Os <etc.> MyProgram.o SomeUtility.o -o TheExecutable.elf
    

    这会生成一个 ELF 文件,您的 MCU 无法直接执行该文件。因此,您需要以 Intel Hex 格式从中提取有用的部分(原始机器代码):

    avr-objcopy -O ihex -R .eeprom TheExecutable.elf TheExecutable.ihex
    

    最后,您需要 AVRdude 将 hex 文件的内容上传到 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_NAME 表示“我正在使用类型为 PROGRAMMER_NAME 的程序员”(您需要根据您使用的程序员类型自行填写)。
    • -b 19600 是波特率(您可能需要根据您设置或预编程到引导加载程序中的波特率进行调整)
    • -P PORT_NAME 表示“编程器已连接到端口 PORT_NAME”。在 Linux 上,它通常类似于 /dev/ttyusbN,其中 N 是某个数字。
    • -U flash:w:TheExecutable.ihex:i 表示“将 Intel Hex 格式的 TheExecutable.ihex 的内容写入闪存”。

    【讨论】:

    • 非常感谢。但是,我必须询问在哪里下载和安装正常运行的 avr-gcc 版本。编译和链接有什么区别?此外,此设置是否适用于预装了 Arduino 引导加载程序的 Atmega 芯片?
    • @ApplicationDeveloper “在哪里下载和安装一个正常工作的 avr-gcc 版本”——只要谷歌它。 “编译和链接有什么区别?” - 这是一个很长的故事,只需谷歌它。 “此设置是否适用于预装了 Arduino 引导加载程序的 Atmega 芯片?” – 是的。
    • 感谢您所做的一切。
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多