Forum: Compiler & IDEs llvm für avr


von stru_aus (Gast)


Lesenswert?

huhu

betrifft eigentlich: alternativer compiler für avr

hat schon jemand mal diese compiler ausprobiert?
https://github.com/atduskgreg/llvm-avr
und
http://avr-llvm.sourceforge.net/

wer es nicht weiss: llvm ist ein neuerer compiler, siehe llvm.org
features: bessere fehlermeldungen, wesentlich schneller im compilieren 
als gcc. llvm ist quasi ein abstrakter compiler, der dann noch clang als 
frontend für c/c++ benutzt.

anscheinend haben sich zwei projekte entwickelt für llvm für avr - ganz 
toll :D

ich kenn mich mit llvm nicht wirklich aus, bekannter hat damit ein wenig 
gespielt und war einigermassen begeistert.

mfg stru_aus

von Dirk (Gast)


Lesenswert?

Hi,

gibt es irgendwo auch eine komplette Installation so wie Winavr?

von Tim  . (cpldcpu)


Lesenswert?

Sieht aus, als wenn fleissig weiter an einem LLVM Backend für AVR 
gearbeitet wurde. Hat das schon einmal jemand hier getestet?

https://github.com/avr-llvm/llvm

von mathäus8 (Gast)


Lesenswert?

stru_aus schrieb:
> ich kenn mich mit llvm nicht wirklich aus, bekannter hat damit ein wenig
> gespielt und war einigermassen begeistert.
>

Ist aber nicht unter einer Copyleft-Lizenz; warum sollte man, wenn es 
den GNU GCC gibt, einen weniger freien Compiler unterstützen?

von Nase (Gast)


Lesenswert?

mathäus8 schrieb:
> stru_aus schrieb:
>> ich kenn mich mit llvm nicht wirklich aus, bekannter hat damit ein wenig
>> gespielt und war einigermassen begeistert.
>>
>
> Ist aber nicht unter einer Copyleft-Lizenz; warum sollte man, wenn es
> den GNU GCC gibt, einen weniger freien Compiler unterstützen?
Warum sollte man, wenn es den GCC gibt, nicht auch anderen Compilern 
eine Chance geben, die nicht gerade 20 Jahre Altlasten mitschleifen?

Mal ehrlich, GCC hat m.M.n. gerade nochmal die Kurve gekriegt und mit 
der Umstellung auf C++ den Anschluss erwischt. Nicht dass es an seinen 
Fähigkeiten lag - GCC erzeugt i.a. sehr guten Code - aber es war schon 
ein ziemlich gewachsener Haufen.

LLVM für AVR klingt aber schon interessant.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

mathäus8 schrieb:
> warum sollte man, wenn es den GNU GCC gibt, einen weniger freien
> Compiler unterstützen?

Die LLVM-Entwickler dürften ihre Lizenz durchaus als freier empfinden,
denn sie auferlegt ihnen weniger Zwänge als die GPL.

Fakt ist, dass LLVM dem GCC deutlich den Rang strittig gemacht hat, die
unbestrittene Nummer 1 der Opensource-Compiler zu sein (jetzt mal
nicht in so einer Nische wie dem AVR, sondern bei den Mainstream-CPUs).
Dass er weniger historischen Ballast mitzuschleifen hatte als GCC,
wurde ja schon genannt.  Seit es mit Clang noch ein Frontend gibt,
welches GCC-aufrufkompatibel ist, sodass man seinen Code 1:1 da
reinfüttern kann, wurde ziemlich schnell klar, dass beispielsweise
die Qualität der Warnungen von LLVM nochmal ein ganzes Stück besser
ist als die von GCC (manch bis dato unerkannter Bug trat dann plötzlich
zu Tage).

Wenn du genau hinschaust, dann wird Clang mittlerweile auch bei den
Entwicklern der Linux-Community durchaus gern als Prüfstein für ihren
Code benutzt, selbst wenn sie schätzungsweise aus politischen Gründen
ihre offiziellen Builds weiterhin mit GCC ausliefern werden.

von Tim  . (cpldcpu)


Lesenswert?

Was nur mit LLVM-AVR?

von Beobachter (Gast)


Lesenswert?

Vor allem hat sich GCC erst dann bewegt, als der LLVM merklich auf dem 
Radar aufgetaucht ist. Gerade beim Thema Fehlermeldungen. Beim GCC 
konnte man sinngemäß immer nur lesen, das sei zu kompliziert. LLVM hat 
es einfach gemacht.

Langfristig bin ich mir ziemlich sicher, wird LLVM dem GCC den Rang 
ablaufen, aus einem ganz einfachen Grund: LLVM hält die Einstiegshürde 
fürs Compiler-Hacking sehr, sehr tief.

von Andreas H. (ahz)


Lesenswert?

Jörg W. schrieb:
> mathäus8 schrieb:
>> warum sollte man, wenn es den GNU GCC gibt, einen weniger freien
>> Compiler unterstützen?
>
> Die LLVM-Entwickler dürften ihre Lizenz durchaus als freier empfinden,
> denn sie auferlegt ihnen weniger Zwänge als die GPL.

Es gibt relativ eindeutige Aussagen von RMS, warum die GPL so ist, wie 
die GPL ist.

Und eigentlich ist das auch gar nicht so schlecht. Die GPL verhindert 
z.B., dass Code zurückgehalten wird, der dann durch proprietäre 
Änderungen zu einer Abhängigkeit vom Publisher führen würde.


Und nur für die Akten (weil das immer wieder falsch erzählt wird):
Du darfst GPL Software auch verkaufen. Auch für viiiiel Geld.

Wenn Du also ein Programm mit Modulen entwickelst, die unter GPL stehen, 
dann steht Dein Programm erst mal auch unter GPL.
Dann ist es durchaus ok es garnicht zu vertreiben (und dann musst Du die 
Quellen auch nicht rausgeben, weil nicht gepublished) oder z.B. $250K 
für das Programm zu verlangen.

Im zweiten Fall MUSST Du dann aber auch die kompletten Quellen verfügbar 
machen (das sagt ja z.B. die GPL).

Beim GCC (u.a.) kommt noch dazu, dass die erzeugten Programme NICHT 
automatisch unter GPL sind. DU legst die Lizenz fest. Darum haben ja die 
"notwendigen Helferlein", z.B. crt0 & runtime libs eine eigene Lizenz.


Was unter GPL aber NICHT geht sind diese ärgerlichen Aktionen, wo Leute 
erst Sachen mit freier (im Sinne von "abgreifbarer") Software 
entwickeln, dann als "Freeware" in-Field testen & verbessern und 
schließlich Geld dafür nehmen.
Und dass z.B. genau das NICHT geht find ich persönlich ziemlich gut^^
Dass man damit trotzdem über die Runden kommt zeigen ja z.B. RedHat etc. 
& AdaCore (die ja beide auch fleissig am GCC bauen).

Grüße
Andreas

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Andreas H. schrieb:
> Es gibt relativ eindeutige Aussagen von RMS, warum die GPL so ist, wie
> die GPL ist.

Klar.  Er ist auch religiös in dieser Richtung.  Er musste ja auch,
nachdem die Leute ein funktionierendes Linux einem nie so richtig
fertig werdendem Hurd vorzogen, den Term „GNU/Linux“ vehement ins
Feld führen.

Andere Leute sind es nicht – und das ist durchaus auch gut so.

Beides sind zwei sehr verschiedene Ansichten über das, was jeder so
als „frei“ empfindet; keine der beiden Ansichten sollte für sich den
Anspruch erheben, besser als die andere zu sein.

Allein die Tatsache, dass man überhaupt über sowas diskutieren muss:

> Beim GCC (u.a.) kommt noch dazu, dass die erzeugten Programme NICHT
> automatisch unter GPL sind.

zeigt, dass die GPL durchaus ihre Haken und Ösen hat.  Eigentlich
sollte das ja eine völlige Selbstverständlichkeit sein.

So, jetzt aber back to topic.

Zitat aus dem README des oben genannten github-Projekts:
1
Note: The backend is currently in the process of being merged into LLVM
2
trunk, so development has halted until that is finished.

Ich vermute daher, dass wir künftig durchaus noch was davon sehen
werden.

Noch ein Zitat:
1
We would like to be able to compile any program that AVR-GCC can, have
2
comparable diagnostics, and on-par performance.

von Tim  . (cpldcpu)


Lesenswert?

Habe ein wenig mit dem oben verlinkten llvm-avr herumgespielt.

Achtung: Ein Build von LLVM-AVR dauert wirklich ewig. Am besten einen 
schnellen Rechner nutzen und darauf achten, dass evtl. multithreading 
optionen gesetzt sind.

Testprogramm:
1
#define uint8_t unsigned char
2
#define uint16_t unsigned short
3
4
int main(void) {
5
6
  for (uint16_t i=0; i<32000; i++) {
7
    *((volatile uint8_t *)0x10)=i>>2;
8
  }
9
10
  for (uint16_t i=0; i<32000; i++) {
11
    *((volatile uint8_t *)0x10)+=1;
12
  }
13
14
  return 0;
15
}

Output mit AVR-GCC:

> avr-gcc -Os hello.c -std=c99 -S
1
  .file  "hello.c"
2
__SP_H__ = 0x3e
3
__SP_L__ = 0x3d
4
__SREG__ = 0x3f
5
__tmp_reg__ = 0
6
__zero_reg__ = 1
7
  .section  .text.startup,"ax",@progbits
8
.global  main
9
  .type  main, @function
10
main:
11
/* prologue: function */
12
/* frame size = 0 */
13
/* stack size = 0 */
14
.L__stack_usage = 0
15
  ldi r24,0
16
  ldi r25,0
17
.L3:
18
  mov r18,r24
19
  mov r19,r25
20
  lsr r19
21
  ror r18
22
  lsr r19
23
  ror r18
24
  sts 16,r18
25
  adiw r24,1
26
  cp r24,__zero_reg__
27
  ldi r18,125
28
  cpc r25,r18
29
  brne .L3
30
  ldi r24,0
31
  ldi r25,lo8(125)
32
.L5:
33
  lds r18,16
34
  subi r18,lo8(-(1))
35
  sts 16,r18
36
  sbiw r24,1
37
  sbiw r24,0
38
  brne .L5
39
  ldi r24,0
40
  ldi r25,0
41
  ret
42
  .size  main, .-main
43
  .ident  "GCC: (GNU) 4.8.2"

Output mit clang/llc:

> clang -Os -emit-llvm hello.c -c -o hello.bc
> llc hello.bc -march=avr -o hello_llvm-avr.s
1
  .text
2
  .file  "hello.bc"
3
  .globl  main
4
  .p2align  1
5
  .type  main,@function
6
main:                                   ; @main
7
; BB#0:
8
  ldi  r30, 0
9
  ldi  r31, 0
10
  ldi  r24, 0
11
  ldi  r25, 125
12
LBB0_1:                                 ; =>This Inner Loop Header: Depth=1
13
  movw  r18, r30
14
  lsr  r19
15
  ror  r18
16
  lsr  r19
17
  ror  r18
18
  sts  16, r18
19
  adiw  r30, 1
20
  cp  r30, r24
21
  cpc  r31, r25
22
  brne  LBB0_1
23
; BB#2:                                 ; %.preheader.preheader
24
  ldi  r30, 0
25
  ldi  r31, 0
26
LBB0_3:                                 ; %.preheader
27
                                        ; =>This Inner Loop Header: Depth=1
28
  lds  r18, 16
29
  inc  r18
30
  sts  16, r18
31
  adiw  r30, 1
32
  cp  r30, r24
33
  cpc  r31, r25
34
  brne  LBB0_3
35
; BB#4:
36
  ldi  r22, 0
37
  ldi  r23, 0
38
  movw  r24, r22
39
  ret
40
.Lfunc_end0:
41
  .size  main, .Lfunc_end0-main

von Tim  . (cpldcpu)


Lesenswert?

Sieht auf der ersten Blick schon alles recht brauchbar aus. Das Projekt 
ist auch extrem aktiv. Frage mich nur, wann der erwähnt Merge in das 
Hauptprojekt abgeschlossen ist.

Noch nützlicher als ein AVR-LLVM Backend wäre allerdings eines für STM8 
:)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Tim  . schrieb:
> Output mit AVR-GCC:
>   mov r18,r24
>   mov r19,r25
>
> Output mit clang/llc:
>   movw  r18, r30

Um sinvoll vergleichen zu können, sollte der gleiche Core / 
Instruktionssatz erlaubt sein, was in deinem Beispiel nicht der Fall 
ist:  du verbietest avr-gcc, MOVW zu verwenden, dem avr-llvm ist es 
hingegen erlaubt...

: Bearbeitet durch User
von Luxan (Gast)


Lesenswert?

@Tim

Was testet das Testprogramm? Wäre es nicht besser eins zu nehmen, das 
etwas länger ist?

von Tim  . (cpldcpu)


Lesenswert?

Johann L. schrieb:
> Um sinvoll vergleichen zu können, sollte der gleiche Core /
> Instruktionssatz erlaubt sein, was in deinem Beispiel nicht der Fall
> ist:  du verbietest avr-gcc, MOVW zu verwenden, dem avr-llvm ist es
> hingegen erlaubt...

Stimmt. Die Standardeinstellungen der Compiler scheinen in der Wahl der 
Cores unterschiedlich zu sein. Bei gleiche Core-Wahl würde GCC noch zwei 
Befehle einsparen.

Luxan schrieb:
> Was testet das Testprogramm? Wäre es nicht besser eins zu nehmen, das
> etwas länger ist?

Leider ist es mir noch nicht gelungen das Frontend (clang) mit 
AVR-Anpassungen zu compilieren. Daher habe ich auf das Aufsetzen der 
gesamten Toolchain verzichtet. Komplexeren Code konnte ich daher nicht 
testen. Die Beispiele oben nutzen das standard front end.

: Bearbeitet durch User
von Philipp Klaus K. (pkk)


Lesenswert?

Tim  . schrieb:
> Noch nützlicher als ein AVR-LLVM Backend wäre allerdings eines für STM8
> :)

Das ginge nicht so einfach. LLVM (und GCC) brauchen eigentlich möglichst 
viele, möglichst gleichartige Register, um guten Code zu erzeugen.
SDCC dagegen kommt viel besser mit Architekturen mit wenigen, sehr 
unterschiedlichen Registern zurecht.

Im Prinzip wäre es natürlich möglich, SDCC mit LLBm zu kombinieren. Also 
das Frontend vom LLVM und ein paar high-level-Optimierungen aus LLVM zu 
verwenden, und dann LLVM IR nach SDCC iCode zu übersetzen. Dann hätte 
man das Frontend von SDCC durch Teile von LLVm ersetzt.

Philipp

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Tim  . schrieb:
> Die Beispiele oben nutzen das standard front end.

Ist das der Grund, warum int 32 Bits hat?  Oder hab ich mich da versehen 
("return 0" setzt R22-R25 auf 0).

> Johann L. schrieb:
>> Um sinvoll vergleichen zu können, sollte der gleiche Core /
>> Instruktionssatz erlaubt sein, was in deinem Beispiel nicht der Fall
>> ist:  du verbietest avr-gcc, MOVW zu verwenden, dem avr-llvm ist es
>> hingegen erlaubt...
>
> Stimmt. Die Standardeinstellungen der Compiler scheinen in der Wahl der
> Cores unterschiedlich zu sein. Bei gleiche Core-Wahl würde GCC noch zwei
> Befehle einsparen.

Und bei einer aktuellen GCC-Version noch mehr :-)

Aber momentan scheint eh jeder den avr-llvm zu bevorzugen; neue Besen 
kehren eben gut...

von Tim  . (cpldcpu)


Lesenswert?

Philipp Klaus K. schrieb:
> Im Prinzip wäre es natürlich möglich, SDCC mit LLBm zu kombinieren. Also
> das Frontend vom LLVM und ein paar high-level-Optimierungen aus LLVM zu
> verwenden, und dann LLVM IR nach SDCC iCode zu übersetzen. Dann hätte
> man das Frontend von SDCC durch Teile von LLVm ersetzt.

Naja, das entspricht doch genau dem Konzept von LLVM? Ein STM8 Backend 
würde den intermediate code zu STM8 code compilieren. Wäre es wirklich 
effizienter, wenn das Backend Details des ursprünglichen C-Codes 
"kennt"? Clang/LLVM ist doch eigentlich der Beweis für das Gegenteil.

Ein Vorteil ist, dass man mit dem gleichen Backend auch Frontends für 
andere Programmiersprachen nutzen könnte. z.B. gibt es basierend auf 
AVR-LLVM bereits einen Rust-Compiler:

https://github.com/avr-rust/rust/

von Tim  . (cpldcpu)


Lesenswert?

Johann L. schrieb:
> Tim  . schrieb:
>> Die Beispiele oben nutzen das standard front end.
>
> Ist das der Grund, warum int 32 Bits hat?  Oder hab ich mich da versehen
> ("return 0" setzt R22-R25 auf 0).

Yep. Der Returntyp hätte natürlich uint16_t sein sollen. Habe ich 
übersehen.

Johann L. schrieb:
> Und bei einer aktuellen GCC-Version noch mehr :-)

2 bytes, s.u. :)

>
> Aber momentan scheint eh jeder den avr-llvm zu bevorzugen; neue Besen
> kehren eben gut...

Warum? So viel funktioniert noch nicht. Bin gerade fleissig am 
Bug-sammeln. Bei einem ASM/C mix läuft es noch nicht wirklich rund.

von Tim  . (cpldcpu)


Lesenswert?

Habe inzwischen AVR-LLVM komplett mit frontend kompiliert. (Über Debian 
Jessie im VM, ein aktuelles Mint war leiter zu alt und hat bei den 
Dependencies herumgezickt.)

Unten ein besserer Vergleich des Codes von oben.

GCC 4.9.3 entfernt ein unnötiges Compare im Vergleich zu GCC 4.8.1 (-2 
bytes).

Interessanterweise erzeugt LLVM für die erste Schleife besseren Code, 
während GCC bei der zweiten SChleife besser ist. GCC invertiert den 
Schleifenzähler und spart dadurch ein Compare ein.

LLVM aktueller Build:

> clang -Os -c -S --target=avr hello.c -o hello_llvm_t85.s -mmcu=attiny85
1
  .text
2
  .file  "hello.c"
3
  .globl  main
4
  .p2align  1
5
  .type  main,@function
6
main:                                   ; @main
7
; BB#0:                                 ; %entry
8
  ldi  r30, 0
9
  ldi  r31, 0
10
  ldi  r24, 0
11
  ldi  r25, 125
12
LBB0_1:                                 ; %for.body
13
                                        ; =>This Inner Loop Header: Depth=1
14
  movw  r18, r30
15
  lsr  r19
16
  ror  r18
17
  lsr  r19
18
  ror  r18
19
  sts  16, r18
20
  adiw  r30, 1
21
  cp  r30, r24
22
  cpc  r31, r25
23
  brlo  LBB0_1
24
; BB#2:                                 ; %for.body6.preheader
25
  ldi  r30, 0
26
  ldi  r31, 0
27
LBB0_3:                                 ; %for.body6
28
                                        ; =>This Inner Loop Header: Depth=1
29
  lds  r18, 16
30
  inc  r18
31
  sts  16, r18
32
  adiw  r30, 1
33
  cp  r30, r24
34
  cpc  r31, r25
35
  brlo  LBB0_3
36
; BB#4:                                 ; %for.cond.cleanup5
37
  ldi  r24, 0
38
  ldi  r25, 0
39
  ret
40
.Lfunc_end0:
41
  .size  main, .Lfunc_end0-main

GCC 4.8.1

> avr-gcc -Os -c -S hello.c -std=c99 -o hello_gcc_t85.s -mmcu=attiny85
1
  .file  "hello.c"
2
__SP_H__ = 0x3e
3
__SP_L__ = 0x3d
4
__SREG__ = 0x3f
5
__tmp_reg__ = 0
6
__zero_reg__ = 1
7
  .section  .text.startup,"ax",@progbits
8
.global  main
9
  .type  main, @function
10
main:
11
/* prologue: function */
12
/* frame size = 0 */
13
/* stack size = 0 */
14
.L__stack_usage = 0
15
  ldi r24,0
16
  ldi r25,0
17
.L3:
18
  movw r18,r24
19
  lsr r19
20
  ror r18
21
  lsr r19
22
  ror r18
23
  sts 16,r18
24
  adiw r24,1
25
  cp r24,__zero_reg__
26
  ldi r18,125
27
  cpc r25,r18
28
  brne .L3
29
  ldi r24,0
30
  ldi r25,lo8(125)
31
.L5:
32
  lds r18,16
33
  subi r18,lo8(-(1))
34
  sts 16,r18
35
  sbiw r24,1
36
  sbiw r24,0
37
  brne .L5
38
  ldi r24,0
39
  ldi r25,0
40
  ret
41
  .size  main, .-main
42
  .ident  "GCC: (GNU) 4.8.1"

GCC 4.93

> avr-gcc -Os -c -S hello.c -std=c99 -o hello_gcc_t85.s -mmcu=attiny85

1
  .file  "hello.c"
2
__SP_H__ = 0x3e
3
__SP_L__ = 0x3d
4
__SREG__ = 0x3f
5
__tmp_reg__ = 0
6
__zero_reg__ = 1
7
  .section  .text.startup,"ax",@progbits
8
.global  main
9
  .type  main, @function
10
main:
11
/* prologue: function */
12
/* frame size = 0 */
13
/* stack size = 0 */
14
.L__stack_usage = 0
15
  ldi r24,0
16
  ldi r25,0
17
.L2:
18
  movw r18,r24
19
  lsr r19
20
  ror r18
21
  lsr r19
22
  ror r18
23
  sts 16,r18
24
  adiw r24,1
25
  cp r24,__zero_reg__
26
  ldi r18,125
27
  cpc r25,r18
28
  brne .L2
29
  ldi r24,0
30
  ldi r25,lo8(125)
31
.L3:
32
  lds r18,16
33
  subi r18,lo8(-(1))
34
  sts 16,r18
35
  sbiw r24,1
36
  brne .L3
37
  ldi r24,0
38
  ldi r25,0
39
  ret
40
  .size  main, .-main
41
  .ident  "GCC: (AVR_8_bit_GNU_Toolchain_3.5.1_1671) 4.9.2"

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Aber momentan scheint eh jeder den avr-llvm zu bevorzugen

„Jeder“?  Im Moment sehe ich hier gerade mal einen, der es überhaupt
mal testet …

von Gilles R. (roodemol)


Lesenswert?

Bei LLVM und Clang tut sich recht viel und das AVR Backend ist 
mittlerweile im Trunk gelandet. Aus diesem Grund habe ich mich jetzt 
auch ein wenig mit dem Thema auseinandergesetzt. Da man noch keine 
fertigen Binärpakete herunterladen kann, hier mal eine kleine Anleitung 
wie ich das ganze auf meinem Rechner (Debian Jessie) übersetzt habe.
* Die CMake Version auf meinem Rechner war zu alt, deshalb habe ich die 
Version aus den Backports installiert:
1
apt-get -t jessie-backports install
Vorher muss man allerdings noch sources.list Datei mit dieser Zeile 
ergänzen:
1
deb http://ftp.debian.org/debian jessie-backports main
Genauere Details findet man hier: 
https://backports.debian.org/Instructions/
* Jetzt kann man den Sourcecode auschecken:
1
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm-avr
2
cd llvm-avr/tools/
3
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
4
cd ../projects/
5
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
6
cd ..
7
mkdir build
* In CMakeLists.txt fehlt noch die AVR Plattform, also einfach die Datei 
mit einem Texteditor öffnen und ergänzen, z.B nur für AVR ohne 
Debugcode:
1
...
2
set(LLVM_ALL_TARGETS
3
  AArch64
4
  AMDGPU
5
  ARM
6
  AVR
7
  BPF
8
  Hexagon
9
...
* Damit sind die Vorbereitungen abgeschlossen und man kann die Makefiles 
erzeugen:
1
cd build
2
cmake -G "Unix Makefiles" -DLLVM_TARGETS_TO_BUILD="AVR" -DCMAKE_BUILD_TYPE=Release ../
und übersetzen:
1
make
Nach ein paar Tassen Kaffee sollte man bin Unterverzeichnis das Resultat 
der Arbeit finden.

von Kaj (Gast)


Lesenswert?


von Andreas (Gast)


Lesenswert?

@GillesR hast du mal probiert, ob der CLANG konstante variablen in den 
Flash packt? Muss man da auch mit sowas wie PROGMEM arbeiten?

Gruß Andreas

von Gilles R. (roodemol)


Lesenswert?

Das kann ich leider nicht beantworten. Es gibt einen Bugreport um 
verschiedene Address-Spaces, z.B. mit __flash, zu nutzen: 
https://bugs.llvm.org/show_bug.cgi?id=31568
Genutzt habe ich das allerdings noch nie.

von Wilhelm M. (wimalopaan)


Lesenswert?

Andreas schrieb:
> Muss man da auch mit sowas wie PROGMEM arbeiten?

Der address_space(1) wird ins flash gepackt:
1
const int x __attribute__((address_space(1))) = 3;

von O S S Hans (Gast)


Lesenswert?

Andreas H. schrieb:
> Wenn Du also ein Programm mit Modulen entwickelst, die unter GPL stehen,
> dann steht Dein Programm erst mal auch unter GPL.
> Dann ist es durchaus ok es garnicht zu vertreiben (und dann musst Du die
> Quellen auch nicht rausgeben, weil nicht gepublished) oder z.B. $250K
> für das Programm zu verlangen.
>
> Im zweiten Fall MUSST Du dann aber auch die kompletten Quellen verfügbar
> machen (das sagt ja z.B. die GPL).

Wie Microchip mit seinen XC Compilern toll veranschaulicht.

Wo ist deren Quellcode?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

O S S Hans schrieb:
> Andreas H. schrieb:
>> Im zweiten Fall MUSST Du dann aber auch die kompletten Quellen verfügbar
>> machen (das sagt ja z.B. die GPL).
>
> Wie Microchip mit seinen XC Compilern toll veranschaulicht.
>
> Wo ist deren Quellcode?

Prinzipiell wäre es auch in Ordnung, die Quellen auf Anfrage zu liefern, 
etwa auf dem Postweg per DVD.  Muss nicht mal kostenlos sein, man darf 
es zum Selbstkostenpreis (DVD + Porto) machen.  Und es muss in einem 
üblichen, elektronishc lesbaren Format / Medium gespeichert sein, also 
nicht auf Steintafel oder Kernspeicher.

I.d.R. ist es jedoch für beide Seiten bequemer, die Quellen auf einer 
Webseite zu veröffentlichen.  Ist aber keine Bedingung.

Und natürlich besteht die Verpflichtung, die Quellen zu liefern nur 
gegenüber jemand, der auf rechtmäßigem Weg die Binaries von dir erhalten 
hat.

Wenn also A im Auftrag von B GPL-Software entwickelt, B z.B. dafür 
bezahlt und die Binaries erhält, dann hat B Anspruch darauf, dass A ihm 
die Quellen zum Selbstkostenpreis zur Verfügung stellt (wobei es keine 
Rolle spielt, wieviel und ob und was B für die Entwicklung bezahlt hat 
oder nicht).

Wenn C die Binaries bei A oder B mopst, hat er keinen Anspruch auf die 
Quellen.  Und wenn B die Binaries an C weitergibt, ist er auch 
verpflichtet, C die Quellen zu geben.  C hat aber keinen Anspruch 
gegenüber A.  Zumindest versteh ich die GPL so, lass mich da aber gerne 
eines Besseren belehren.

Und ich hab mir MicroChip GCC-Quellen irgendwann mal angesehen.  Weiß 
aber nicht mehr, für welche Architektur das war (Pic32?) weil ich das 
Gesehene direkt wieder verdrängt habe um nicht dauerhaft Schaden zu 
nehmen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.