Почему я должен прожечь код, чтобы заставить его работать?
Почему я должен записать код дважды, чтобы фактически записать его на плату 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
@user137442, 👍1
Обсуждение1 ответ
В оболочке 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
- Ошибка компиляции кода для Arduino/Genuino Uno
- Будет ли бесконечный цикл внутри loop() работать быстрее?
- Как разрешить междоменные запросы на ESP8266 WebServer
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
- Поддерживают ли чипы ATMega 328/2560 JTAG-программатор и аппаратный отладчик?
- Запуск С для ардуино
- MQTT через serial
- Поскольку double и float представляют один и тот же тип данных (обычно), что предпочтительнее?
Пожалуйста, публикуйте любые сообщения, которые вы получаете в процессе записи (измените свой вопрос, чтобы сделать это)., @Nick Gammon
почему вы используете
|
между командами?, @Jurajчтобы выполнить эти три отдельные команды за один раз. @Juraj, @user137442