Avr-GCC с Arduino

Как я могу запрограммировать свой Arduino на C в Ubuntu. Я слышал об avr-gcc, но все онлайн-руководства кажутся чрезвычайно утомительными и не имеют вариантов для чипа AVR с загрузчиком Arduino. Может ли кто-нибудь помочь мне с более простым способом установить avr-gcc на Ubuntu и начать программировать на C для Arduino?


person Application Developer    schedule 05.09.2015    source источник
comment
Зачем тебе это? Вы уже программируете на C в Arduino IDE. Есть ли что-то, чего можно добиться, только скомпилировав код C вручную? Я бы посоветовал придерживаться Arduino IDE.   -  person notadam    schedule 05.09.2015
comment
@adam10603, например, если кому-то не нравится Arduino IDE, ее зависимость от Java; может быть, он хочет интегрировать проект с другой системой сборки (например, Make) и т. д. Существуют разные причины, по которым вы хотите это сделать.   -  person The Paramagnetic Croissant    schedule 05.09.2015
comment
@adam10603 Язык Arduino больше всего похож на C++, но я пытаюсь запрограммировать его на C, потому что хочу начать работу со встроенным C.   -  person Application Developer    schedule 05.09.2015
comment
@adam10603 Adam10603 Кроме того, мне нравится ручное управление памятью, которое C предоставляет на всех платформах.   -  person Application Developer    schedule 05.09.2015
comment
Вы по-прежнему можете использовать malloc и free, а также указатели в Arduino IDE, они работают так же.   -  person notadam    schedule 05.09.2015
comment
@adam10603 Спасибо. Я этого не знал, но я также планирую работать со встроенным C на других архитектурах, и я чувствую, что это поможет с опытом.   -  person Application Developer    schedule 05.09.2015
comment
Написание кода вручную для любого микроконтроллера очень сложно и требует очень низкого уровня знания вашей платформы. Это причина, по которой на самом деле родился Arduino. Люди, которые очень хорошо разбираются в этом, пишут библиотеки, которые позволяют вам воспользоваться преимуществами функций, которые в противном случае потребовали бы нескольких страниц низкоуровневого кода C (написание которого является головной болью даже для профессиональных программистов) всего несколькими строками. обращений в библиотеку. Это Ардуино в двух словах. Я бы сказал, что ты только делаешь себе хуже, отказываясь от всего этого. Но если это то, что вам нужно, удачи с этим   -  person notadam    schedule 05.09.2015
comment
@adam10603 Adam10603 Я ценю совет, но да, я пытаюсь бросить себе вызов, чтобы увидеть, на что действительно похожа разработка на крайне низком уровне. Я также ценю быстрые ответы.   -  person Application Developer    schedule 05.09.2015
comment
@adam10603 adam10603 библиотеки Arduino на самом деле ужасно организованы и мучительно медленны. Вам необходимо их опустить, если вы хотите сделать что-то нетривиальное с вашим MCU. Большую часть материала даже не больно писать. Вы должны читать таблицы данных, да, но вам все равно нужно читать документацию. А стандартная библиотека AVR-GCC уже предоставляет абстракции (встроенные функции, макросы, константы), вам не придется глубоко копаться в адресных пространствах и крутить биты.   -  person The Paramagnetic Croissant    schedule 05.09.2015
comment
Для вещей, для которых я использую свой Arduino, библиотека Arduino отлично подходит. Я тоже хотел запрограммировать его с помощью своего собственного кода C, но, просмотрев несколько вещей, я понял, что это потребует гораздо больше усилий, чем использование Arduino IDE, а преимуществ (по крайней мере для меня) нет. Если вы считаете целесообразным писать код полностью вручную, то, конечно, стоит попробовать. Но если вы хотите полностью отказаться от библиотеки Arduino, я не думаю, что вам нужен загрузчик. Вы должны просто запрограммировать чип напрямую через SPI.   -  person notadam    schedule 05.09.2015


Ответы (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 МГц" (настройте свою фактическую тактовую частоту)
  • -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 для загрузки содержимого шестнадцатеричного файла в 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 означает "записать во флэш-память содержимое TheExecutable.ihex в формате Intel Hex".
person The Paramagnetic Croissant    schedule 05.09.2015
comment
Спасибо большое. Однако я должен спросить, где скачать и установить работающую версию avr-gcc. В чем разница между компиляцией и компоновкой? Кроме того, будет ли эта установка работать с чипом Atmega с предустановленным загрузчиком Arduino? - person Application Developer; 05.09.2015
comment
@ApplicationDeveloper, где скачать и установить работающую версию avr-gcc — просто погуглите. В чем разница между компиляцией и компоновкой? — это длинная история, просто погуглите. будет ли эта установка работать с чипом Atmega с предустановленным загрузчиком Arduino? - да. - person The Paramagnetic Croissant; 05.09.2015
comment
Спасибо за все. - person Application Developer; 05.09.2015

Если вы просто хотите использовать код C с Arduino, на котором уже установлен загрузчик. Вы можете буквально написать код на C в Arduino IDE и скомпилировать его как обычно. 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 без загрузчика, могу ли я порекомендовать отличную веб-трансляцию Эллиота Уильямса в качестве введения. – https://www.youtube.com/watch?v=ERY7d7W-6nA

Удачи и приятного времяпровождения :)

person easyGoing    schedule 20.01.2017