From 8f46c531f131ec9a318e863e8cc32aafcb8bd16c Mon Sep 17 00:00:00 2001 From: stefanrueger Date: Wed, 31 Jan 2024 11:38:53 +1300 Subject: [PATCH 1/3] Avoid sed -i in test-avrdude script --- tools/test-avrdude | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/test-avrdude b/tools/test-avrdude index 03a7a858..5b41829f 100755 --- a/tools/test-avrdude +++ b/tools/test-avrdude @@ -269,15 +269,17 @@ for (( p=0; p<$arraylength; p++ )); do fi execute "${command[@]}" > $outfile fusebit=$(grep ^config $outfile | awk '{print $4}') - sed -i -e/^config/d -e/"> "/d $outfile - result [[ '"$fusebit"' == 1 '&&' ! -s $outfile '&&' ! -s $logfile ]] + sed -e/^config/d -e/"> "/d $outfile > ${outfile}-2 + result [[ '"$fusebit"' == 1 '&&' ! -s ${outfile}-2 '&&' ! -s $logfile ]] + rm ${outfile}-2 if [ -n "$EE_SIZE" ]; then specify="fuse access: set eesave fusebit to delete EEPROM on chip erase" command=(${avrdude[@]} -T '"config eesave=ee*erased"') execute "${command[@]}" > $outfile - sed -i -e/^config/d -e/"> "/d $outfile - result [[ ! -s $outfile '&&' ! -s $logfile ]] + sed -e/^config/d -e/"> "/d $outfile > ${outfile}-2 + result [[ ! -s ${outfile}-2 '&&' ! -s $logfile ]] + rm ${outfile}-2 fi fi From 86af6b6d010235d21fedfeec3f645f0d2eabc4b2 Mon Sep 17 00:00:00 2001 From: stefanrueger Date: Wed, 31 Jan 2024 11:44:16 +1300 Subject: [PATCH 2/3] Add option test-avrdude -t for tmp directory --- tools/test-avrdude | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/test-avrdude b/tools/test-avrdude index 5b41829f..b8a963ed 100755 --- a/tools/test-avrdude +++ b/tools/test-avrdude @@ -13,6 +13,7 @@ avrdude_bin=avrdude # Executable list_only=0 # Normal run declare -a pgm_and_target=() # Array with test option strings, eg, "-c dryrun -p m328p" skip_eeprom=0 # Do not skip EEPROM tests for bootloaders by default +tmp=/dev/shm # Temporary RAM directory verbose=0 # Do not show AVRDUDE errors and warnings by default Usage() { @@ -26,6 +27,7 @@ Options: -l list test commands but do not execute them -p can be used multiple times, overrides default tests -s skip EEPROM tests for bootloaders + -t temporary directory -v verbose: show AVRDUDE error and warning messages -? or -h show this help text Example: @@ -33,7 +35,7 @@ Example: END } -while getopts ":\?hc:d:e:lp:sv" opt; do +while getopts ":\?hc:d:e:lp:st:v" opt; do case ${opt} in c) avrdude_conf="$OPTARG" ;; @@ -47,6 +49,8 @@ while getopts ":\?hc:d:e:lp:sv" opt; do ;; s) skip_eeprom=1 ;; + t) tmp="$OPTARG" + ;; v) verbose=1 ;; --) shift; @@ -93,8 +97,7 @@ arraylength=${#pgm_and_target[@]} echo -n "Testing $avrdude_bin" $avrdude_bin -v 2>&1 | grep Version | cut -f2- -d: | sed s/Version/version/ -tmp=/dev/shm # Temporary RAM directory -[[ -d $tmp && -w $tmp ]] || tmp=/tmp # Fall back to /tmp if /dev/shm unusable +[[ -d $tmp && -w $tmp ]] || tmp=/tmp # Fall back to /tmp if tmp directory unusable status=$(mktemp "$tmp/$progname.status.XXXXXX") logfile=$(mktemp "$tmp/$progname.log.XXXXXX") outfile=$(mktemp "$tmp/$progname.out.XXXXXX") From 370a15d032cc0c87e26c4c03c5e375decc692285 Mon Sep 17 00:00:00 2001 From: stefanrueger Date: Wed, 31 Jan 2024 14:49:46 +1300 Subject: [PATCH 3/3] Reduce default delay between avrdude test runs - From 4 s to 0.75 s - Do not delay at all for -c dryrun/dryboot - Do not delay before first avrdude call in a series --- tools/test-avrdude | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/tools/test-avrdude b/tools/test-avrdude index b8a963ed..b63432da 100755 --- a/tools/test-avrdude +++ b/tools/test-avrdude @@ -8,7 +8,7 @@ tfiles=$(dirname "$0")/test_files tfiles=$(printf "%q" "$tfiles") # Quote directory string in case there are spaces etc avrdude_conf='' # Configuration for every run, eg, '-C path_to_avrdude_conf' -delay=4 # Some programmers need a delay between AVRDUDE calls +delay=0.75 # Some programmers need a delay between AVRDUDE calls avrdude_bin=avrdude # Executable list_only=0 # Normal run declare -a pgm_and_target=() # Array with test option strings, eg, "-c dryrun -p m328p" @@ -104,7 +104,7 @@ outfile=$(mktemp "$tmp/$progname.out.XXXXXX") trap "rm -f $status $logfile $outfile" EXIT TIMEFORMAT=%R # time built-in only returns elapsed wall-clock time -elapsed=0 # Global variable holding time of last execute command in seconds +elapsed=-1 # Global variable holding time of last execute command in seconds command=(sleep 0.1) # Array with AVRDUDE command # Execute args as command, set $elapsed and return exit value of command; don't call in a subshell @@ -113,7 +113,7 @@ execute () { echo "\$ ${command[@]}" | tr -s " " return 0; fi - sleep "$delay" + [[ $programmer != -cdry* && $elapsed -ne -1 ]] && sleep "$delay" # These shenanigans keep stdout, stderr and the exit code of the command { read elapsed < <({ time { eval "$@"; echo $? >"$status"; } 2>&4 4>&-; } 4>&2 2>&1 >&3 3>&-); } 3>&1 return $(cat "$status") @@ -131,7 +131,7 @@ result () { echo ❌ "$(printf '%7.3f s' $elapsed): $specify (failed command below)" echo "\$ ${command[@]}" | tr -s " " FAIL=true - sleep 4 # Let the hw settle down before the next test + [[ $programmer != -cdry* ]] && sleep 4 # Let the hw settle down before next test fi [[ $verbose -eq 1 ]] && { touch $logfile $outfile; cat $logfile $outfile; } else @@ -151,6 +151,10 @@ nofusetest=(-pattiny11/ -pt11/ -pattiny12/ -pt12/ -pattiny15/ -pt15/ -pat89s51/ -plgt8f328p/ -plgt8f328p/) for (( p=0; p<$arraylength; p++ )); do + # Isolate programmer and part (assumes -c prog or -cprog but not sth more tricky such as -qc prog) + programmer=$(echo ${pgm_and_target[$p]} | sed 's/ *\([^-]\)/\1/g' | tr \ \\n | grep ^-c | tr A-Z a-z) + part=$(echo ${pgm_and_target[$p]} | sed 's/ *\([^-]\)/\1/g' | tr \ \\n | grep ^-p | tr A-Z a-z) + if [[ $list_only -eq 1 ]]; then [[ p -ne 0 ]] && echo echo "# ${pgm_and_target[$p]}" @@ -158,7 +162,7 @@ for (( p=0; p<$arraylength; p++ )); do else echo "Prepare \"${pgm_and_target[$p]}\" and press 'enter' or 'space' to continue. Press any other key to skip" read -n1 -s -r -p $'' key - sleep 0.25 + [[ $programmer != -cdry* ]] && sleep 0.15 # Debounce key when not using dryrun/dryboot fi if [ "$key" == '' ]; then @@ -179,19 +183,13 @@ for (( p=0; p<$arraylength; p++ )); do # Is the to be tested programmer for a bootloader? is_bootloader=0 - # Isolate programmer (assumes either -c prog or -cprog but not sth more tricky such as -qc prog) - programmer=$(echo ${pgm_and_target[$p]} | sed 's/ *\([^-]\)/\1/g' | tr \ \\n | grep ^-c) if [ -n "$programmer" ]; then ($avrdude_bin $avrdude_conf "$programmer"/At 2>/dev/null | grep -q prog_modes.PM_SPM) && is_bootloader=1 fi # Should we test fuses? fusetest=1 - # Isolate part (assumes either -p part or -ppart) - part=$(echo ${pgm_and_target[$p]} | sed 's/ *\([^-]\)/\1/g' | tr \ \\n | grep ^-p | tr A-Z a-z) - if [ -n "$part" ]; then - [[ "${nofusetest[@]}" =~ "$part/" ]] && fusetest=0 - fi + [[ -n "$part" && "${nofusetest[@]}" =~ "$part/" ]] && fusetest=0 # Should EEPROM test be carried out? check_eeprom=1