|  | @@ -33,12 +33,10 @@ if [ -z "$1" ]; then PROGMEM=progmem1; fi
 | 
												
													
														
															|  |  #  0. check input files
 |  |  #  0. check input files
 | 
												
													
														
															|  |  #  1. remove output files
 |  |  #  1. remove output files
 | 
												
													
														
															|  |  #  2. list symbol table of section '.text' from output elf file to text.sym (sorted by address)
 |  |  #  2. list symbol table of section '.text' from output elf file to text.sym (sorted by address)
 | 
												
													
														
															|  | -#  3. list symbol table of section '.$PROGMEM' from all output object files to $PROGMEM.sym
 |  | 
 | 
												
													
														
															|  | -#  4. filter only $PROGMEM symbols from text.sym and store it back to $PROGMEM.sym with absolute address
 |  | 
 | 
												
													
														
															|  | -#  5. calculate start and stop address of section '.$PROGMEM'
 |  | 
 | 
												
													
														
															|  | -#  6. extract string data from elf file to $PROGMEM.hex
 |  | 
 | 
												
													
														
															|  | -#  7. prepare string data for character check and conversion (output to $PROGMEM.chr)
 |  | 
 | 
												
													
														
															|  | -#  8. perform character check and conversion (output to $PROGMEM.var and $PROGMEM.txt)
 |  | 
 | 
												
													
														
															|  | 
 |  | +#  3. calculate start and stop address of section '.$PROGMEM'
 | 
												
													
														
															|  | 
 |  | +#  4. extract string data from elf file to $PROGMEM.hex
 | 
												
													
														
															|  | 
 |  | +#  5. prepare string data for character check and conversion (output to $PROGMEM.chr)
 | 
												
													
														
															|  | 
 |  | +#  6. perform character check and conversion (output to $PROGMEM.var and $PROGMEM.txt)
 | 
												
													
														
															|  |  #
 |  |  #
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |  echo "progmem.sh started" >&2
 |  |  echo "progmem.sh started" >&2
 | 
												
											
												
													
														
															|  | @@ -61,71 +59,56 @@ if [ -e $PROGMEM.txt ]; then rm $PROGMEM.txt; fi
 | 
												
													
														
															|  |  # (2)
 |  |  # (2)
 | 
												
													
														
															|  |  echo " progmem.sh (2) - listing symbol table of section '.text'" >&2
 |  |  echo " progmem.sh (2) - listing symbol table of section '.text'" >&2
 | 
												
													
														
															|  |  #list symbols from section '.text' into file text.sym (only address, size and name)
 |  |  #list symbols from section '.text' into file text.sym (only address, size and name)
 | 
												
													
														
															|  | -$OBJDUMP -t -j ".text" $INOELF | tail -n +5 | grep -E "^[0-9a-f]{8} [gl]     O" | cut -c1-9,28-36,37- | sed "/^$/d" | sort >> text.sym
 |  | 
 | 
												
													
														
															|  | 
 |  | +#$OBJDUMP -t -j ".text" $INOELF | sort > text.sym
 | 
												
													
														
															|  | 
 |  | +$OBJDUMP -t -j ".text" $INOELF | tail -n +5 | grep -E "^[0-9a-f]{8} [gl]     [O ]" | cut -c1-9,28-36,37- | sed "/^$/d" | sort > text.sym
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |  # (3)
 |  |  # (3)
 | 
												
													
														
															|  | -echo " progmem.sh (3) - listing symbol table of section '.$PROGMEM'" >&2
 |  | 
 | 
												
													
														
															|  | -#loop over all object files
 |  | 
 | 
												
													
														
															|  | -ls "$OBJDIR"/*.o | while read fn; do
 |  | 
 | 
												
													
														
															|  | - echo "  processing $fn" >&2
 |  | 
 | 
												
													
														
															|  | - #list symbols from section $PROGMEM (only address, size and name)
 |  | 
 | 
												
													
														
															|  | - $OBJDUMP -t -j ".$PROGMEM" $fn 2>/dev/null | tail -n +5 | cut -c1-9,28-36,37- | sed "/^$/d" | sort >> $PROGMEM.sym
 |  | 
 | 
												
													
														
															|  | -done
 |  | 
 | 
												
													
														
															|  | -
 |  | 
 | 
												
													
														
															|  | -# (4)
 |  | 
 | 
												
													
														
															|  | -echo " progmem.sh (4) - filtering $PROGMEM symbols" >&2
 |  | 
 | 
												
													
														
															|  | -#create list of $PROGMEM symbol names separated by '\|'
 |  | 
 | 
												
													
														
															|  | -progmem=$(cut -c19- $PROGMEM.sym)
 |  | 
 | 
												
													
														
															|  | -progmem=$(echo $progmem | sed "s/ /\\\b\\\|\\\b/g")
 |  | 
 | 
												
													
														
															|  | -progmem='\b'$progmem'\b'
 |  | 
 | 
												
													
														
															|  | -#filter $PROGMEM symbols from section '.text' (result file will contain list sorted by absolute address) 
 |  | 
 | 
												
													
														
															|  | -cat text.sym | grep $progmem > $PROGMEM.sym
 |  | 
 | 
												
													
														
															|  | -
 |  | 
 | 
												
													
														
															|  | -# (5)
 |  | 
 | 
												
													
														
															|  | -echo " progmem.sh (5) - calculating start and stop address" >&2
 |  | 
 | 
												
													
														
															|  | 
 |  | +echo " progmem.sh (3) - calculating start and end address" >&2
 | 
												
													
														
															|  |  #calculate start addres of section ".$PROGMEM"
 |  |  #calculate start addres of section ".$PROGMEM"
 | 
												
													
														
															|  | -PROGMEM_BEG=$(head -n1 $PROGMEM.sym | while read offs size name; do echo "0x"$offs; done)
 |  | 
 | 
												
													
														
															|  | 
 |  | +PROGMEM_BEG=$(cat text.sym | grep "__loc_pri_start" | while read offs size name; do echo "0x"$offs; done)
 | 
												
													
														
															|  |  #calculate stop addres of section ".$PROGMEM"
 |  |  #calculate stop addres of section ".$PROGMEM"
 | 
												
													
														
															|  | -PROGMEM_END=$(tail -n1 $PROGMEM.sym | while read offs size name; do printf "0x%x" $((0x$offs + 0x$size)); done)
 |  | 
 | 
												
													
														
															|  | 
 |  | +PROGMEM_END=$(cat text.sym | grep "__loc_pri_end" | while read offs size name; do echo "0x"$offs; done)
 | 
												
													
														
															|  |  echo "  START address = "$PROGMEM_BEG >&2
 |  |  echo "  START address = "$PROGMEM_BEG >&2
 | 
												
													
														
															|  |  echo "  STOP  address = "$PROGMEM_END >&2
 |  |  echo "  STOP  address = "$PROGMEM_END >&2
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | -# (6)
 |  | 
 | 
												
													
														
															|  | -echo " progmem.sh (6) - extracting string data from elf" >&2
 |  | 
 | 
												
													
														
															|  | -#dump $PROGMEM data in hex format, cut textual data (keep hex data only)
 |  | 
 | 
												
													
														
															|  | -$OBJDUMP -d -j ".text" -w -z --start-address=$PROGMEM_BEG --stop-address=$PROGMEM_END $INOELF | cut -c1-57 > $PROGMEM.lss
 |  | 
 | 
												
													
														
															|  | 
 |  | +# (4)
 | 
												
													
														
															|  | 
 |  | +echo " progmem.sh (4) - extracting string data from elf" >&2
 | 
												
													
														
															|  | 
 |  | +#dump $PROGMEM data in hex format, cut disassembly (keep hex data only)
 | 
												
													
														
															|  | 
 |  | +$OBJDUMP -D -j ".text" -w -z --start-address=$PROGMEM_BEG --stop-address=$PROGMEM_END $INOELF |\
 | 
												
													
														
															|  | 
 |  | + tail -n +7 | sed "s/ \t.*$//" > $PROGMEM.lss
 | 
												
													
														
															|  |  #convert $PROGMEM.lss to $PROGMEM.hex:
 |  |  #convert $PROGMEM.lss to $PROGMEM.hex:
 | 
												
													
														
															|  |  # replace empty lines with '|' (variables separated by empty lines)
 |  |  # replace empty lines with '|' (variables separated by empty lines)
 | 
												
													
														
															|  |  # remove address from multiline variables (keep address at first variable line only)
 |  |  # remove address from multiline variables (keep address at first variable line only)
 | 
												
													
														
															|  |  # remove '<' and '>:', remove whitespace at end of lines
 |  |  # remove '<' and '>:', remove whitespace at end of lines
 | 
												
													
														
															|  |  # remove line-endings, replace separator with '\n' (join hex data lines - each line will contain single variable)
 |  |  # remove line-endings, replace separator with '\n' (join hex data lines - each line will contain single variable)
 | 
												
													
														
															|  | -# filter progmem symbols
 |  | 
 | 
												
													
														
															|  | -cat $PROGMEM.lss | tail -n +7 | sed -E 's/^$/|/;s/^........:\t/ /;s/<//g;s/>:/ /g;s/[ \t]*$//' |\
 |  | 
 | 
												
													
														
															|  | - tr -d '\n' | sed "s/[|]/\n/g" | grep $progmem > $PROGMEM.hex
 |  | 
 | 
												
													
														
															|  | 
 |  | +cat $PROGMEM.lss | sed -E 's/^$/|/;s/^    ....:\t//;s/[ ]*$/ /' | tr -d '\n' | tr '|' '\n' |\
 | 
												
													
														
															|  | 
 |  | + sed "s/^ //;s/<//;s/>:/ /;s/00 [1-9a-f][1-9a-f] $/00 /; s/ $//" > $PROGMEM.hex
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | -# (7)
 |  | 
 | 
												
													
														
															|  | -echo " progmem.sh (7) - preparing string data" >&2
 |  | 
 | 
												
													
														
															|  | 
 |  | +# (5)
 | 
												
													
														
															|  | 
 |  | +echo " progmem.sh (5) - preparing string data" >&2
 | 
												
													
														
															|  |  #convert $PROGMEM.hex to $PROGMEM.chr (prepare string data for character check and conversion) 
 |  |  #convert $PROGMEM.hex to $PROGMEM.chr (prepare string data for character check and conversion) 
 | 
												
													
														
															|  |  # replace first space with tab
 |  |  # replace first space with tab
 | 
												
													
														
															|  | -# replace second space with tab and space
 |  | 
 | 
												
													
														
															|  | 
 |  | +# replace second and third space with tab and space
 | 
												
													
														
															|  |  # replace all remaining spaces with '\x'
 |  |  # replace all remaining spaces with '\x'
 | 
												
													
														
															|  |  # replace all tabs with spaces
 |  |  # replace all tabs with spaces
 | 
												
													
														
															|  | -cat $PROGMEM.hex | sed 's/ /\t/;s/ /\t /;s/ /\\x/g;s/\t/ /g' > $PROGMEM.chr
 |  | 
 | 
												
													
														
															|  | 
 |  | +cat $PROGMEM.hex | sed 's/ /\t/;s/  /\t /;s/ /\\x/g;s/\t/ /g' > $PROGMEM.chr
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | -
 |  | 
 | 
												
													
														
															|  | -# (8)
 |  | 
 | 
												
													
														
															|  | -#convert $PROGMEM.chr to $PROGMEM.var (convert data to text, TODO: rewrite as awk script)
 |  | 
 | 
												
													
														
															|  | -echo " progmem.sh (8) - converting string data" >&2
 |  | 
 | 
												
													
														
															|  | 
 |  | +# (6)
 | 
												
													
														
															|  | 
 |  | +#convert $PROGMEM.chr to $PROGMEM.var (convert data to text)
 | 
												
													
														
															|  | 
 |  | +echo " progmem.sh (6) - converting string data" >&2
 | 
												
													
														
															|  | 
 |  | +(\
 | 
												
													
														
															|  | 
 |  | +echo "/bin\/echo -e \\"; \
 | 
												
													
														
															|  |  cat $PROGMEM.chr | \
 |  |  cat $PROGMEM.chr | \
 | 
												
													
														
															|  |   sed 's/ \\xff\\xff/ /;' | \
 |  |   sed 's/ \\xff\\xff/ /;' | \
 | 
												
													
														
															|  |   sed 's/\\x22/\\\\\\x22/g;' | \
 |  |   sed 's/\\x22/\\\\\\x22/g;' | \
 | 
												
													
														
															|  |   sed 's/\\x1b/\\\\\\x1b/g;' | \
 |  |   sed 's/\\x1b/\\\\\\x1b/g;' | \
 | 
												
													
														
															|  |   sed 's/\\x01/\\\\\\x01/g;' | \
 |  |   sed 's/\\x01/\\\\\\x01/g;' | \
 | 
												
													
														
															|  |   sed 's/\\xf8/\\\\\\xf8/g;' | \
 |  |   sed 's/\\xf8/\\\\\\xf8/g;' | \
 | 
												
													
														
															|  | - sed 's/\\x00$//;s/^/\/bin\/echo -e "/;s/$/"/' | sh > $PROGMEM.var
 |  | 
 | 
												
													
														
															|  | 
 |  | + sed 's/\\x00$/\n/;s/^/\"/;s/$/\"\\/'; \
 | 
												
													
														
															|  | 
 |  | +) | sh > $PROGMEM.var
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |  #this step can be omitted because .txt file is not used
 |  |  #this step can be omitted because .txt file is not used
 | 
												
													
														
															|  | -#cat $PROGMEM.var | sed 's/\r/\n/g' | sed -E 's/^[0-9a-f]{8} [^ ]* //' >$PROGMEM.txt
 |  | 
 | 
												
													
														
															|  | 
 |  | +cat $PROGMEM.var | sed 's/\r/\n/g' | sed -E 's/^[0-9a-f]{8} [^ ]* //' >$PROGMEM.txt
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |  echo "progmem.sh finished" >&2
 |  |  echo "progmem.sh finished" >&2
 | 
												
													
														
															|  |  
 |  |  
 |