Mikrobasic Programm Grösse optimieren

Gast #4097041
Lesenswert?

Hallo Leute,

Habe bereits im Mikroelektronika Forum gepostet.
Leider ist dieses schlecht besucht, bzw. intressiert sich jeder nur für 
sein eigenes Problem.
Daher habe ich mich entschieden, aauch hier mal zu posten.

Es geht um die Optimierung eines Codes, um die Grösse zu minimieren.

Kann mir da jemand Tipps geben?
1
program Flash_Test
2
'Used PIC is a PIC12F1572
3
'INTOSC is set to 32Mhz
4
'
5
'Program writes dummys to the HEF Flashcell and give it out over UART.
6
'After this, program fall into a endless loop.
7
'
8
'
9

10
Const Row1 as Word = 0x780
11
Const Row2 as Word = 0x7A0
12
Const Row3 as Word = 0x7C0
13
Const Row4 as Word = 0x7E0
14

15
dim UART_Data_Out as char[5]
16

17
dim MyMemory as word[16]
18
dim i as byte
19

20
Sub Procedure Init
21
    ANSELA = 0                           'All Pins are digital
22
    WPUA = 0                             'No Pullups
23
    INLVLA = 0x0                         'All Inputs are TTL
24
    OSCCON = 0xF6                        'Configure 32Mhz internal OSC
25
    UART1_Init(9600)                     'Init Uart
26
    Delay_ms(100)                        'Wait until Uart stable
27
End sub
28

29
sub procedure Flash_Unlock
30
    PMCON2 = 0x55
31
    PMCON2 = 0xAA
32
    PMCON1.WR = 1
33
    NOP
34
    NOP
35
end sub
36

37
sub procedure FlashEraseRow (dim Address as word)
38
    INTCON.GIE = 0                       'disable all interrupts
39
    PMCON1.CFGS = 0                      'set program memory space
40
    PMCON1.PMADR = Address
41
    PMCON1.FREE = 1
42
    PMCON1.WREN = 1
43
    Flash_unlock
44
    'processor stalls until operation is complete (2 mS typical)
45
    PMCON1.WREN = 0
46
    INTCON.GIE = 1                       'restore old value of GIE bit
47
end sub
48

49
sub procedure FlashWriteRow(dim Address as word, dim byref datas as word[16])
50
dim i as byte
51
    INTCON.GIE = 0                        'disable all interrupts
52
    PMCON1.CFGS = 0                    'set program memory space
53
    PMCON1.PMADR = Address
54
    PMCON1.FREE = 0
55
    PMCON1.LWLO = 1                        'only write to the latches
56
    PMCON1.WREN = 1
57
    for i =0 to 15
58
        PMCON1.PMADR = Address + i
59
        PMCON1.PMDAT = datas[i]
60
        Flash_unlock
61
    next i
62
    PMCON1.LWLO = 0                        'write latches to flash
63
    Flash_unlock
64
    'processor stalls until operation is complete (2 mS typical)
65
    PMCON1.WREN = 0
66
    INTCON.GIE = 1                       'restore old value of GIE bit
67
end sub
68

69
sub function FlashReadWord (dim Address as word) as word
70
    PMCON1.CFGS = 0                    'set program memory space
71
    PMCON1.PMADRH = Address
72
    PMCON1.RD = 1                        'set read
73
    NOP
74
    NOP
75
    FlashReadWord = PMCON1.PMDAT
76
end sub
77

78
sub procedure FlashReadRow (dim Address as word,dim byref datas as word[16])
79
dim i as byte
80
    for i =0 to 15
81
        datas[i] = FlashReadWord(Address +i)
82
    next i
83
end sub
84

85
Sub Procedure WriteDummysToFlash
86
    for i = 0 to 15
87
        MyMemory[i] = i
88
    next i
89
    FlashWriteRow(Row1,MyMemory)
90
    for i = 0 to 15
91
        MyMemory[i] = i +16
92
    next i
93
    FlashWriteRow(Row2,MyMemory)
94
    for i = 0 to 15
95
        MyMemory[i] = i +32
96
    next i
97
    FlashWriteRow(Row3,MyMemory)
98
    for i = 0 to 15
99
        MyMemory[i] = i +48
100
    next i
101
    FlashWriteRow(Row4,MyMemory)
102
end sub
103

104
Sub Procedure SendMyMemoryToPC
105
    for i = 0 to 15
106
        WordToStr(MyMemory[i],UART_Data_Out)
107
        UART1_Write_Text(UART_Data_Out)
108
    next i
109
end sub
110

111
main:
112
Init
113
WriteDummysToFlash
114
FlashReadRow(Row1,MyMemory)
115
SendMyMemoryToPC
116
FlashReadRow(Row2,MyMemory)
117
SendMyMemoryToPC
118
FlashReadRow(Row3,MyMemory)
119
SendMyMemoryToPC
120
FlashReadRow(Row4,MyMemory)
121
SendMyMemoryToPC
122

123
while 1
124
      clrwdt
125
wend
126

127
end.
#4097077
Lesenswert?

Ich kenne mich mit PIC&MicroBasic nicht aus, aber dein Program an sich 
scheint jetzt nicht sooo umfangreich zu sein.

Ein paar Bytes könntest du vermutlich einsparen, indem du Row1-Row4 in 
ein Array packst und dann die entsprechenden vierfachen Aufrufe durch 
Schleifen ersetzt.

Eventuell kannst du noch Platz sparen, indem du statt 
Bibliotheks-Aufrufen für UART eigene Subs schreibst - k.A. wie 
MicroBasic das linken handhabt.

Wie groß ist das Programm denn und wie groß soll es werden?
Gast #4097090
Lesenswert?

Naja. Das Problem ist, das es jetzt schon 1/3 des Speichers (Flash) 
braucht.
Darum habe ich Zweifel, wenn ich noch etwas dazupacke, dass mir der 
Flash ausgeht.
Ich wollte generell fragen, ob das Programm scheisse ist, oder nicht.
Gast #4097114
Lesenswert?

>'Used PIC is a PIC12F1572

3.5k Flash, 256Byte RAM, 8 pins ... soll das ein Witz sein?
So eine Maschine ist fuer Spezialisten, die die Stueckzahl
haben, und auch vernuenftig Programmieren koennen. Heisst hier,
die Architektur genau kennen, und jedes Byte aus dem Code
rauspressen koennen. Irgendwelche Library funktionen sind
dann nicht mehr dabei.

> Delay_ms(100)  'Wait until Uart stable

Weg damit. Brauchts nicht. Eine Delay
Funktion verwendet man generell nie !!! NIE.

>WordToStr(MyMemory[i],UART_Data_Out)
>UART1_Write_Text(UART_Data_Out)

Wahrscheinlich Muell. Das muss man viel, viel dichter Packen.

Fazit. Dass die Maschine schon gegen Voll geht hat schon seine 
Reichtigkeit. Gegen Basic ist nicht viel zu sagen. Benoetigt eben auch 
seine Einarbeitung, und genaue Kenntnis der Library Funktionen.
Ich schreib zwar auch in einer Hochsprache, verwende aber trotzdem keine 
Library funktionen.
Gast #4097274
Lesenswert?

Habe mir mal die Routine WordToStr nachgebaut.
Verbraucht noch mehr Flash als die Originale eingebaute Lib :-((
1
sub procedure WordToString (dim InputWord as Word,dim byref OutputString as char[5])
2
    OutputString[0] = (InputWord/10000)+ 48
3
    OutputString[1] = ((InputWord/1000)mod 10)+ 48
4
    OutputString[2] = ((InputWord/100)mod 10)+ 48
5
    OutputString[3] = ((InputWord/10)mod 10)+ 48
6
    OutputString[4] = (InputWord mod 10)+ 48
7
end sub
#4097300
Lesenswert?

Seppi schrieb:
> Naja. Das Problem ist, das es jetzt schon 1/3 des Speichers (Flash)
> braucht.

Das passt nicht.

Entweder Du programmierst BASIC oder andere exotische Hochsprachen was 
automatisch impliziert daß Du mehr Wert auf Abstraktion legst als auf 
Ressourcenverbrauch oder Du legst Wert auf minimalen 
Ressourcenverbrauch, dann verwendest Du Programmiersprachen die speziell 
in dieser Disziplin glänzen.

Einen Tod musst Du sterben. Such Dir aus welcher das sein soll.
Gast #4097803
Lesenswert?

Bei Mikroe gibt es gibt kein unterschied zwischen C und basic.Also wenn 
er das in C schreibt wird der code genau so lang sein. Aber um ihn zu 
optimieren sollte man wo es moglich ist word durch char oder byte 
ersetzen.
Gast #4097890
Lesenswert?

Ich programmiere meine PIC's auch alle mit MikroBASIC, ausser die 10F...

Wenn man die Libs nicht nutzt, ist das fast wie Assembler, ausser dass 
man sich nicht um's Banking kümmern muss. Wenn ich eine Lib benutze, 
schaue ich auf jeden Fall ins Assembler Listing, wie er das macht. Ggf. 
optimieren oder eigene Routine verwenden (z.B. I2C).

Gruss Chregu

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren