Gast
#3298316
Ich habe hier ein kleines Problem, für welches ich zwar einen Workaround habe, aber nicht sicher bin, ob das ein GCC Bug ist. Und zwar sollen im Code Zeichen asynchron über den UART gelesen werden bis ein gültiges Längenbyte (!=0) kommt. Über den Code Stil kann man streiten, aber er sollte so funktionieren, und tat das auch bis wir Link Time Optimization verwendeten und dabei ein Call durch Inlinen ersetzt wurde. Ich hab als Beispiel was gebastelt, das diese Auffälligkeiten zeigt, dabei sind 3 Beispiele zu sehen, im ersten wird bei der if Überprüfung in der Schleife der zweite Teil weggelassen, obwohl auf (volatile ...) gecastet. Darf der Compiler das, obwohl ich ihm sage die Variable kann sich (durch die UART ISR) ändern? Bei den beiden anderen Varianten wird alles wie gewünscht ausgeführt. Am besten man kompiliert das immer nur mit einer Schleife, dann sieht man im Listing was ich meine. Optimierung ist -Os mit GCC 4.7.2 von Launchpad Plattform ist ein STM32
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |