parent
b75d03ec0f
commit
6068ce0bc3
@ -1 +1,4 @@
|
|||||||
/*.swp
|
/*.swp
|
||||||
|
/*.d
|
||||||
|
headeredit
|
||||||
|
/*.o
|
||||||
|
|||||||
@ -0,0 +1,77 @@
|
|||||||
|
CFLAGS += -Wall -Os -I. -mmcu=attiny26
|
||||||
|
DEFINES += -DF_CPU=16e6
|
||||||
|
|
||||||
|
OBJECTS = gg.o mmc.o
|
||||||
|
|
||||||
|
# further optimization:
|
||||||
|
# this removes dead code and does global linker optimization
|
||||||
|
#CFLAGS += -ffunction-sections -Wl,--gc-sections -Wl,--relax
|
||||||
|
#CFLAGS += --param inline-call-cost=2
|
||||||
|
|
||||||
|
COMPILE = avr-gcc $(CFLAGS) $(DEFINES)
|
||||||
|
|
||||||
|
# symbolic targets:
|
||||||
|
all: firmware.hex
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(COMPILE) -c $< -o $@
|
||||||
|
|
||||||
|
.S.o:
|
||||||
|
$(COMPILE) -x assembler-with-cpp -c $< -o $@
|
||||||
|
# "-x assembler-with-cpp" should not be necessary since this is the default
|
||||||
|
# file type for the .S (with capital S) extension. However, upper case
|
||||||
|
# characters are not always preserved on Windows. To ensure WinAVR
|
||||||
|
# compatibility define the file type manually.
|
||||||
|
|
||||||
|
.c.s:
|
||||||
|
$(COMPILE) -S $< -o $@
|
||||||
|
|
||||||
|
flash: all
|
||||||
|
avrdude -c usbasp -p t26 -U flash:w:firmware.hex
|
||||||
|
|
||||||
|
fuses:
|
||||||
|
echo TODO
|
||||||
|
# avrdude -c usbasp -p t26 -U lfuse:w:0xe4:m -U hfuse:w:0xd9:m # internal 8Mhz oscillator
|
||||||
|
|
||||||
|
|
||||||
|
## what are the source dependencies
|
||||||
|
%.d: %.c
|
||||||
|
@set -e; rm -f $@; \
|
||||||
|
$(COMPILE) -MM $< | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@;
|
||||||
|
# line 1: exits if anything goes wrong
|
||||||
|
# line 2a: gcc -MM outputs dependencies
|
||||||
|
# line 2b: insert the %.d into dependency list
|
||||||
|
|
||||||
|
#main.c: version.h
|
||||||
|
|
||||||
|
|
||||||
|
version.h: .svn/entries
|
||||||
|
export LANG=POSIX; (svn info 2>/dev/null || echo "Revision: unknown") | awk '/^Revision:/ {print "#define SVNVERSION \"" $$2 "\""};' >version.h
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o *.hex *.obj *.i *.s *.d */*.i */*.s */*.o */*.d version.h
|
||||||
|
|
||||||
|
# file targets:
|
||||||
|
firmware.bin: $(OBJECTS)
|
||||||
|
$(COMPILE) -o firmware.bin $(OBJECTS)
|
||||||
|
|
||||||
|
firmware.hex: firmware.bin
|
||||||
|
rm -f firmware.hex firmware.eep.hex
|
||||||
|
avr-objcopy -j .text -j .data -O ihex firmware.bin firmware.hex
|
||||||
|
avr-size firmware.bin
|
||||||
|
# ./checksize firmware.bin 8192 960
|
||||||
|
# do the checksize script as our last action to allow successful compilation
|
||||||
|
# on Windows with WinAVR where the Unix commands will fail.
|
||||||
|
|
||||||
|
disasm: firmware.bin
|
||||||
|
avr-objdump -d firmware.bin >disasm
|
||||||
|
|
||||||
|
functionsize: disasm
|
||||||
|
python avrbuild/functionsize.py
|
||||||
|
|
||||||
|
countregs: disasm
|
||||||
|
python avrbuild/countregs.py
|
||||||
|
|
||||||
|
# for depends:
|
||||||
|
-include $(OBJECTS:.o=.d)
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
|
||||||
|
fd = os.popen("avr-objdump -d firmware.bin")
|
||||||
|
regcount = [0]*32
|
||||||
|
s="foo"
|
||||||
|
while s:
|
||||||
|
s=fd.readline()
|
||||||
|
m=re.findall(r"[ \n\t,;]r(\d\d?)[ \n\t,;]",s)
|
||||||
|
if m:
|
||||||
|
for i in m:
|
||||||
|
regcount[int(i)] += 1;
|
||||||
|
|
||||||
|
for i in range(16):
|
||||||
|
print "r%2d: %4d"%(i,regcount[i]),
|
||||||
|
print "\tr%2d: %4d"%(i+16,regcount[i+16])
|
||||||
|
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
fd = os.popen("avr-objdump -d firmware.bin")
|
||||||
|
oldaddr=0
|
||||||
|
lastfnname=""
|
||||||
|
namespacedict = {}
|
||||||
|
s="foo"
|
||||||
|
while s:
|
||||||
|
s=fd.readline()
|
||||||
|
m=re.match("([0-9a-f]+) <(\w+)>:",s)
|
||||||
|
if m:
|
||||||
|
addr,fname=m.groups()
|
||||||
|
addr=int(addr,16)
|
||||||
|
size=addr-oldaddr
|
||||||
|
oldaddr=addr
|
||||||
|
# print size,"\t",lastfnname
|
||||||
|
namespace=get_namespace(lastfnname)
|
||||||
|
try:
|
||||||
|
namespacedict[namespace].append((lastfnname, size))
|
||||||
|
except:
|
||||||
|
namespacedict[namespace] = [(lastfnname, size)]
|
||||||
|
lastfnname = fname
|
||||||
|
|
||||||
|
print "individual sizes:"
|
||||||
|
for k,v in namespacedict.items():
|
||||||
|
for a,b in sorted(v):
|
||||||
|
print "%4i %s"%(b,a)
|
||||||
|
print "namespace sizes:"
|
||||||
|
for k,v in namespacedict.items():
|
||||||
|
totalsize = sum( [ i[1] for i in v ] )
|
||||||
|
print "%4i %s*"%(totalsize,k)
|
||||||
|
|
||||||
|
def get_namespace(name):
|
||||||
|
matchlist = [
|
||||||
|
r"(^__)",
|
||||||
|
r"(^\w+?_)",
|
||||||
|
r"(\w[a-z0-9])[A-Z]"]
|
||||||
|
for i in matchlist:
|
||||||
|
m = re.match(i, name)
|
||||||
|
if m:
|
||||||
|
return m.groups()[0]
|
||||||
|
return "<nonamespace>"
|
||||||
|
|
||||||
|
|
||||||
|
if __name__=="__main__":
|
||||||
|
main()
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
print "Auto-generating menu_autogen.h..."
|
||||||
|
|
||||||
|
items=set([])
|
||||||
|
|
||||||
|
fd=file("menu.c")
|
||||||
|
for line in fd:
|
||||||
|
m = re.search(r"menu_item_(\w+)\s*\(",line)
|
||||||
|
if m:
|
||||||
|
items.add( m.groups()[0])
|
||||||
|
|
||||||
|
fd.close()
|
||||||
|
|
||||||
|
items=list(items) # create clear ordering
|
||||||
|
|
||||||
|
fd=file("menu_autogen.h","wb")
|
||||||
|
|
||||||
|
fd.write("\n");
|
||||||
|
for i in range(len(items)):
|
||||||
|
fd.write("extern int8_t menu_item_%s();\n" % items[i])
|
||||||
|
|
||||||
|
fd.write("\ntypedef int8_t (*item_handler_t)();\n\n")
|
||||||
|
|
||||||
|
fd.write("item_handler_t menu_item_handlers[] = {\n")
|
||||||
|
fd.write("\t\tNULL")
|
||||||
|
|
||||||
|
for i in range(len(items)):
|
||||||
|
fd.write(",\n\t\t*menu_item_%s" % items[i])
|
||||||
|
|
||||||
|
fd.write("\n};\n\n")
|
||||||
|
|
||||||
|
for i in range(len(items)):
|
||||||
|
fd.write("#define MENU_ITEM_%s \t%s\n" % (items[i].upper(), i+1))
|
||||||
|
|
||||||
|
fd.write("\n")
|
||||||
|
fd.write("#define MENU_MAX_ITEM %s\n\n"%len(items))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,113 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import re
|
||||||
|
from sys import argv
|
||||||
|
|
||||||
|
startline = "/* autogenerated by update_header.py. Please check and uncomment.\n"
|
||||||
|
changedline = "// changed declarations:\n"
|
||||||
|
newline = "// new declarations:\n"
|
||||||
|
endline = "*/ // update_header.py end\n"
|
||||||
|
|
||||||
|
def parse_c(data):
|
||||||
|
l=0
|
||||||
|
while l!=len(data):
|
||||||
|
l=len(data)
|
||||||
|
data=re.sub(r"(?ms)\{[^{}]*\}",";",data)
|
||||||
|
data = re.sub(r"(?ms)/\*.*?\*/","",data)
|
||||||
|
data = re.sub(r"(?m)^#.*$","",data)
|
||||||
|
data = data.split(";")
|
||||||
|
data = map(lambda x:x.strip(), data)
|
||||||
|
data = filter(None, data) # kill empty lines
|
||||||
|
data = map(lambda x:re.sub(r"\s*=.*$","",x), data)
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def make_symtable(data):
|
||||||
|
symbols={}
|
||||||
|
for i in data:
|
||||||
|
symname=get_symname(i)
|
||||||
|
symbols[symname] = i
|
||||||
|
return symbols
|
||||||
|
|
||||||
|
def get_symname(line):
|
||||||
|
try:
|
||||||
|
r = re.search(r"(\w+)($|\(|\[)",line).groups()[0]
|
||||||
|
return r
|
||||||
|
except:
|
||||||
|
raise 'Could not extract symbol from "%s".'%repr(line)
|
||||||
|
|
||||||
|
def update_header(filebase):
|
||||||
|
data = file(filebase+".c").read()
|
||||||
|
data = parse_c(data)
|
||||||
|
header = file(filebase+".h").read()
|
||||||
|
header = parse_c(header)
|
||||||
|
headersyms = make_symtable(header)
|
||||||
|
|
||||||
|
changed=[]
|
||||||
|
new=[]
|
||||||
|
for i in data:
|
||||||
|
symname = get_symname(i)
|
||||||
|
if symname not in headersyms:
|
||||||
|
new.append(i)
|
||||||
|
continue
|
||||||
|
headerline = headersyms[symname]
|
||||||
|
headerline = re.sub(r"extern\s+","",headerline)
|
||||||
|
if headerline != i:
|
||||||
|
changed.append(i)
|
||||||
|
|
||||||
|
print changed
|
||||||
|
print new
|
||||||
|
|
||||||
|
if (not changed) and (not new):
|
||||||
|
return # nothing to do
|
||||||
|
|
||||||
|
fd=file(filebase+".h")
|
||||||
|
header = fd.readlines()
|
||||||
|
fd.close()
|
||||||
|
if startline in header:
|
||||||
|
try:
|
||||||
|
print "foo"
|
||||||
|
start=header.index(startline)
|
||||||
|
stop=header.index(endline)
|
||||||
|
print start, stop
|
||||||
|
header = header[:start] + header[stop+1:]
|
||||||
|
fd = file(filebase+".h","wb")
|
||||||
|
fd.write("".join(header))
|
||||||
|
fd.close()
|
||||||
|
except:
|
||||||
|
print "Error killing old entry"
|
||||||
|
fd = file(filebase+".h","ab")
|
||||||
|
|
||||||
|
fd.write("\n\n\n")
|
||||||
|
fd.write(startline)
|
||||||
|
if changed:
|
||||||
|
fd.write("\n")
|
||||||
|
fd.write(changedline)
|
||||||
|
for i in changed:
|
||||||
|
fd.write("extern "+i+";\n")
|
||||||
|
if new:
|
||||||
|
fd.write("\n")
|
||||||
|
fd.write(newline)
|
||||||
|
for i in new:
|
||||||
|
fd.write("extern "+i+";\n")
|
||||||
|
fd.write("\n")
|
||||||
|
fd.write(endline)
|
||||||
|
fd.write("\n\n\n")
|
||||||
|
fd.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
for i in argv[1:]:
|
||||||
|
i=re.sub(".[ch]$","",i)
|
||||||
|
update_header(i)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__=="__main__":
|
||||||
|
main()
|
||||||
Loading…
Reference in new issue