Почему я должен прожечь код, чтобы заставить его работать?

Почему я должен записать код дважды, чтобы фактически записать его на плату Arduino? Я должен выполнить эту команду дважды - только тогда чип будет запрограммирован.

Я использую эту команду, чтобы записать программу на плату Arduino Uno, используя Rasp Pi 3, через SSH из Windows 10.

avr-gcc -mmcu=atmega328 filename.c | avr-objcopy -O ihex -j .text -j .data a.out a.hex | avrdude -C avrdude.conf -v -p atmega328p -c arduino -P /dev/ttyACM* -b 115200 -D -U flash:w:a.hex:i

, 👍1

Обсуждение

Пожалуйста, публикуйте любые сообщения, которые вы получаете в процессе записи (измените свой вопрос, чтобы сделать это)., @Nick Gammon

почему вы используете | между командами?, @Juraj

чтобы выполнить эти три отдельные команды за один раз. @Juraj, @user137442


1 ответ


6

В оболочке Unix разделение команд символом канала (|) означает “запускать эти команды параллельно, передавая стандартный вывод каждой из них на стандартный ввод следующей”.

В этом контексте нет смысла использовать каналы, так как и avr-objcopy, и avrdude считывают свои данные из файлов, а не из stdin. Кроме того, параллельный запуск означает, что avrdude не будет иметь доступа к файлу.hex когда все начнется.

Решение состоит в том, чтобы выполнять команды последовательно, а не параллельно. Введите и запустите одну команду за раз.

В качестве альтернативы, если вы действительно хотите иметь все в одной строке, разделите команды точкой с запятой (;, что означает “выполнить следующую команду, когда предыдущая будет выполнена”) или, еще лучше, двойным амперсандом (&& = “выполнить следующую команду только в том случае, если предыдущая успешно завершится).

,

поправьте меня, так что при первом сжигании это предыдущий шестнадцатеричный файл, а при втором-новый. верно?, @user137442

@user137442: Наверное, что-то в этом роде, хотя трудно сказать точно. Avrdude может записывать шестнадцатеричный файл из предыдущего запуска канала или из предыдущего, если предыдущий запуск не смог создать шестнадцатеричный файл, или он может потерпеть неудачу, потому что он находит неполный шестнадцатеричный файл, который находится в процессе записи... Запуская три команды параллельно, вы оказываетесь во власти непредсказуемого, зависящего от времени поведения., @Edgar Bonet

большое вам спасибо, Бонет. Я попробовал &&, и он отлично работает только в первом ожоге. В своем ответе вы сказали что-то вроде: "В этом контексте он не имеет никакого значения ... когда он начинается". Можете ли вы это объяснить?, @user137442

@user137442: Многие утилиты Unix (sort, split, sed, head...) по умолчанию обрабатывают данные, поступающие в их стандартный ввод, и записывают результаты в стандартный вывод. Они предназначены для соединения с трубами. Команды, которые вы используете, не работают таким образом, поэтому при использовании avr-gcc, avr-objcopy и avrdude нет смысла использовать каналы., @Edgar Bonet

Спасибо. Я не все понял, но вижу, где что-то идет не так. Большое вам спасибо, @user137442