feat(u01): implement assignment

This commit is contained in:
gaems 2026-10-13 19:53:47 +02:00
parent 5c84ba1823
commit f2e3d5422c
35 changed files with 1828 additions and 779 deletions

File diff suppressed because one or more lines are too long

View file

@ -77,7 +77,7 @@
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>1</IsCurrentTarget>
</OPTFL>
<CpuCode>0</CpuCode>
<CpuCode>18</CpuCode>
<DebugOpt>
<uSim>0</uSim>
<uTrg>1</uTrg>
@ -149,6 +149,22 @@
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
<MemoryWindow1>
<Mm>
<WinNumber>1</WinNumber>
<SubType>256</SubType>
<ItemText>processStack</ItemText>
<AccSizeX>0</AccSizeX>
</Mm>
</MemoryWindow1>
<MemoryWindow2>
<Mm>
<WinNumber>2</WinNumber>
<SubType>0</SubType>
<ItemText>0x20000440</ItemText>
<AccSizeX>0</AccSizeX>
</Mm>
</MemoryWindow2>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
@ -425,7 +441,7 @@
<Group>
<GroupName>Tasks</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>

28
UE/u01/CLAUDE.md Normal file
View file

@ -0,0 +1,28 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Context
University exercise (RTO, "UE u01") for an STM32F072VBTx (Cortex-M0) board. The git root is two levels up (`rto1/`); `UE/` holds exercises, `VO/` holds lecture slides (PDF). The exercise spec is [doc/u01.pdf](doc/u01.pdf). Code comments are partly German.
## Build
Keil µVision 5 project [Apus.uvprojx](Apus.uvprojx), target `Apus`, ARM Compiler 6 (armclang V6.23). There is no Makefile, linter, or test suite. Command-line build:
```
"C:/Users/gaems/AppData/Local/Keil_v5/UV4/UV4.exe" -b Apus.uvprojx -j0 -o build_log.txt
```
(`-r` for rebuild, `-f` to flash.) Output goes to `output/` (`Apus.axf`, `Apus.build_log.htm`), map file to `listing/`. These build artifacts and the `.uvguix.*` / `.uvoptx` IDE state files are committed to git, so they show up as modified after every build.
- Global defines: `STM32F072,USE_STDPERIPH_DRIVER`. Include paths: `src`, `stm32f0-stdperiph`, `src/Devices`, `src/Tasks` — so BSP headers are included as `"BSP/Led.h"`, task headers directly.
- **New `.c` files must be added to the project's file groups in `Apus.uvprojx`** (or via the µVision IDE), otherwise they are not compiled.
## Architecture
- **Superloop, no RTOS (yet).** [src/main.c](src/main.c) initializes the BSP, then calls each task function (`TaskCounter`, `TaskKey`, `TaskLed`, `TaskWatch`, `TaskPoti`, `TaskMandelbrot`) once per loop iteration, clearing the TFT at the start of each iteration. Tasks are plain `void TaskX(void)` functions in [src/Tasks/](src/Tasks/) (aggregated by `TaskAll.h`) that keep state in `static` locals and draw their own row on the TFT (`Tft_DrawString(10, 18 + row*24, ...)`, 16x24 font).
- **Timing measurement via GPIO.** [src/Debug.c](src/Debug.c) drives GPIOB pins as logic-analyzer probes; `debug_t` maps each task (and the SysTick ISR) to a pin. `main.c` wraps every task call in `Debug_Set`/`Debug_Unset`; the double toggle on the `mandelbrot` pin at loop start measures the probe overhead. When adding a task, add an enum entry in `Debug.h` **and** its pin to the mask in `Debug_Init`.
- **SysTick** ([src/BSP/systick.c](src/BSP/systick.c)) fires every 1 ms and increments a private `msTicks` counter (also toggles the `systick` debug pin).
- **BSP** ([src/BSP/](src/BSP/)): `Key`, `Led`, `Adc` (potentiometer), `TftDisplay` — thin wrappers over the vendored ST Standard Peripheral Library in [stm32f0-stdperiph/](stm32f0-stdperiph/). Device/CMSIS/startup files live in [src/Devices/](src/Devices/). Don't modify vendored code.
- [src/StdDef.h](src/StdDef.h) provides `BOOL`/`TRUE`/`FALSE`/`NULL_PTR`; use these instead of `<stdbool.h>`. `assert()` failures land in `__aeabi_assert` in `main.c` (infinite loop for inspection in the debugger).

BIN
UE/u01/doc/psp.PNG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

View file

@ -0,0 +1,448 @@
// Dokumentation Übung 1 RTO
// Kompilieren: typst compile u01_dokumentation.typ (im Ordner doc/)
#let todo(body) = box(
fill: rgb("#ffe0e0"), inset: (x: 3pt, y: 2pt), radius: 2pt,
)[#text(fill: rgb("#b00000"))[*TODO:* #body]]
#let fehlt(name) = rect(
width: 100%, height: 4.5cm,
stroke: (paint: rgb("#b00000"), thickness: 0.8pt, dash: "dashed"),
)[#align(center + horizon)[#text(fill: rgb("#b00000"))[Screenshot fehlt: #raw(name)]]]
#set document(title: "Übung 1 RTO – Dokumentation")
#set page(paper: "a4", margin: 2.2cm, numbering: "1")
#set text(lang: "de", size: 11pt)
#set par(justify: true)
#set heading(numbering: "1.1")
#show raw.where(block: true): set text(size: 8.5pt)
#show raw.where(block: true): block.with(fill: luma(245), inset: 8pt, radius: 3pt, width: 100%)
#show figure.where(kind: table): set figure.caption(position: top)
#set table(stroke: 0.5pt + luma(160), inset: 5pt, fill: (x, y) => if y == 0 { luma(230) })
#align(center)[
#text(size: 20pt, weight: "bold")[Übung 1 – RTO]
#v(2pt)
#text(size: 13pt)[Vorläufer von Betriebssystemen, kooperative Task-Weitergabe]
#v(10pt)
Markus Neumann s2610567004, Christian Gamsjäger s2610567014 \
#datetime.today().display("[day].[month].[year]")
]
#v(1em)
#outline()
#pagebreak(weak: true)
= Überblick
*Programmstruktur:* Kooperative Superloop in `main.c`. Jeder Task ist eine Funktion `void TaskX(void)`, die pro Aufruf nur einen kurzen Arbeitsschritt erledigt und sofort zurückkehrt; der Zustand zwischen zwei Aufrufen liegt in `static`-Variablen. Gemeinsame Zeitbasis ist der SysTick-Interrupt mit 1 ms Periode.
```c
while (1)
{
Debug_Set(counter);
TaskCounter();
Debug_Unset(counter);
Debug_Set(key);
TaskKey();
Debug_Unset(key);
Debug_Set(led);
TaskLed();
Debug_Unset(led);
Debug_Set(watch);
TaskWatch();
Debug_Unset(watch);
Debug_Set(poti);
TaskPoti();
Debug_Unset(poti);
Debug_Set(mandelbrot);
TaskMandelbrot();
Debug_Unset(mandelbrot);
}
```
#pagebreak(weak: true)
= Aufgabe A – Debug-Unit zur Timing-Messung
== Implementierung
Jedem Task und dem SysTick-Interrupt ist ein Ausgang von Port B zugeordnet (@tab-pins). Beim Start des Tasks wird die Leitung auf High, beim Ende auf Low gesetzt; die Pulsbreite am Logic-Analyzer entspricht damit der Laufzeit.
#figure(
table(
columns: 3,
table.header([*Pin*], [*Signal*], [*Enum-Wert in* `Debug.h`]),
[PB0], [SystemTick], [`systick`],
[PB1], [TaskCounter], [`counter`],
[PB3], [TaskKey], [`key`],
[PB12], [TaskLed], [`led`],
[PB13], [TaskWatch], [`watch`],
[PB14], [TaskPoti], [`poti`],
[PB15], [TaskMandelbrot], [`mandelbrot`],
),
caption: [Zuordnung der Debug-Pins],
) <tab-pins>
`Debug_Init()` aktiviert den Takt für GPIOB und konfiguriert die sieben Pins als Push-Pull-Ausgänge (50 MHz, ohne Pull-up/-down). Die Tasks werden in `main.c` von außen eingerahmt, sodass der Task-Code selbst frei von Messcode bleibt. Nur der SysTick-Handler setzt seinen Pin intern:
```c
void SysTick_Handler (void){
Debug_Set(systick);
msTicks++;
Debug_Unset(systick);
}
```
== Messergebnisse im Ausgangszustand
Die folgenden Messungen zeigen den Ausgangszustand der Vorlage: Die Tasks geben nur ihre Beschriftung aus, Mandelbrot zeichnet das komplette Bild in einem Aufruf.
#figure(
table(
columns: (auto, auto, 1fr),
align: (left, right, left),
table.header([*Signal*], [*Laufzeit*], [*Bemerkung*]),
[SysTick], [0,956 µs], [alle 1 ms],
[Counter], [2,864 ms], [„Cnt “ + Zählerwert],
[Key], [1,887 ms], [„Key “ (4 Zeichen)],
[Led], [1,889 ms], [„Led “ (4 Zeichen)],
[Watch], [2,832 ms], [„Watch “ (6 Zeichen)],
[Poti], [2,362 ms], [„Poti “ (5 Zeichen)],
[Mandelbrot], [16,164 s], [komplettes Bild, blockierend],
),
caption: [Gemessene Laufzeiten im Ausgangszustand],
) <tab-a>
#grid(
columns: 1,
gutter: 10pt,
[#figure(image("img/counter.png", width: 100%), caption: [TaskCounter: 2,864 ms]) <fig-a-counter>],
[#figure(image("img/key.png", width: 100%), caption: [TaskKey: 1,887 ms]) <fig-a-key>],
[#figure(image("img/led.png", width: 100%), caption: [TaskLed: 1,889 ms]) <fig-a-led>],
[#figure(image("img/watch.png", width: 100%), caption: [TaskWatch: 2,832 ms]) <fig-a-watch>],
[#figure(image("img/poti.png", width: 100%), caption: [TaskPoti: 2,362 ms]) <fig-a-poti>],
[#figure(image("img/mandelbrot.png", width: 100%), caption: [TaskMandelbrot: 16,164 s]) <fig-a-mandel>],
)
#figure(image("img/systick.png", width: 75%), caption: [SysTick-Interrupt: Pulsbreite 0,956 µs]) <fig-systick>
*Auswertung:*
- Die Laufzeit der Tasks wird fast vollständig von der Textausgabe bestimmt. Aus Led (4 Zeichen, 1,889 ms), Poti (5 Zeichen, 2,362 ms) und Watch (6 Zeichen, 2,832 ms) ergibt sich übereinstimmend *≈ 0,472 ms pro Zeichen*. Ein Zeichen des 16×24-Fonts hat 384 Pixel, also ≈ 1,23 µs bzw. ≈ 59 Takte pro Pixel, da jedes Pixel per Software über GPIO-Zugriffe an das Display übertragen wird.
- Mandelbrot blockiert die Superloop für 16,16 s. Damit beträgt die Zykluszeit aller Tasks ≈ 16,2 s; keine der Zeitanforderungen aus Aufgabe B ist so erfüllbar.
- Der SysTick-Puls ist 0,956 µs breit. Davon sind 0,748 µs Messoverhead (@sec-overhead), die eigentliche Arbeit (`msTicks++`) dauert also nur ≈ 0,21 µs ≈ 10 Takte. Hinzu kommen Ein- und Austritt in den Interrupt (Cortex-M0: 16 Takte Latenz), die am Pin nicht sichtbar sind. Die CPU-Last durch den SysTick liegt damit unter 0,2 %.
== Overhead der Messroutine <sec-overhead>
*Methode:* In `main.c` wurden `Debug_Set(mandelbrot)` und `Debug_Unset(mandelbrot)` ohne Code dazwischen direkt hintereinander aufgerufen. Die gemessene Pulsbreite entspricht dem Overhead, den eine Messung zur Laufzeit eines Tasks hinzufügt (@fig-overhead).
#figure(image("img/overhead.png", width: 75%), caption: [Overhead-Messung: Pulsbreite 748 ns]) <fig-overhead>
$ t_"Overhead" = 748 "ns" quad arrow.r.double quad 748 "ns" dot 48 "MHz" approx 36 "Takte" $
Der Puls umfasst den Rücksprung aus `GPIO_WriteBit` und `Debug_Set`, den Aufruf von `Debug_Unset` (Parameter laden, `BL`, `PUSH`) und den Aufruf von `GPIO_WriteBit` bis zum eigentlichen Schreibzugriff auf das Portregister. Die Flash-Wartezyklen bei 48 MHz verlängern die Ausführung zusätzlich. Disassembly von `Debug_Set`:
```
Debug_Set:
PUSH {r7,lr}
MOV r1,r0 ; Pin-Maske
LDR r0,=0x48000400 ; GPIOB
MOVS r2,#1 ; Bit_SET
BL GPIO_WriteBit
POP {r7,pc}
```
*Bedeutung:* Jede gemessene Pulsbreite ist um ≈ 0,75 µs zu lang. Für Tasks im Millisekundenbereich ist das vernachlässigbar, für sehr kurze Tasks (z. B. Led mit 1,9 µs in Aufgabe B) dagegen nicht; dort gilt $t_"netto" approx t_"gemessen" - "0,75 µs"$. Der Overhead ließe sich auf wenige Takte reduzieren, indem `Debug_Set`/`Debug_Unset` als `static inline`-Funktionen direkt in die Register `GPIOB->BSRR` bzw. `GPIOB->BRR` schreiben.
#pagebreak(weak: true)
= Aufgabe B – Reaktionszeit in einer Superloop-Architektur
== Zeitbasis
Alle zeitabhängigen Tasks verwenden den Millisekundenzähler des SysTick. Dafür wurde `systick.c` um eine Abfragefunktion erweitert; `msTicks` ist `volatile`, da er in der ISR verändert wird:
```c
uint32_t Tick_GetMs(void){
return msTicks;
}
```
Ein 32-Bit-Lesezugriff ist auf dem Cortex-M0 atomar. Zeitvergleiche erfolgen immer als vorzeichenlose Differenz (`Tick_GetMs() - start >= dauer`); diese bleibt auch beim Überlauf des Zählers nach ≈ 49,7 Tagen korrekt. Kein Task wartet aktiv auf eine Zeit, sondern prüft nur, ob sie abgelaufen ist.
== Implementierung der Tasks
/ Counter: Erhöht den Zähler bei jedem Aufruf um 1 und gibt ihn aus.
/ Key: Liest die drei Tasten ein (+Flankenerkennung), USER-Taste aendert die Farbe (Schwarz → Blau → Grün → Schwarz) und gilt für alle danach gezeichneten Ausgaben.
```c
static BOOL Key_GetDebounced (KeyType key, uint32_t now)
{
...
BOOL raw = Key_GetState(key);
if (raw != lastRaw[key]) { lastRaw[key] = raw; lastChange[key] = now; }
else if (now - lastChange[key] >= DEBOUNCE_MS) { stable[key] = raw; }
return stable[key];
}
```
/ Led: Lauflicht über Led3, Led4 und Led5 als Zustandsautomat. Bei jedem Aufruf wird nur geprüft, ob seit dem letzten Wechsel 100 ms vergangen sind. Da der Zeitpunkt mit `lastSwitch += LED_PERIOD_MS` fortgeschrieben wird (statt auf die aktuelle Zeit gesetzt), entsteht keine Drift: Einzelne Umschaltungen können sich um höchstens einen Schleifendurchlauf verspäten, die mittlere Periode bleibt exakt 100 ms.
```c
else if (Tick_GetMs() - lastSwitch >= LED_PERIOD_MS)
{
Led_TurnOff(ledSeq[idx]);
idx = (idx + 1u) % LED_COUNT;
Led_TurnOn(ledSeq[idx]);
lastSwitch += LED_PERIOD_MS;
}
```
/ Poti: Liest den Potentiometer-Wert über den ADC (in mV) und gibt ihn mit fester Breite (`%4d`) aus, damit beim Kürzerwerden des Werts keine alten Ziffern stehen bleiben.
/ Watch: Berechnet die Betriebszeit aus `Tick_GetMs()` und gibt sie im Format mm:ss aus. Da die Zeit aus dem SysTick abgeleitet wird und nicht aus der Anzahl der Aufrufe, ist sie unabhängig von der Schleifendauer exakt.
/ Mandelbrot: Die Berechnung wurde zerlegt: Pro Aufruf werden Pixel berechnet, bis ein Zeitbudget von 5 ms verbraucht ist; die aktuelle Position (`curX`, `curY`) bleibt bis zum nächsten Aufruf erhalten. Nach dem letzten Pixel wird der Bildbereich zeilenweise (ebenfalls innerhalb des Zeitbudgets) gelöscht und das Bild neu gezeichnet. Dafür wurde der Display-Treiber um `Tft_ClearArea()` erweitert, das ein Rechteck in der Hintergrundfarbe füllt.
```c
while (Tick_GetMs() - start < TIME_BUDGET_MS)
{
if (clearing) { /* eine Bildzeile löschen, nach der letzten: clearing = FALSE */ }
else
{
MandelBrotPixel(curX, curY);
if (++curX >= ImageWidth)
{
curX = 0;
if (++curY >= ImageHeight) { curY = 0; clearing = TRUE; }
}
}
}
```
== Optimierung der Superloop
Nach der Zerlegung des Mandelbrot-Tasks betrug die Zykluszeit noch 26–27 ms. Ursache war die Textausgabe (≈ 0,47 ms pro Zeichen): In jedem Durchlauf wurden alle Beschriftungen und Werte neu gezeichnet, insgesamt rund 59 Zeichen. Folgende Maßnahmen wurden umgesetzt:
+ *Beschriftungen nur einmal zeichnen:* „Cnt“, „Key“, „Led“, „Watch“, „Poti“ und „ManBr“ werden nur beim ersten Aufruf des jeweiligen Tasks ausgegeben.
+ *Werte nur bei Änderung zeichnen:* Key bei Änderung eines entprellten Tastenzustands, Watch beim Sekundenwechsel, Poti bei einer Änderung von mehr als 10 mV gegenüber dem zuletzt angezeigten Wert (unterdrückt das Rauschen des ADC). Der Counter ändert sich bei jedem Aufruf und wird daher immer gezeichnet.
+ *Kein Löschen des ganzen Bildschirms:* `Tft_ClearScreen()` wird nur noch einmal vor der Superloop aufgerufen.
#figure(
table(
columns: (1fr, auto),
align: (left, right),
table.header([*Stand*], [*Zykluszeit*]),
[Vorlage (Mandelbrot blockierend)], [≈ 16,2 s],
[Mandelbrot zerlegt, alle Ausgaben in jedem Durchlauf], [26–27 ms],
[Endstand (Maßnahmen 1–3)], [≈ 7,0 ms],
[Endstand, Durchlauf mit Sekundenwechsel (Watch)], [≈ 9,5 ms],
),
caption: [Zykluszeit der Superloop],
) <tab-loop>
== Messergebnisse im Endstand
#figure(image("img/task_runtimes.png", width: 100%), caption: [Laufzeiten aller Tasks im Endstand]) <fig-b>
#figure(
table(
columns: (auto, auto, 1fr),
align: (left, right, left),
table.header([*Task*], [*Laufzeit*], [*Bemerkung*]),
[Counter], [1,949 ms], [Wert wird in jedem Durchlauf gezeichnet],
[Key], [7,7 µs], [ohne Änderung; mit Neuzeichnen ≈ 2,4 ms (5 Zeichen, abgeschätzt)],
[Led], [1,9 µs], [davon ≈ 0,75 µs Messoverhead],
[Watch], [2,439 ms], [nur beim Sekundenwechsel, sonst wenige µs],
[Poti], [18,0 µs], [ADC-Wandlung; mit Neuzeichnen ≈ 1,9 ms (4 Zeichen, abgeschätzt)],
[Mandelbrot], [5,035 ms], [Zeitbudget 5 ms],
),
caption: [Gemessene Laufzeiten im Endstand (@fig-b)],
) <tab-b>
Die Zykluszeiten in @tab-loop wurden aus dem Abstand zweier steigender Flanken von PB1 (Counter) in @fig-b abgelesen. #todo[Periodendauer von PB1 mit der Saleae-Messfunktion exakt nachmessen.]
== Nachweis der Zeitanforderungen
Der ungünstigste Durchlauf entsteht, wenn Key, Watch und Poti im selben Durchlauf neu zeichnen und Mandelbrot nach dem Löschen des Bildes zusätzlich die Beschriftung (6 Zeichen ≈ 2,8 ms) ausgibt:
$ T_"Loop,max" approx ("1,95" + "2,4" + "2,44" + "1,9" + "5,04" + "2,83") "ms" approx "16,6 ms" $
Für die Reaktionszeit auf einen Tastendruck gilt: Der Druck wird spätestens nach einem Durchlauf erkannt, nach 20 ms Entprellzeit (+1 ms Auflösung des SysTick) beim nächsten Aufruf übernommen und im selben Aufruf angezeigt:
$ t_"Reaktion,Key" <= T_"Loop,1" + 21 "ms" + T_"Loop,2" + t_"Anzeige" $
Da Watch nur einmal pro Sekunde und die Mandelbrot-Beschriftung nur einmal pro Bild neu gezeichnet werden, können zwei aufeinanderfolgende Durchläufe nicht beide den Maximalwert erreichen. Realistisch ungünstig ist $T_"Loop,1" approx "14,2 ms"$ (Watch, Poti, Beschriftung) und $T_"Loop,2" approx "8,9 ms"$ (Poti).
#figure(
table(
columns: (auto, auto, 1fr, auto),
align: (left, right, left, center),
table.header([*Anforderung*], [*Grenze*], [*Ergebnis*], [*erfüllt*]),
[Counter Zykluszeit], [≤ 20 ms], [$T_"Loop"$: typ. 7,0 ms, max. ≈ 16,6 ms], [✓],
[Key Reaktionszeit], [≤ 50 ms], [typ. 7,0 + 21 + 7,0 + 2,4 ≈ 37 ms; ungünstig 14,2 + 21 + 8,9 + 2,4 ≈ 47 ms], [✓],
[Poti Reaktionszeit], [≤ 50 ms], [Abtastung in jedem Durchlauf: ≤ $T_"Loop,max"$ ≈ 17 ms], [✓],
[Watch Aktualisierung], [≤ 1 s], [jede Sekunde, Verzögerung ≤ $T_"Loop"$], [✓],
[Led Periode], [100 ms], [Mittelwert exakt, Jitter ≤ $T_"Loop"$], [✓],
),
caption: [Vergleich mit den Zeitanforderungen],
) <tab-req>
Der Preis der Zerlegung ist eine längere Gesamtdauer für das Mandelbrot-Bild: Bei 16,16 s Rechenzeit und 5 ms pro Aufruf sind ≈ 3 230 Aufrufe nötig, bei ≈ 7 ms Zykluszeit dauert ein Bild damit rechnerisch ≈ 23 s statt 16 s. Dafür reagieren alle anderen Tasks innerhalb ihrer Grenzen.
#pagebreak(weak: true)
= Aufgabe C – Process-Stack (PSP) und Main-Stack (MSP)
== Implementierung
Die Umschaltung erfolgt am Beginn von `main()`. Die Initialisierung und die Superloop liegen in einer eigenen Funktion, die erst nach der Umschaltung aufgerufen wird:
```c
#define PS_SIZE 1024
static char processStack[PS_SIZE] __attribute__((aligned(8)));
static void Superloop(void) __attribute__((noinline, noreturn));
int main(void)
{
__set_PSP((uint32_t)processStack + PS_SIZE);
__set_CONTROL(2);
__ISB();
Superloop();
}
```
- `__set_PSP()` lädt den Process Stack Pointer mit dem Ende von `processStack` (0x20000478). Die Stacks des Cortex-M0 wachsen zu kleineren Adressen, und der Stack-Pointer zeigt auf das zuletzt belegte Wort (full descending); der erste `PUSH` schreibt daher auf 0x20000474. Das Array ist auf 8 Byte ausgerichtet, damit der Stack die von der ARM-Aufrufkonvention (AAPCS) geforderte 8-Byte-Ausrichtung hat.
- `__set_CONTROL(2)` setzt Bit 1 (SPSEL) im CONTROL-Register: Im Thread-Modus wird ab jetzt der PSP verwendet. Beim Cortex-M0 läuft der Thread-Modus immer privilegiert, nur SPSEL ist relevant.
- `__ISB()` (Instruction Synchronization Barrier) stellt sicher, dass alle folgenden Befehle bereits mit dem neuen Stack-Pointer ausgeführt werden.
- Im Handler-Modus (Interrupts) verwendet der Prozessor unabhängig von SPSEL immer den MSP.
*Warum eine eigene Funktion?* Der Compiler legt den Stackframe einer Funktion beim Eintritt an. In der ersten Version lagen Umschaltung und Superloop direkt in `main`: `main` reservierte beim Eintritt mit `SUB sp,sp,#8` einen Platz auf dem *MSP*, schaltete dann auf den PSP um und griff danach mit `[sp,#4]` auf diesen Platz zu, der nun über den PSP adressiert wurde. Das Ergebnis lag außerhalb von `processStack` im Ausgabepuffer von TaskCounter und wurde von diesem überschrieben. Im Debugger (@fig-psp-alt) ist das sichtbar: R4 enthält 0x30343432, also den Text „2440“ des Zählers, und wurde als Pin-Maske an `Debug_Set(led)` übergeben (ODR von GPIOB = 0x3432). In der korrigierten Version hat `main` keinen Stackframe mehr; der Stackframe von `Superloop` entsteht bereits auf dem PSP. `noinline` verhindert, dass der Compiler `Superloop` wieder in `main` einfügt.
#figure(image("psp.PNG", width: 100%), caption: [Erste Version: Zugriff von `main` über den falschen Stack (R4 = 0x30343432, ODR = 0x3432)]) <fig-psp-alt>
== Stack-Layout
Der SRAM liegt bei 0x20000000–0x20003FFF (16 KB). Die Lage der Bereiche stammt aus dem Map-File des Linkers (`listing/Apus.map`):
#figure(
table(
columns: (auto, auto, 1fr),
align: (left, right, left),
table.header([*Adressbereich*], [*Größe*], [*Inhalt*]),
[0x20000000–0x20000077], [120 B], [globale/statische Variablen (u. a. `msTicks` bei 0x20000070), 4 B Füllbytes für die Ausrichtung],
[0x20000078–0x20000477], [1024 B], [`processStack` → *PSP*, Startwert 0x20000478],
[0x20000478–0x20000497], [32 B], [Ausgabepuffer von TaskCounter und TaskPoti, Füllbytes],
[0x20000498–0x20000897], [1024 B], [`STACK` aus der Startup-Datei → *MSP*, Startwert 0x20000898],
[0x20000898–0x20003FFF], [≈ 13,9 KB], [frei],
),
caption: [Belegung des SRAM],
) <tab-ram>
Der Heap (512 B in der Startup-Datei) wird nicht verwendet und vom Linker entfernt.
*Begründung der Aufteilung:*
- *Trennung:* Der Stackbedarf der Interrupts muss nicht im Task-Stack eingeplant werden, und ein Überlauf des Task-Stacks beschädigt nicht den Stack der Interrupts. In einem späteren RTOS mit eigenem Stack pro Task muss die Interrupt-Reserve so nur einmal (im MSP) statt in jedem Task-Stack vorgehalten werden.
- *MSP, 1 KB* (Vorgabe `Stack_Size EQU 0x400` der Startup-Datei): Vor der Umschaltung belegt der Startup-Code der C-Bibliothek 16 B (`PUSH {r2-r4,lr}` in `__scatterload`), deshalb steht der MSP in der Superloop auf 0x20000888. Danach verwendet ihn nur noch der SysTick-Handler: `PUSH {r4,lr}` (8 B), `Debug_Set` (8 B) und `GPIO_WriteBit`. Der Bedarf liegt deutlich unter 100 B. Da nur eine Interruptquelle ohne Verschachtelung aktiv ist, ist 1 KB großzügig und bietet Reserve für weitere Interrupts in den folgenden Übungen.
- *PSP, 1 KB:* Der gesamte Anwendungscode läuft auf dem PSP, darunter `snprintf` aus der C-Bibliothek und die Software-Gleitkommaroutinen für `double` im Mandelbrot-Task. Zusätzlich werden pro Interrupt 32 B für den Exception-Frame auf dem PSP abgelegt. #todo[Maximal genutzte PSP-Tiefe messen: Da `processStack` im mit 0 initialisierten `.bss` liegt, zeigt die niedrigste Adresse ungleich 0 im Memory-Fenster nach einigen Minuten Laufzeit den höchsten Füllstand.]
- *Risiko:* Der Cortex-M0 besitzt keine MPU. Ein Überlauf des PSP würde unbemerkt die darunterliegenden Variablen (u. a. `msTicks`) überschreiben, ein Überlauf des MSP die Ausgabepuffer. Abhilfe wären Stacks am Ende des RAM mit freiem Abstand oder ein Füllmuster, das zur Laufzeit geprüft wird.
== Ablauf bei einem Interrupt
Tritt der SysTick-Interrupt auf, während die Superloop im Thread-Modus mit PSP läuft, geschieht Folgendes:
+ *Stacking (Hardware):* Der Prozessor legt 8 Register (32 Byte) auf dem *aktuellen* Stack ab, also auf dem PSP (@tab-frame). Der Frame wird immer auf 8 Byte ausgerichtet; falls nötig, wird ein Füllwort eingefügt und dies in Bit 9 des gesicherten xPSR vermerkt.
+ *Moduswechsel:* Der Prozessor wechselt in den Handler-Modus und verwendet ab jetzt den *MSP*. Das IPSR enthält die Exception-Nummer (SysTick = 15).
+ *Rücksprungwert:* Das LR wird mit dem Wert 0xFFFFFFFD geladen. Dieser `EXC_RETURN`-Wert kodiert, wohin und mit welchem Stack zurückgekehrt wird (@tab-excret).
+ *Handler (Software):* Der Compiler sichert im Prolog nur die vom Handler verwendeten Callee-saved-Register und das LR auf dem *MSP*, hier `PUSH {r4,lr}`.
+ *Rückkehr:* `POP {r4,pc}` lädt 0xFFFFFFFD in den PC. Der Prozessor erkennt den `EXC_RETURN`-Wert, holt die 8 Register vom PSP zurück (Unstacking, PSP + 32) und setzt das unterbrochene Programm im Thread-Modus fort.
```
SysTick_Handler:
PUSH {r4,lr} ; R4 und EXC_RETURN auf den MSP
MOVS r4,#1
MOV r0,r4
BL Debug_Set
LDR r0,=msTicks
LDR r1,[r0,#0]
ADDS r1,r1,#1
STR r1,[r0,#0]
MOV r0,r4
BL Debug_Unset
POP {r4,pc} ; PC = 0xFFFFFFFD -> Exception Return, Unstacking vom PSP
```
#grid(
columns: 2,
gutter: 14pt,
[#figure(
table(
columns: 2,
table.header([*Adresse*], [*Inhalt*]),
[PSP + 0x00], [R0],
[PSP + 0x04], [R1],
[PSP + 0x08], [R2],
[PSP + 0x0C], [R3],
[PSP + 0x10], [R12],
[PSP + 0x14], [LR (R14)],
[PSP + 0x18], [Rücksprungadresse (PC)],
[PSP + 0x1C], [xPSR],
),
caption: [Exception-Frame auf dem PSP],
) <tab-frame>],
[#figure(
table(
columns: 2,
table.header([`EXC_RETURN`], [*Rückkehr in*]),
[0xFFFFFFF1], [Handler-Modus, MSP],
[0xFFFFFFF9], [Thread-Modus, MSP],
[0xFFFFFFFD], [Thread-Modus, PSP],
),
caption: [`EXC_RETURN`-Werte],
) <tab-excret>],
)
Die Hardware sichert nur die Register, die laut ARM-Aufrufkonvention (AAPCS) eine aufgerufene Funktion verändern darf (R0–R3, R12, LR) sowie PC und xPSR. R4–R11 sichert der Handler bei Bedarf selbst, wie jede andere C-Funktion. Dadurch können Interrupt-Handler als normale C-Funktionen geschrieben werden.
== Analyse im µVision-Debugger
#figure(fehlt("img/psp_superloop.png"), caption: [Thread-Modus in der Superloop]) <fig-psp>
In der Superloop (@fig-psp) läuft der Prozessor im Thread-Modus: R13 (SP) ist gleich dem PSP. Erwartet wird PSP = 0x20000470 (Startwert 0x20000478 minus 8 B Stackframe von `Superloop`) und MSP = 0x20000888. Das xPSR hat IPSR = 0 (Thread-Modus) und das Thumb-Bit gesetzt.
#todo[Projekt neu übersetzen, Screenshots in der Superloop, mit Breakpoint auf der ersten Anweisung von `SysTick_Handler` (Register- und Memory-Fenster auf den PSP) und nach der Rückkehr einfügen, Werte in die Tabelle eintragen und die Adressen in @tab-ram mit `listing/Apus.map` vergleichen.]
#grid(
columns: 2,
gutter: 10pt,
[#figure(fehlt("img/isr_entry.png"), caption: [Im SysTick-Handler, nach dem Stacking])],
[#figure(fehlt("img/isr_return.png"), caption: [Nach der Rückkehr in die Superloop])],
)
#figure(
table(
columns: (auto, 1fr, 1fr, auto),
table.header([*Register*], [*vor dem Interrupt*], [*im Handler (erwartet)*], [*gemessen*]),
[R13 (SP)], [= PSP], [= MSP], [],
[PSP], [$p$ (in der Superloop 0x20000470)], [$p - "0x20"$ (Exception-Frame)], [],
[MSP], [0x20000888], [0x20000888, nach `PUSH` 0x20000880], [],
[LR], [beliebig], [0xFFFFFFFD], [],
[xPSR (IPSR)], [0], [15 (SysTick)], [],
),
caption: [Erwartete Registerwerte beim Eintritt in den SysTick-Handler],
) <tab-dbg>
== Funktion von PSP und MSP
- *MSP:* Nach dem Reset aktiv; der Startwert wird aus dem ersten Eintrag der Vektortabelle geladen (`__initial_sp` = 0x20000898). Der Handler-Modus verwendet immer den MSP, also alle Interrupts und Exceptions und in einem RTOS auch der Kernel und der Scheduler.
- *PSP:* Wird nur im Thread-Modus verwendet, wenn SPSEL = 1 ist, also für den Anwendungs- bzw. Task-Code. In einem RTOS erhält jeder Task einen eigenen Stack. Der Kontextwechsel besteht dann im Wesentlichen darin, den PSP auf den Stack des nächsten Tasks umzusetzen: Die Hardware legt beim Interrupt R0–R3, R12, LR, PC und xPSR auf dem Stack des unterbrochenen Tasks ab, der Scheduler sichert R4–R11 zusätzlich dort. Damit liegt der komplette Kontext eines Tasks in seinem eigenen Stack.
- *Vorteil der Trennung:* Interrupts haben einen eigenen, zuverlässig verfügbaren Stack, dessen Bedarf nur einmal eingeplant werden muss, und Anwendungs- und Systemspeicher sind sauber getrennt.
#pagebreak(weak: true)
= Quellen
- ARM: _Cortex-M0 Devices Generic User Guide_ (ARM DUI 0497A), Abschnitte „Stacks“, „Core registers“ (CONTROL-Register) und „Exception entry and return“.
- ARM: _Cortex-M0 Technical Reference Manual_ (ARM DDI 0432C), Exception-Modell und Interrupt-Latenz.
- STMicroelectronics: _RM0091 Reference Manual STM32F0x1/STM32F0x2/STM32F0x8_, Kapitel „Memory map“.
- STMicroelectronics: _Datenblatt STM32F072x8/xB_.
- J. Langer: _Übung 1 RTO_ (Angabe), 2026.

View file

@ -44,6 +44,9 @@ Section Cross References
tftdisplay.o(.text.Tft_DrawVLine) refers to tftdisplay.o(.text.Tft_SetWindow) for Tft_SetWindow
tftdisplay.o(.text.Tft_DrawVLine) refers to tftdisplay.o(.bss.Tft_Cfg.1) for [Anonymous Symbol]
tftdisplay.o(.ARM.exidx.text.Tft_DrawVLine) refers to tftdisplay.o(.text.Tft_DrawVLine) for [Anonymous Symbol]
tftdisplay.o(.text.Tft_ClearArea) refers to tftdisplay.o(.text.Tft_SetWindow) for Tft_SetWindow
tftdisplay.o(.text.Tft_ClearArea) refers to tftdisplay.o(.data.Tft_Cfg.0) for [Anonymous Symbol]
tftdisplay.o(.ARM.exidx.text.Tft_ClearArea) refers to tftdisplay.o(.text.Tft_ClearArea) for [Anonymous Symbol]
tftdisplay.o(.text.Tft_DrawChar) refers to tftdisplay.o(.text.Tft_SetWindow) for Tft_SetWindow
tftdisplay.o(.text.Tft_DrawChar) refers to tftdisplay.o(.bss.Tft_Cfg.2) for [Anonymous Symbol]
tftdisplay.o(.text.Tft_DrawChar) refers to tftdisplay.o(.data.Tft_Cfg.0) for [Anonymous Symbol]
@ -69,24 +72,29 @@ Section Cross References
systick.o(.text.Tick_InitSysTick) refers to uidiv_div0.o(.text) for __aeabi_uidiv
systick.o(.text.Tick_InitSysTick) refers to system_stm32f0xx.o(.data.SystemCoreClock) for SystemCoreClock
systick.o(.ARM.exidx.text.Tick_InitSysTick) refers to systick.o(.text.Tick_InitSysTick) for [Anonymous Symbol]
main_1.o(.text.main) refers to key.o(.text.Key_Init) for Key_Init
main_1.o(.text.main) refers to led.o(.text.Led_Init) for Led_Init
main_1.o(.text.main) refers to tftdisplay.o(.text.Tft_Init) for Tft_Init
main_1.o(.text.main) refers to tftdisplay.o(.text.Tft_SetFont) for Tft_SetFont
main_1.o(.text.main) refers to adc.o(.text.Adc_Init) for Adc_Init
main_1.o(.text.main) refers to systick.o(.text.Tick_InitSysTick) for Tick_InitSysTick
main_1.o(.text.main) refers to debug.o(.text.Debug_Init) for Debug_Init
main_1.o(.text.main) refers to tftdisplay.o(.text.Tft_ClearScreen) for Tft_ClearScreen
main_1.o(.text.main) refers to debug.o(.text.Debug_Set) for Debug_Set
main_1.o(.text.main) refers to debug.o(.text.Debug_Unset) for Debug_Unset
main_1.o(.text.main) refers to taskcounter.o(.text.TaskCounter) for TaskCounter
main_1.o(.text.main) refers to taskkey.o(.text.TaskKey) for TaskKey
main_1.o(.text.main) refers to taskled.o(.text.TaskLed) for TaskLed
main_1.o(.text.main) refers to taskwatch.o(.text.TaskWatch) for TaskWatch
main_1.o(.text.main) refers to taskpoti.o(.text.TaskPoti) for TaskPoti
main_1.o(.text.main) refers to taskmandelbrot.o(.text.TaskMandelbrot) for TaskMandelbrot
main_1.o(.text.main) refers to tftfont_16x24.o(.rodata.TftFont_16x24) for TftFont_16x24
systick.o(.text.Tick_GetMs) refers to systick.o(.bss.msTicks) for [Anonymous Symbol]
systick.o(.ARM.exidx.text.Tick_GetMs) refers to systick.o(.text.Tick_GetMs) for [Anonymous Symbol]
main_1.o(.text.main) refers to main_1.o(.text.Superloop) for Superloop
main_1.o(.text.main) refers to main_1.o(.bss.processStack) for [Anonymous Symbol]
main_1.o(.ARM.exidx.text.main) refers to main_1.o(.text.main) for [Anonymous Symbol]
main_1.o(.text.Superloop) refers to key.o(.text.Key_Init) for Key_Init
main_1.o(.text.Superloop) refers to led.o(.text.Led_Init) for Led_Init
main_1.o(.text.Superloop) refers to tftdisplay.o(.text.Tft_Init) for Tft_Init
main_1.o(.text.Superloop) refers to tftdisplay.o(.text.Tft_SetFont) for Tft_SetFont
main_1.o(.text.Superloop) refers to adc.o(.text.Adc_Init) for Adc_Init
main_1.o(.text.Superloop) refers to systick.o(.text.Tick_InitSysTick) for Tick_InitSysTick
main_1.o(.text.Superloop) refers to debug.o(.text.Debug_Init) for Debug_Init
main_1.o(.text.Superloop) refers to tftdisplay.o(.text.Tft_ClearScreen) for Tft_ClearScreen
main_1.o(.text.Superloop) refers to debug.o(.text.Debug_Set) for Debug_Set
main_1.o(.text.Superloop) refers to taskcounter.o(.text.TaskCounter) for TaskCounter
main_1.o(.text.Superloop) refers to debug.o(.text.Debug_Unset) for Debug_Unset
main_1.o(.text.Superloop) refers to taskkey.o(.text.TaskKey) for TaskKey
main_1.o(.text.Superloop) refers to taskled.o(.text.TaskLed) for TaskLed
main_1.o(.text.Superloop) refers to taskwatch.o(.text.TaskWatch) for TaskWatch
main_1.o(.text.Superloop) refers to taskpoti.o(.text.TaskPoti) for TaskPoti
main_1.o(.text.Superloop) refers to taskmandelbrot.o(.text.TaskMandelbrot) for TaskMandelbrot
main_1.o(.text.Superloop) refers to tftfont_16x24.o(.rodata.TftFont_16x24) for TftFont_16x24
main_1.o(.ARM.exidx.text.Superloop) refers to main_1.o(.text.Superloop) for [Anonymous Symbol]
main_1.o(.ARM.exidx.text.__aeabi_assert) refers to main_1.o(.text.__aeabi_assert) for [Anonymous Symbol]
debug.o(.text.Debug_Init) refers to stm32f0xx_rcc.o(.text.RCC_AHBPeriphClockCmd) for RCC_AHBPeriphClockCmd
debug.o(.text.Debug_Init) refers to stm32f0xx_gpio.o(.text.GPIO_StructInit) for GPIO_StructInit
@ -197,37 +205,69 @@ Section Cross References
system_stm32f0xx.o(.ARM.exidx.text.SystemCoreClockUpdate) refers to system_stm32f0xx.o(.text.SystemCoreClockUpdate) for [Anonymous Symbol]
tftfont_6x8.o(.rodata.TftFont_6x8) refers to tftfont_6x8.o(.rodata.Bitmaps_6x8) for [Anonymous Symbol]
tftfont_16x24.o(.rodata.TftFont_16x24) refers to tftfont_16x24.o(.rodata.Bitmaps_16x24) for [Anonymous Symbol]
taskcounter.o(.text.TaskCounter) refers to debug.o(.text.Debug_Set) for Debug_Set
taskcounter.o(.text.TaskCounter) refers to printf1.o(i.__0snprintf$1) for __2snprintf
taskcounter.o(.text.TaskCounter) refers to tftdisplay.o(.text.Tft_DrawString) for Tft_DrawString
taskcounter.o(.text.TaskCounter) refers to debug.o(.text.Debug_Unset) for Debug_Unset
taskcounter.o(.text.TaskCounter) refers to printf6.o(i.__0snprintf$6) for __2snprintf
taskcounter.o(.text.TaskCounter) refers to taskcounter.o(.bss.TaskCounter.initDone) for [Anonymous Symbol]
taskcounter.o(.text.TaskCounter) refers to taskcounter.o(.bss.TaskCounter.counter) for [Anonymous Symbol]
taskcounter.o(.text.TaskCounter) refers to taskcounter.o(.bss.tmpBuf) for [Anonymous Symbol]
taskcounter.o(.ARM.exidx.text.TaskCounter) refers to taskcounter.o(.text.TaskCounter) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to debug.o(.text.Debug_Set) for Debug_Set
taskkey.o(.text.TaskKey) refers to systick.o(.text.Tick_GetMs) for Tick_GetMs
taskkey.o(.text.TaskKey) refers to key.o(.text.Key_GetState) for Key_GetState
taskkey.o(.text.TaskKey) refers to tftdisplay.o(.text.Tft_SetForegroundColourRgb16) for Tft_SetForegroundColourRgb16
taskkey.o(.text.TaskKey) refers to tftdisplay.o(.text.Tft_DrawString) for Tft_DrawString
taskkey.o(.text.TaskKey) refers to debug.o(.text.Debug_Unset) for Debug_Unset
taskkey.o(.text.TaskKey) refers to printf6.o(i.__0snprintf$6) for __2snprintf
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.Key_GetDebounced.lastRaw.0) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.Key_GetDebounced.lastChange.0) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.Key_GetDebounced.stable.0) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.Key_GetDebounced.lastRaw.1) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.Key_GetDebounced.lastChange.1) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.Key_GetDebounced.stable.1) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.Key_GetDebounced.lastRaw.2) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.Key_GetDebounced.lastChange.2) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.Key_GetDebounced.stable.2) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.TaskKey.userPrev) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.current_color) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.TaskKey.initDone) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.TaskKey.lastState) for [Anonymous Symbol]
taskkey.o(.text.TaskKey) refers to taskkey.o(.bss.TaskKey.tmpBuf) for [Anonymous Symbol]
taskkey.o(.ARM.exidx.text.TaskKey) refers to taskkey.o(.text.TaskKey) for [Anonymous Symbol]
taskled.o(.text.TaskLed) refers to debug.o(.text.Debug_Set) for Debug_Set
taskled.o(.text.TaskLed) refers to systick.o(.text.Tick_GetMs) for Tick_GetMs
taskled.o(.text.TaskLed) refers to led.o(.text.Led_TurnOff) for Led_TurnOff
taskled.o(.text.TaskLed) refers to led.o(.text.Led_TurnOn) for Led_TurnOn
taskled.o(.text.TaskLed) refers to tftdisplay.o(.text.Tft_DrawString) for Tft_DrawString
taskled.o(.text.TaskLed) refers to debug.o(.text.Debug_Unset) for Debug_Unset
taskled.o(.text.TaskLed) refers to taskled.o(.bss.TaskLed.initDone) for [Anonymous Symbol]
taskled.o(.text.TaskLed) refers to taskled.o(.bss.TaskLed.lastSwitch) for [Anonymous Symbol]
taskled.o(.text.TaskLed) refers to taskled.o(.bss.TaskLed.idx) for [Anonymous Symbol]
taskled.o(.text.TaskLed) refers to taskled.o(.rodata.ledSeq) for [Anonymous Symbol]
taskled.o(.ARM.exidx.text.TaskLed) refers to taskled.o(.text.TaskLed) for [Anonymous Symbol]
taskmandelbrot.o(.text.TaskMandelbrot) refers to debug.o(.text.Debug_Set) for Debug_Set
taskmandelbrot.o(.text.TaskMandelbrot) refers to systick.o(.text.Tick_GetMs) for Tick_GetMs
taskmandelbrot.o(.text.TaskMandelbrot) refers to tftdisplay.o(.text.Tft_DrawString) for Tft_DrawString
taskmandelbrot.o(.text.TaskMandelbrot) refers to tftdisplay.o(.text.Tft_ClearArea) for Tft_ClearArea
taskmandelbrot.o(.text.TaskMandelbrot) refers to dfltui.o(.text) for __aeabi_ui2d
taskmandelbrot.o(.text.TaskMandelbrot) refers to dmul.o(.text) for __aeabi_dmul
taskmandelbrot.o(.text.TaskMandelbrot) refers to dadd.o(.text) for __aeabi_dadd
taskmandelbrot.o(.text.TaskMandelbrot) refers to dadd.o(.text) for __aeabi_dsub
taskmandelbrot.o(.text.TaskMandelbrot) refers to dcmpgt.o(.text) for __aeabi_dcmpgt
taskmandelbrot.o(.text.TaskMandelbrot) refers to tftdisplay.o(.text.Tft_DrawPixel) for Tft_DrawPixel
taskmandelbrot.o(.text.TaskMandelbrot) refers to debug.o(.text.Debug_Unset) for Debug_Unset
taskmandelbrot.o(.text.TaskMandelbrot) refers to taskmandelbrot.o(.bss.TaskMandelbrot.initDone) for [Anonymous Symbol]
taskmandelbrot.o(.text.TaskMandelbrot) refers to taskmandelbrot.o(.rodata.str1.1) for [Anonymous Symbol]
taskmandelbrot.o(.text.TaskMandelbrot) refers to taskmandelbrot.o(.bss.curX) for [Anonymous Symbol]
taskmandelbrot.o(.text.TaskMandelbrot) refers to taskmandelbrot.o(.bss.clearing) for [Anonymous Symbol]
taskmandelbrot.o(.text.TaskMandelbrot) refers to taskmandelbrot.o(.bss.curY) for [Anonymous Symbol]
taskmandelbrot.o(.ARM.exidx.text.TaskMandelbrot) refers to taskmandelbrot.o(.text.TaskMandelbrot) for [Anonymous Symbol]
taskpoti.o(.text.TaskPoti) refers to debug.o(.text.Debug_Set) for Debug_Set
taskpoti.o(.text.TaskPoti) refers to adc.o(.text.Adc_GetValue) for Adc_GetValue
taskpoti.o(.text.TaskPoti) refers to tftdisplay.o(.text.Tft_DrawString) for Tft_DrawString
taskpoti.o(.text.TaskPoti) refers to debug.o(.text.Debug_Unset) for Debug_Unset
taskpoti.o(.text.TaskPoti) refers to printf6.o(i.__0snprintf$6) for __2snprintf
taskpoti.o(.text.TaskPoti) refers to taskpoti.o(.bss.TaskPoti.initDone) for [Anonymous Symbol]
taskpoti.o(.text.TaskPoti) refers to taskpoti.o(.bss.TaskPoti.lastValue) for [Anonymous Symbol]
taskpoti.o(.text.TaskPoti) refers to taskpoti.o(.bss.tmpBuf) for [Anonymous Symbol]
taskpoti.o(.ARM.exidx.text.TaskPoti) refers to taskpoti.o(.text.TaskPoti) for [Anonymous Symbol]
taskwatch.o(.text.TaskWatch) refers to debug.o(.text.Debug_Set) for Debug_Set
taskwatch.o(.text.TaskWatch) refers to systick.o(.text.Tick_GetMs) for Tick_GetMs
taskwatch.o(.text.TaskWatch) refers to uidiv_div0.o(.text) for __aeabi_uidiv
taskwatch.o(.text.TaskWatch) refers to tftdisplay.o(.text.Tft_DrawString) for Tft_DrawString
taskwatch.o(.text.TaskWatch) refers to debug.o(.text.Debug_Unset) for Debug_Unset
taskwatch.o(.text.TaskWatch) refers to printf6.o(i.__0snprintf$6) for __2snprintf
taskwatch.o(.text.TaskWatch) refers to taskwatch.o(.bss.TaskWatch.initDone) for [Anonymous Symbol]
taskwatch.o(.text.TaskWatch) refers to taskwatch.o(.bss.TaskWatch.lastSeconds) for [Anonymous Symbol]
taskwatch.o(.text.TaskWatch) refers to taskwatch.o(.bss.TaskWatch.tmpBuf) for [Anonymous Symbol]
taskwatch.o(.ARM.exidx.text.TaskWatch) refers to taskwatch.o(.text.TaskWatch) for [Anonymous Symbol]
entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry10a.o(.ARM.Collect$$$$0000000D) for __rt_final_cpp
entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry11a.o(.ARM.Collect$$$$0000000F) for __rt_final_exit
@ -515,18 +555,13 @@ Removing Unused input sections from the image.
Removing key.o(.text), (0 bytes).
Removing key.o(.ARM.exidx.text.Key_Init), (8 bytes).
Removing key.o(.text.Key_GetState), (48 bytes).
Removing key.o(.ARM.exidx.text.Key_GetState), (8 bytes).
Removing led.o(.text), (0 bytes).
Removing led.o(.ARM.exidx.text.Led_Init), (8 bytes).
Removing led.o(.text.Led_TurnOn), (36 bytes).
Removing led.o(.ARM.exidx.text.Led_TurnOn), (8 bytes).
Removing led.o(.text.Led_TurnOff), (40 bytes).
Removing led.o(.ARM.exidx.text.Led_TurnOff), (8 bytes).
Removing led.o(.rodata..Lswitch.table.Led_TurnOff), (12 bytes).
Removing tftdisplay.o(.text), (0 bytes).
Removing tftdisplay.o(.ARM.exidx.text.Tft_Init), (8 bytes).
Removing tftdisplay.o(.text.Tft_SetForegroundColourRgb16), (12 bytes).
Removing tftdisplay.o(.ARM.exidx.text.Tft_SetForegroundColourRgb16), (8 bytes).
Removing tftdisplay.o(.text.Tft_SetBackgroundColourRgb16), (12 bytes).
Removing tftdisplay.o(.ARM.exidx.text.Tft_SetBackgroundColourRgb16), (8 bytes).
@ -538,19 +573,21 @@ Removing Unused input sections from the image.
Removing tftdisplay.o(.ARM.exidx.text.Tft_DrawHLine), (8 bytes).
Removing tftdisplay.o(.text.Tft_DrawVLine), (124 bytes).
Removing tftdisplay.o(.ARM.exidx.text.Tft_DrawVLine), (8 bytes).
Removing tftdisplay.o(.ARM.exidx.text.Tft_ClearArea), (8 bytes).
Removing tftdisplay.o(.ARM.exidx.text.Tft_DrawChar), (8 bytes).
Removing tftdisplay.o(.ARM.exidx.text.Tft_DrawString), (8 bytes).
Removing adc.o(.text), (0 bytes).
Removing adc.o(.ARM.exidx.text.Adc_Init), (8 bytes).
Removing adc.o(.text.Adc_SetChannel), (28 bytes).
Removing adc.o(.ARM.exidx.text.Adc_SetChannel), (8 bytes).
Removing adc.o(.text.Adc_GetValue), (108 bytes).
Removing adc.o(.ARM.exidx.text.Adc_GetValue), (8 bytes).
Removing systick.o(.text), (0 bytes).
Removing systick.o(.ARM.exidx.text.SysTick_Handler), (8 bytes).
Removing systick.o(.ARM.exidx.text.Tick_InitSysTick), (8 bytes).
Removing systick.o(.ARM.exidx.text.Tick_GetMs), (8 bytes).
Removing main_1.o(.text), (0 bytes).
Removing main_1.o(.ARM.exidx.text.main), (8 bytes).
Removing main_1.o(.ARM.exidx.text.Superloop), (8 bytes).
Removing main_1.o(.ARM.exidx.text.__aeabi_assert), (8 bytes).
Removing main_1.o(.ARM.use_no_argv), (4 bytes).
Removing debug.o(.text), (0 bytes).
@ -598,9 +635,7 @@ Removing Unused input sections from the image.
Removing stm32f0xx_adc.o(.ARM.exidx.text.ADC_GetCalibrationFactor), (8 bytes).
Removing stm32f0xx_adc.o(.text.ADC_StopOfConversion), (10 bytes).
Removing stm32f0xx_adc.o(.ARM.exidx.text.ADC_StopOfConversion), (8 bytes).
Removing stm32f0xx_adc.o(.text.ADC_StartOfConversion), (10 bytes).
Removing stm32f0xx_adc.o(.ARM.exidx.text.ADC_StartOfConversion), (8 bytes).
Removing stm32f0xx_adc.o(.text.ADC_GetConversionValue), (6 bytes).
Removing stm32f0xx_adc.o(.ARM.exidx.text.ADC_GetConversionValue), (8 bytes).
Removing stm32f0xx_adc.o(.text.ADC_DMACmd), (16 bytes).
Removing stm32f0xx_adc.o(.ARM.exidx.text.ADC_DMACmd), (8 bytes).
@ -608,7 +643,6 @@ Removing Unused input sections from the image.
Removing stm32f0xx_adc.o(.ARM.exidx.text.ADC_DMARequestModeConfig), (8 bytes).
Removing stm32f0xx_adc.o(.text.ADC_ITConfig), (20 bytes).
Removing stm32f0xx_adc.o(.ARM.exidx.text.ADC_ITConfig), (8 bytes).
Removing stm32f0xx_adc.o(.text.ADC_GetFlagStatus), (24 bytes).
Removing stm32f0xx_adc.o(.ARM.exidx.text.ADC_GetFlagStatus), (8 bytes).
Removing stm32f0xx_adc.o(.text.ADC_ClearFlag), (4 bytes).
Removing stm32f0xx_adc.o(.ARM.exidx.text.ADC_ClearFlag), (8 bytes).
@ -623,7 +657,6 @@ Removing Unused input sections from the image.
Removing stm32f0xx_gpio.o(.ARM.exidx.text.GPIO_StructInit), (8 bytes).
Removing stm32f0xx_gpio.o(.text.GPIO_PinLockConfig), (36 bytes).
Removing stm32f0xx_gpio.o(.ARM.exidx.text.GPIO_PinLockConfig), (8 bytes).
Removing stm32f0xx_gpio.o(.text.GPIO_ReadInputDataBit), (10 bytes).
Removing stm32f0xx_gpio.o(.ARM.exidx.text.GPIO_ReadInputDataBit), (8 bytes).
Removing stm32f0xx_gpio.o(.text.GPIO_ReadInputData), (4 bytes).
Removing stm32f0xx_gpio.o(.ARM.exidx.text.GPIO_ReadInputData), (8 bytes).
@ -749,7 +782,7 @@ Removing Unused input sections from the image.
Removing dfixul.o(.text), (64 bytes).
Removing cdrcmple.o(.text), (40 bytes).
235 unused section(s) (total 5414 bytes) removed from the image.
228 unused section(s) (total 5132 bytes) removed from the image.
==============================================================================
@ -855,115 +888,231 @@ Image Symbol Table
.text 0x080004b0 Section 48 init.o(.text)
.text 0x080004e0 Section 0 llushr.o(.text)
[Anonymous Symbol] 0x08000502 Section 0 stm32f0xx_adc.o(.text.ADC_Cmd)
[Anonymous Symbol] 0x08000514 Section 0 stm32f0xx_adc.o(.text.ADC_Init)
__arm_cp.1_0 0x08000538 Number 4 stm32f0xx_adc.o(.text.ADC_Init)
[Anonymous Symbol] 0x0800053c Section 0 adc.o(.text.Adc_Init)
__arm_cp.0_0 0x08000580 Number 4 adc.o(.text.Adc_Init)
[Anonymous Symbol] 0x08000584 Section 0 debug.o(.text.Debug_Init)
__arm_cp.0_0 0x080005ac Number 4 debug.o(.text.Debug_Init)
__arm_cp.0_1 0x080005b0 Number 4 debug.o(.text.Debug_Init)
[Anonymous Symbol] 0x080005b4 Section 0 debug.o(.text.Debug_Set)
[Anonymous Symbol] 0x080005c4 Section 0 debug.o(.text.Debug_Unset)
__arm_cp.2_0 0x080005d4 Number 4 debug.o(.text.Debug_Unset)
[Anonymous Symbol] 0x080005d8 Section 0 stm32f0xx_gpio.o(.text.GPIO_Init)
[Anonymous Symbol] 0x0800064c Section 0 stm32f0xx_gpio.o(.text.GPIO_StructInit)
__arm_cp.2_0 0x08000658 Number 4 stm32f0xx_gpio.o(.text.GPIO_StructInit)
[Anonymous Symbol] 0x0800065c Section 0 stm32f0xx_gpio.o(.text.GPIO_WriteBit)
[Anonymous Symbol] 0x08000668 Section 0 key.o(.text.Key_Init)
__arm_cp.0_0 0x080006a8 Number 4 key.o(.text.Key_Init)
[Anonymous Symbol] 0x080006ac Section 0 led.o(.text.Led_Init)
__arm_cp.0_0 0x080006e4 Number 4 led.o(.text.Led_Init)
[Anonymous Symbol] 0x080006e8 Section 0 stm32f0xx_rcc.o(.text.RCC_AHBPeriphClockCmd)
__arm_cp.31_0 0x08000700 Number 4 stm32f0xx_rcc.o(.text.RCC_AHBPeriphClockCmd)
[Anonymous Symbol] 0x08000704 Section 0 stm32f0xx_rcc.o(.text.RCC_APB2PeriphClockCmd)
__arm_cp.32_0 0x0800071c Number 4 stm32f0xx_rcc.o(.text.RCC_APB2PeriphClockCmd)
[Anonymous Symbol] 0x08000720 Section 0 systick.o(.text.SysTick_Handler)
__arm_cp.0_0 0x0800073c Number 4 systick.o(.text.SysTick_Handler)
[Anonymous Symbol] 0x08000740 Section 0 system_stm32f0xx.o(.text.SystemInit)
__arm_cp.0_0 0x08000814 Number 4 system_stm32f0xx.o(.text.SystemInit)
__arm_cp.0_1 0x08000818 Number 4 system_stm32f0xx.o(.text.SystemInit)
__arm_cp.0_2 0x0800081c Number 4 system_stm32f0xx.o(.text.SystemInit)
__arm_cp.0_3 0x08000820 Number 4 system_stm32f0xx.o(.text.SystemInit)
[Anonymous Symbol] 0x08000824 Section 0 taskcounter.o(.text.TaskCounter)
__arm_cp.0_0 0x08000860 Number 4 taskcounter.o(.text.TaskCounter)
__arm_cp.0_1 0x08000864 Number 4 taskcounter.o(.text.TaskCounter)
[Anonymous Symbol] 0x08000874 Section 0 taskkey.o(.text.TaskKey)
[Anonymous Symbol] 0x08000898 Section 0 taskled.o(.text.TaskLed)
[Anonymous Symbol] 0x080008c0 Section 0 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_1 0x08000a0c Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_2 0x08000a10 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_3 0x08000a14 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_4 0x08000a18 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_5 0x08000a1c Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_6 0x08000a20 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
[Anonymous Symbol] 0x08000a24 Section 0 taskpoti.o(.text.TaskPoti)
[Anonymous Symbol] 0x08000a4c Section 0 taskwatch.o(.text.TaskWatch)
[Anonymous Symbol] 0x08000a74 Section 0 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_1 0x08000af4 Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_3 0x08000af8 Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_4 0x08000afc Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_5 0x08000b00 Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_6 0x08000b04 Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_9 0x08000b08 Number 4 tftdisplay.o(.text.Tft_ClearScreen)
[Anonymous Symbol] 0x08000b0c Section 0 tftdisplay.o(.text.Tft_DrawChar)
__arm_cp.9_3 0x08000c30 Number 4 tftdisplay.o(.text.Tft_DrawChar)
[Anonymous Symbol] 0x08000c34 Section 0 tftdisplay.o(.text.Tft_DrawPixel)
__arm_cp.6_1 0x08000c8c Number 4 tftdisplay.o(.text.Tft_DrawPixel)
__arm_cp.6_2 0x08000c90 Number 4 tftdisplay.o(.text.Tft_DrawPixel)
[Anonymous Symbol] 0x08000c94 Section 0 tftdisplay.o(.text.Tft_DrawString)
[Anonymous Symbol] 0x08000ce8 Section 0 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_0 0x08000d70 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_1 0x08000d74 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_2 0x08000d78 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_3 0x08000d7c Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_4 0x08000d80 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_5 0x08000d84 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_6 0x08000d88 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_7 0x08000d8c Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_8 0x08000d90 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_9 0x08000d94 Number 4 tftdisplay.o(.text.Tft_Init)
[Anonymous Symbol] 0x08000d98 Section 0 tftdisplay.o(.text.Tft_SetFont)
__arm_cp.5_0 0x08000dc8 Number 4 tftdisplay.o(.text.Tft_SetFont)
Tft_SetWindow 0x08000dcd Thumb Code 248 tftdisplay.o(.text.Tft_SetWindow)
[Anonymous Symbol] 0x08000dcc Section 0 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_1 0x08000ee0 Number 4 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_3 0x08000f00 Number 4 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_4 0x08000f04 Number 4 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_5 0x08000f08 Number 4 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_6 0x08000f0c Number 4 tftdisplay.o(.text.Tft_SetWindow)
[Anonymous Symbol] 0x08000f28 Section 0 systick.o(.text.Tick_InitSysTick)
__arm_cp.1_0 0x08000f5c Number 4 systick.o(.text.Tick_InitSysTick)
__arm_cp.1_1 0x08000f60 Number 4 systick.o(.text.Tick_InitSysTick)
__arm_cp.1_2 0x08000f64 Number 4 systick.o(.text.Tick_InitSysTick)
__arm_cp.1_3 0x08000f68 Number 4 systick.o(.text.Tick_InitSysTick)
[Anonymous Symbol] 0x08000f6c Section 0 main_1.o(.text.__aeabi_assert)
[Anonymous Symbol] 0x08000f9c Section 0 main_1.o(.text.main)
__arm_cp.0_0 0x08000ff8 Number 4 main_1.o(.text.main)
i.__0snprintf$1 0x08000ffc Section 0 printf1.o(i.__0snprintf$1)
i.__ARM_clz 0x08001034 Section 0 depilogue.o(i.__ARM_clz)
i.__scatterload_copy 0x08001062 Section 14 handlers.o(i.__scatterload_copy)
i.__scatterload_null 0x08001070 Section 2 handlers.o(i.__scatterload_null)
i.__scatterload_zeroinit 0x08001072 Section 14 handlers.o(i.__scatterload_zeroinit)
_printf_core 0x08001081 Thumb Code 332 printf1.o(i._printf_core)
i._printf_core 0x08001080 Section 0 printf1.o(i._printf_core)
_snputc 0x080011d1 Thumb Code 22 printf1.o(i._snputc)
i._snputc 0x080011d0 Section 0 printf1.o(i._snputc)
Bitmaps_16x24 0x080011e6 Data 5376 tftfont_16x24.o(.rodata.Bitmaps_16x24)
[Anonymous Symbol] 0x080011e6 Section 0 tftfont_16x24.o(.rodata.Bitmaps_16x24)
[Anonymous Symbol] 0x080026f8 Section 0 tftdisplay.o(.rodata.str1.1)
[Anonymous Symbol] 0x08000514 Section 0 stm32f0xx_adc.o(.text.ADC_GetConversionValue)
[Anonymous Symbol] 0x0800051a Section 0 stm32f0xx_adc.o(.text.ADC_GetFlagStatus)
[Anonymous Symbol] 0x08000534 Section 0 stm32f0xx_adc.o(.text.ADC_Init)
__arm_cp.1_0 0x08000558 Number 4 stm32f0xx_adc.o(.text.ADC_Init)
[Anonymous Symbol] 0x0800055c Section 0 stm32f0xx_adc.o(.text.ADC_StartOfConversion)
[Anonymous Symbol] 0x08000568 Section 0 adc.o(.text.Adc_GetValue)
__arm_cp.2_1 0x080005c4 Number 4 adc.o(.text.Adc_GetValue)
__arm_cp.2_2 0x080005c8 Number 4 adc.o(.text.Adc_GetValue)
__arm_cp.2_3 0x080005cc Number 4 adc.o(.text.Adc_GetValue)
[Anonymous Symbol] 0x080005d0 Section 0 adc.o(.text.Adc_Init)
__arm_cp.0_0 0x08000614 Number 4 adc.o(.text.Adc_Init)
[Anonymous Symbol] 0x08000618 Section 0 debug.o(.text.Debug_Init)
__arm_cp.0_0 0x08000640 Number 4 debug.o(.text.Debug_Init)
__arm_cp.0_1 0x08000644 Number 4 debug.o(.text.Debug_Init)
[Anonymous Symbol] 0x08000648 Section 0 debug.o(.text.Debug_Set)
[Anonymous Symbol] 0x08000658 Section 0 debug.o(.text.Debug_Unset)
__arm_cp.2_0 0x08000668 Number 4 debug.o(.text.Debug_Unset)
[Anonymous Symbol] 0x0800066c Section 0 stm32f0xx_gpio.o(.text.GPIO_Init)
[Anonymous Symbol] 0x080006e0 Section 0 stm32f0xx_gpio.o(.text.GPIO_ReadInputDataBit)
[Anonymous Symbol] 0x080006ec Section 0 stm32f0xx_gpio.o(.text.GPIO_StructInit)
__arm_cp.2_0 0x080006f8 Number 4 stm32f0xx_gpio.o(.text.GPIO_StructInit)
[Anonymous Symbol] 0x080006fc Section 0 stm32f0xx_gpio.o(.text.GPIO_WriteBit)
[Anonymous Symbol] 0x08000708 Section 0 key.o(.text.Key_GetState)
[Anonymous Symbol] 0x08000734 Section 0 key.o(.text.Key_Init)
__arm_cp.0_0 0x08000774 Number 4 key.o(.text.Key_Init)
[Anonymous Symbol] 0x08000778 Section 0 led.o(.text.Led_Init)
__arm_cp.0_0 0x080007b0 Number 4 led.o(.text.Led_Init)
[Anonymous Symbol] 0x080007b4 Section 0 led.o(.text.Led_TurnOff)
[Anonymous Symbol] 0x080007d4 Section 0 led.o(.text.Led_TurnOn)
__arm_cp.1_0 0x080007f0 Number 4 led.o(.text.Led_TurnOn)
__arm_cp.1_1 0x080007f4 Number 4 led.o(.text.Led_TurnOn)
[Anonymous Symbol] 0x080007f8 Section 0 stm32f0xx_rcc.o(.text.RCC_AHBPeriphClockCmd)
__arm_cp.31_0 0x08000810 Number 4 stm32f0xx_rcc.o(.text.RCC_AHBPeriphClockCmd)
[Anonymous Symbol] 0x08000814 Section 0 stm32f0xx_rcc.o(.text.RCC_APB2PeriphClockCmd)
__arm_cp.32_0 0x0800082c Number 4 stm32f0xx_rcc.o(.text.RCC_APB2PeriphClockCmd)
Superloop 0x08000831 Thumb Code 156 main_1.o(.text.Superloop)
[Anonymous Symbol] 0x08000830 Section 0 main_1.o(.text.Superloop)
__arm_cp.1_0 0x080008cc Number 4 main_1.o(.text.Superloop)
[Anonymous Symbol] 0x080008d0 Section 0 systick.o(.text.SysTick_Handler)
__arm_cp.0_0 0x080008ec Number 4 systick.o(.text.SysTick_Handler)
[Anonymous Symbol] 0x080008f0 Section 0 system_stm32f0xx.o(.text.SystemInit)
__arm_cp.0_0 0x080009c4 Number 4 system_stm32f0xx.o(.text.SystemInit)
__arm_cp.0_1 0x080009c8 Number 4 system_stm32f0xx.o(.text.SystemInit)
__arm_cp.0_2 0x080009cc Number 4 system_stm32f0xx.o(.text.SystemInit)
__arm_cp.0_3 0x080009d0 Number 4 system_stm32f0xx.o(.text.SystemInit)
[Anonymous Symbol] 0x080009d4 Section 0 taskcounter.o(.text.TaskCounter)
__arm_cp.0_0 0x08000a0c Number 4 taskcounter.o(.text.TaskCounter)
__arm_cp.0_2 0x08000a18 Number 4 taskcounter.o(.text.TaskCounter)
__arm_cp.0_3 0x08000a1c Number 4 taskcounter.o(.text.TaskCounter)
[Anonymous Symbol] 0x08000a24 Section 0 taskkey.o(.text.TaskKey)
__arm_cp.0_0 0x08000b4c Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_1 0x08000b50 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_2 0x08000b54 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_3 0x08000b58 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_4 0x08000b5c Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_5 0x08000b60 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_6 0x08000b64 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_7 0x08000b68 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_8 0x08000b6c Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_9 0x08000b70 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_10 0x08000b74 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_11 0x08000b78 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_13 0x08000b84 Number 4 taskkey.o(.text.TaskKey)
__arm_cp.0_14 0x08000b88 Number 4 taskkey.o(.text.TaskKey)
[Anonymous Symbol] 0x08000b98 Section 0 taskled.o(.text.TaskLed)
__arm_cp.0_0 0x08000c00 Number 4 taskled.o(.text.TaskLed)
__arm_cp.0_2 0x08000c0c Number 4 taskled.o(.text.TaskLed)
__arm_cp.0_3 0x08000c10 Number 4 taskled.o(.text.TaskLed)
__arm_cp.0_4 0x08000c14 Number 4 taskled.o(.text.TaskLed)
[Anonymous Symbol] 0x08000c18 Section 0 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_0 0x08000de4 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_1 0x08000de8 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_2 0x08000dec Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_3 0x08000df0 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_4 0x08000df4 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_5 0x08000df8 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_6 0x08000dfc Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_7 0x08000e00 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_8 0x08000e04 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
__arm_cp.0_9 0x08000e08 Number 4 taskmandelbrot.o(.text.TaskMandelbrot)
[Anonymous Symbol] 0x08000e0c Section 0 taskpoti.o(.text.TaskPoti)
__arm_cp.0_0 0x08000e60 Number 4 taskpoti.o(.text.TaskPoti)
__arm_cp.0_2 0x08000e6c Number 4 taskpoti.o(.text.TaskPoti)
__arm_cp.0_3 0x08000e70 Number 4 taskpoti.o(.text.TaskPoti)
[Anonymous Symbol] 0x08000e78 Section 0 taskwatch.o(.text.TaskWatch)
__arm_cp.0_0 0x08000ee8 Number 4 taskwatch.o(.text.TaskWatch)
__arm_cp.0_2 0x08000ef4 Number 4 taskwatch.o(.text.TaskWatch)
__arm_cp.0_3 0x08000ef8 Number 4 taskwatch.o(.text.TaskWatch)
__arm_cp.0_4 0x08000efc Number 4 taskwatch.o(.text.TaskWatch)
[Anonymous Symbol] 0x08000f0c Section 0 tftdisplay.o(.text.Tft_ClearArea)
[Anonymous Symbol] 0x08000f7c Section 0 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_1 0x08000ffc Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_3 0x08001000 Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_4 0x08001004 Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_5 0x08001008 Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_6 0x0800100c Number 4 tftdisplay.o(.text.Tft_ClearScreen)
__arm_cp.3_9 0x08001010 Number 4 tftdisplay.o(.text.Tft_ClearScreen)
[Anonymous Symbol] 0x08001014 Section 0 tftdisplay.o(.text.Tft_DrawChar)
__arm_cp.10_3 0x08001138 Number 4 tftdisplay.o(.text.Tft_DrawChar)
[Anonymous Symbol] 0x0800113c Section 0 tftdisplay.o(.text.Tft_DrawPixel)
__arm_cp.6_1 0x08001194 Number 4 tftdisplay.o(.text.Tft_DrawPixel)
[Anonymous Symbol] 0x08001198 Section 0 tftdisplay.o(.text.Tft_DrawString)
[Anonymous Symbol] 0x080011ec Section 0 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_0 0x08001274 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_1 0x08001278 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_2 0x0800127c Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_3 0x08001280 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_4 0x08001284 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_5 0x08001288 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_6 0x0800128c Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_7 0x08001290 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_8 0x08001294 Number 4 tftdisplay.o(.text.Tft_Init)
__arm_cp.0_9 0x08001298 Number 4 tftdisplay.o(.text.Tft_Init)
[Anonymous Symbol] 0x0800129c Section 0 tftdisplay.o(.text.Tft_SetFont)
__arm_cp.5_0 0x080012cc Number 4 tftdisplay.o(.text.Tft_SetFont)
[Anonymous Symbol] 0x080012d0 Section 0 tftdisplay.o(.text.Tft_SetForegroundColourRgb16)
__arm_cp.1_0 0x080012d8 Number 4 tftdisplay.o(.text.Tft_SetForegroundColourRgb16)
Tft_SetWindow 0x080012dd Thumb Code 248 tftdisplay.o(.text.Tft_SetWindow)
[Anonymous Symbol] 0x080012dc Section 0 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_1 0x080013f0 Number 4 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_3 0x08001410 Number 4 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_4 0x08001414 Number 4 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_5 0x08001418 Number 4 tftdisplay.o(.text.Tft_SetWindow)
__arm_cp.4_6 0x0800141c Number 4 tftdisplay.o(.text.Tft_SetWindow)
[Anonymous Symbol] 0x08001438 Section 0 systick.o(.text.Tick_GetMs)
__arm_cp.2_0 0x08001440 Number 4 systick.o(.text.Tick_GetMs)
[Anonymous Symbol] 0x08001444 Section 0 systick.o(.text.Tick_InitSysTick)
__arm_cp.1_0 0x08001478 Number 4 systick.o(.text.Tick_InitSysTick)
__arm_cp.1_1 0x0800147c Number 4 systick.o(.text.Tick_InitSysTick)
__arm_cp.1_2 0x08001480 Number 4 systick.o(.text.Tick_InitSysTick)
__arm_cp.1_3 0x08001484 Number 4 systick.o(.text.Tick_InitSysTick)
[Anonymous Symbol] 0x08001488 Section 0 main_1.o(.text.__aeabi_assert)
[Anonymous Symbol] 0x080014b8 Section 0 main_1.o(.text.main)
__arm_cp.0_0 0x080014d4 Number 4 main_1.o(.text.main)
i.__0snprintf$6 0x080014d8 Section 0 printf6.o(i.__0snprintf$6)
i.__ARM_clz 0x08001510 Section 0 depilogue.o(i.__ARM_clz)
i.__scatterload_copy 0x0800153e Section 14 handlers.o(i.__scatterload_copy)
i.__scatterload_null 0x0800154c Section 2 handlers.o(i.__scatterload_null)
i.__scatterload_zeroinit 0x0800154e Section 14 handlers.o(i.__scatterload_zeroinit)
_printf_core 0x0800155d Thumb Code 768 printf6.o(i._printf_core)
i._printf_core 0x0800155c Section 0 printf6.o(i._printf_core)
_printf_post_padding 0x08001861 Thumb Code 32 printf6.o(i._printf_post_padding)
i._printf_post_padding 0x08001860 Section 0 printf6.o(i._printf_post_padding)
_printf_pre_padding 0x08001881 Thumb Code 44 printf6.o(i._printf_pre_padding)
i._printf_pre_padding 0x08001880 Section 0 printf6.o(i._printf_pre_padding)
_snputc 0x080018ad Thumb Code 22 printf6.o(i._snputc)
i._snputc 0x080018ac Section 0 printf6.o(i._snputc)
[Anonymous Symbol] 0x080018c2 Section 0 led.o(.rodata..Lswitch.table.Led_TurnOff)
Bitmaps_16x24 0x080018ce Data 5376 tftfont_16x24.o(.rodata.Bitmaps_16x24)
[Anonymous Symbol] 0x080018ce Section 0 tftfont_16x24.o(.rodata.Bitmaps_16x24)
ledSeq 0x08002de0 Data 3 taskled.o(.rodata.ledSeq)
[Anonymous Symbol] 0x08002de0 Section 0 taskled.o(.rodata.ledSeq)
[Anonymous Symbol] 0x08002de3 Section 0 tftdisplay.o(.rodata.str1.1)
[Anonymous Symbol] 0x08002df8 Section 0 taskmandelbrot.o(.rodata.str1.1)
Tft_Cfg.0 0x20000004 Data 2 tftdisplay.o(.data.Tft_Cfg.0)
[Anonymous Symbol] 0x20000004 Section 0 tftdisplay.o(.data.Tft_Cfg.0)
TaskCounter.counter 0x20000008 Data 4 taskcounter.o(.bss.TaskCounter.counter)
[Anonymous Symbol] 0x20000008 Section 0 taskcounter.o(.bss.TaskCounter.counter)
Tft_Cfg.1 0x2000000c Data 2 tftdisplay.o(.bss.Tft_Cfg.1)
[Anonymous Symbol] 0x2000000c Section 0 tftdisplay.o(.bss.Tft_Cfg.1)
Tft_Cfg.2 0x20000010 Data 4 tftdisplay.o(.bss.Tft_Cfg.2)
[Anonymous Symbol] 0x20000010 Section 0 tftdisplay.o(.bss.Tft_Cfg.2)
msTicks 0x20000014 Data 4 systick.o(.bss.msTicks)
[Anonymous Symbol] 0x20000014 Section 0 systick.o(.bss.msTicks)
tmpBuf 0x20000018 Data 14 taskcounter.o(.bss.tmpBuf)
[Anonymous Symbol] 0x20000018 Section 0 taskcounter.o(.bss.tmpBuf)
STACK 0x20000028 Section 1024 startup_stm32f072.o(STACK)
Key_GetDebounced.lastChange.0 0x20000008 Data 4 taskkey.o(.bss.Key_GetDebounced.lastChange.0)
[Anonymous Symbol] 0x20000008 Section 0 taskkey.o(.bss.Key_GetDebounced.lastChange.0)
Key_GetDebounced.lastChange.1 0x2000000c Data 4 taskkey.o(.bss.Key_GetDebounced.lastChange.1)
[Anonymous Symbol] 0x2000000c Section 0 taskkey.o(.bss.Key_GetDebounced.lastChange.1)
Key_GetDebounced.lastChange.2 0x20000010 Data 4 taskkey.o(.bss.Key_GetDebounced.lastChange.2)
[Anonymous Symbol] 0x20000010 Section 0 taskkey.o(.bss.Key_GetDebounced.lastChange.2)
Key_GetDebounced.lastRaw.0 0x20000014 Data 1 taskkey.o(.bss.Key_GetDebounced.lastRaw.0)
[Anonymous Symbol] 0x20000014 Section 0 taskkey.o(.bss.Key_GetDebounced.lastRaw.0)
Key_GetDebounced.lastRaw.1 0x20000015 Data 1 taskkey.o(.bss.Key_GetDebounced.lastRaw.1)
[Anonymous Symbol] 0x20000015 Section 0 taskkey.o(.bss.Key_GetDebounced.lastRaw.1)
Key_GetDebounced.lastRaw.2 0x20000016 Data 1 taskkey.o(.bss.Key_GetDebounced.lastRaw.2)
[Anonymous Symbol] 0x20000016 Section 0 taskkey.o(.bss.Key_GetDebounced.lastRaw.2)
Key_GetDebounced.stable.0 0x20000017 Data 1 taskkey.o(.bss.Key_GetDebounced.stable.0)
[Anonymous Symbol] 0x20000017 Section 0 taskkey.o(.bss.Key_GetDebounced.stable.0)
Key_GetDebounced.stable.1 0x20000018 Data 1 taskkey.o(.bss.Key_GetDebounced.stable.1)
[Anonymous Symbol] 0x20000018 Section 0 taskkey.o(.bss.Key_GetDebounced.stable.1)
Key_GetDebounced.stable.2 0x20000019 Data 1 taskkey.o(.bss.Key_GetDebounced.stable.2)
[Anonymous Symbol] 0x20000019 Section 0 taskkey.o(.bss.Key_GetDebounced.stable.2)
TaskCounter.counter 0x2000001c Data 4 taskcounter.o(.bss.TaskCounter.counter)
[Anonymous Symbol] 0x2000001c Section 0 taskcounter.o(.bss.TaskCounter.counter)
TaskCounter.initDone 0x20000020 Data 1 taskcounter.o(.bss.TaskCounter.initDone)
[Anonymous Symbol] 0x20000020 Section 0 taskcounter.o(.bss.TaskCounter.initDone)
TaskKey.initDone 0x20000021 Data 1 taskkey.o(.bss.TaskKey.initDone)
[Anonymous Symbol] 0x20000021 Section 0 taskkey.o(.bss.TaskKey.initDone)
TaskKey.lastState 0x20000022 Data 1 taskkey.o(.bss.TaskKey.lastState)
[Anonymous Symbol] 0x20000022 Section 0 taskkey.o(.bss.TaskKey.lastState)
TaskKey.tmpBuf 0x20000023 Data 14 taskkey.o(.bss.TaskKey.tmpBuf)
[Anonymous Symbol] 0x20000023 Section 0 taskkey.o(.bss.TaskKey.tmpBuf)
TaskKey.userPrev 0x20000031 Data 1 taskkey.o(.bss.TaskKey.userPrev)
[Anonymous Symbol] 0x20000031 Section 0 taskkey.o(.bss.TaskKey.userPrev)
TaskLed.idx 0x20000032 Data 1 taskled.o(.bss.TaskLed.idx)
[Anonymous Symbol] 0x20000032 Section 0 taskled.o(.bss.TaskLed.idx)
TaskLed.initDone 0x20000033 Data 1 taskled.o(.bss.TaskLed.initDone)
[Anonymous Symbol] 0x20000033 Section 0 taskled.o(.bss.TaskLed.initDone)
TaskLed.lastSwitch 0x20000034 Data 4 taskled.o(.bss.TaskLed.lastSwitch)
[Anonymous Symbol] 0x20000034 Section 0 taskled.o(.bss.TaskLed.lastSwitch)
TaskMandelbrot.initDone 0x20000038 Data 1 taskmandelbrot.o(.bss.TaskMandelbrot.initDone)
[Anonymous Symbol] 0x20000038 Section 0 taskmandelbrot.o(.bss.TaskMandelbrot.initDone)
TaskPoti.initDone 0x20000039 Data 1 taskpoti.o(.bss.TaskPoti.initDone)
[Anonymous Symbol] 0x20000039 Section 0 taskpoti.o(.bss.TaskPoti.initDone)
TaskPoti.lastValue 0x2000003c Data 4 taskpoti.o(.bss.TaskPoti.lastValue)
[Anonymous Symbol] 0x2000003c Section 0 taskpoti.o(.bss.TaskPoti.lastValue)
TaskWatch.initDone 0x20000040 Data 1 taskwatch.o(.bss.TaskWatch.initDone)
[Anonymous Symbol] 0x20000040 Section 0 taskwatch.o(.bss.TaskWatch.initDone)
TaskWatch.lastSeconds 0x20000044 Data 4 taskwatch.o(.bss.TaskWatch.lastSeconds)
[Anonymous Symbol] 0x20000044 Section 0 taskwatch.o(.bss.TaskWatch.lastSeconds)
TaskWatch.tmpBuf 0x20000048 Data 14 taskwatch.o(.bss.TaskWatch.tmpBuf)
[Anonymous Symbol] 0x20000048 Section 0 taskwatch.o(.bss.TaskWatch.tmpBuf)
Tft_Cfg.1 0x20000058 Data 2 tftdisplay.o(.bss.Tft_Cfg.1)
[Anonymous Symbol] 0x20000058 Section 0 tftdisplay.o(.bss.Tft_Cfg.1)
Tft_Cfg.2 0x2000005c Data 4 tftdisplay.o(.bss.Tft_Cfg.2)
[Anonymous Symbol] 0x2000005c Section 0 tftdisplay.o(.bss.Tft_Cfg.2)
clearing 0x20000060 Data 1 taskmandelbrot.o(.bss.clearing)
[Anonymous Symbol] 0x20000060 Section 0 taskmandelbrot.o(.bss.clearing)
curX 0x20000064 Data 4 taskmandelbrot.o(.bss.curX)
[Anonymous Symbol] 0x20000064 Section 0 taskmandelbrot.o(.bss.curX)
curY 0x20000068 Data 4 taskmandelbrot.o(.bss.curY)
[Anonymous Symbol] 0x20000068 Section 0 taskmandelbrot.o(.bss.curY)
current_color 0x2000006c Data 2 taskkey.o(.bss.current_color)
[Anonymous Symbol] 0x2000006c Section 0 taskkey.o(.bss.current_color)
msTicks 0x20000070 Data 4 systick.o(.bss.msTicks)
[Anonymous Symbol] 0x20000070 Section 0 systick.o(.bss.msTicks)
processStack 0x20000078 Data 1024 main_1.o(.bss.processStack)
[Anonymous Symbol] 0x20000078 Section 0 main_1.o(.bss.processStack)
tmpBuf 0x20000478 Data 14 taskcounter.o(.bss.tmpBuf)
[Anonymous Symbol] 0x20000478 Section 0 taskcounter.o(.bss.tmpBuf)
tmpBuf 0x20000486 Data 14 taskpoti.o(.bss.tmpBuf)
[Anonymous Symbol] 0x20000486 Section 0 taskpoti.o(.bss.tmpBuf)
STACK 0x20000498 Section 1024 startup_stm32f072.o(STACK)
Global Symbols
@ -1085,47 +1234,58 @@ Image Symbol Table
__aeabi_llsr 0x080004e1 Thumb Code 34 llushr.o(.text)
_ll_ushift_r 0x080004e1 Thumb Code 0 llushr.o(.text)
ADC_Cmd 0x08000503 Thumb Code 18 stm32f0xx_adc.o(.text.ADC_Cmd)
ADC_Init 0x08000515 Thumb Code 36 stm32f0xx_adc.o(.text.ADC_Init)
Adc_Init 0x0800053d Thumb Code 68 adc.o(.text.Adc_Init)
Debug_Init 0x08000585 Thumb Code 40 debug.o(.text.Debug_Init)
Debug_Set 0x080005b5 Thumb Code 16 debug.o(.text.Debug_Set)
Debug_Unset 0x080005c5 Thumb Code 16 debug.o(.text.Debug_Unset)
GPIO_Init 0x080005d9 Thumb Code 116 stm32f0xx_gpio.o(.text.GPIO_Init)
GPIO_StructInit 0x0800064d Thumb Code 12 stm32f0xx_gpio.o(.text.GPIO_StructInit)
GPIO_WriteBit 0x0800065d Thumb Code 12 stm32f0xx_gpio.o(.text.GPIO_WriteBit)
Key_Init 0x08000669 Thumb Code 64 key.o(.text.Key_Init)
Led_Init 0x080006ad Thumb Code 56 led.o(.text.Led_Init)
RCC_AHBPeriphClockCmd 0x080006e9 Thumb Code 24 stm32f0xx_rcc.o(.text.RCC_AHBPeriphClockCmd)
RCC_APB2PeriphClockCmd 0x08000705 Thumb Code 24 stm32f0xx_rcc.o(.text.RCC_APB2PeriphClockCmd)
SysTick_Handler 0x08000721 Thumb Code 28 systick.o(.text.SysTick_Handler)
SystemInit 0x08000741 Thumb Code 212 system_stm32f0xx.o(.text.SystemInit)
TaskCounter 0x08000825 Thumb Code 60 taskcounter.o(.text.TaskCounter)
TaskKey 0x08000875 Thumb Code 28 taskkey.o(.text.TaskKey)
TaskLed 0x08000899 Thumb Code 32 taskled.o(.text.TaskLed)
TaskMandelbrot 0x080008c1 Thumb Code 324 taskmandelbrot.o(.text.TaskMandelbrot)
TaskPoti 0x08000a25 Thumb Code 32 taskpoti.o(.text.TaskPoti)
TaskWatch 0x08000a4d Thumb Code 32 taskwatch.o(.text.TaskWatch)
Tft_ClearScreen 0x08000a75 Thumb Code 128 tftdisplay.o(.text.Tft_ClearScreen)
Tft_DrawChar 0x08000b0d Thumb Code 292 tftdisplay.o(.text.Tft_DrawChar)
Tft_DrawPixel 0x08000c35 Thumb Code 88 tftdisplay.o(.text.Tft_DrawPixel)
Tft_DrawString 0x08000c95 Thumb Code 84 tftdisplay.o(.text.Tft_DrawString)
Tft_Init 0x08000ce9 Thumb Code 136 tftdisplay.o(.text.Tft_Init)
Tft_SetFont 0x08000d99 Thumb Code 48 tftdisplay.o(.text.Tft_SetFont)
Tick_InitSysTick 0x08000f29 Thumb Code 52 systick.o(.text.Tick_InitSysTick)
__aeabi_assert 0x08000f6d Thumb Code 46 main_1.o(.text.__aeabi_assert)
main 0x08000f9d Thumb Code 92 main_1.o(.text.main)
__0snprintf$1 0x08000ffd Thumb Code 50 printf1.o(i.__0snprintf$1)
__1snprintf$1 0x08000ffd Thumb Code 0 printf1.o(i.__0snprintf$1)
__2snprintf 0x08000ffd Thumb Code 0 printf1.o(i.__0snprintf$1)
__ARM_clz 0x08001035 Thumb Code 46 depilogue.o(i.__ARM_clz)
__scatterload_copy 0x08001063 Thumb Code 14 handlers.o(i.__scatterload_copy)
__scatterload_null 0x08001071 Thumb Code 2 handlers.o(i.__scatterload_null)
__scatterload_zeroinit 0x08001073 Thumb Code 14 handlers.o(i.__scatterload_zeroinit)
TftFont_16x24 0x080026e8 Data 16 tftfont_16x24.o(.rodata.TftFont_16x24)
Region$$Table$$Base 0x08002710 Number 0 anon$$obj.o(Region$$Table)
Region$$Table$$Limit 0x08002730 Number 0 anon$$obj.o(Region$$Table)
ADC_GetConversionValue 0x08000515 Thumb Code 6 stm32f0xx_adc.o(.text.ADC_GetConversionValue)
ADC_GetFlagStatus 0x0800051b Thumb Code 24 stm32f0xx_adc.o(.text.ADC_GetFlagStatus)
ADC_Init 0x08000535 Thumb Code 36 stm32f0xx_adc.o(.text.ADC_Init)
ADC_StartOfConversion 0x0800055d Thumb Code 10 stm32f0xx_adc.o(.text.ADC_StartOfConversion)
Adc_GetValue 0x08000569 Thumb Code 92 adc.o(.text.Adc_GetValue)
Adc_Init 0x080005d1 Thumb Code 68 adc.o(.text.Adc_Init)
Debug_Init 0x08000619 Thumb Code 40 debug.o(.text.Debug_Init)
Debug_Set 0x08000649 Thumb Code 16 debug.o(.text.Debug_Set)
Debug_Unset 0x08000659 Thumb Code 16 debug.o(.text.Debug_Unset)
GPIO_Init 0x0800066d Thumb Code 116 stm32f0xx_gpio.o(.text.GPIO_Init)
GPIO_ReadInputDataBit 0x080006e1 Thumb Code 10 stm32f0xx_gpio.o(.text.GPIO_ReadInputDataBit)
GPIO_StructInit 0x080006ed Thumb Code 12 stm32f0xx_gpio.o(.text.GPIO_StructInit)
GPIO_WriteBit 0x080006fd Thumb Code 12 stm32f0xx_gpio.o(.text.GPIO_WriteBit)
Key_GetState 0x08000709 Thumb Code 44 key.o(.text.Key_GetState)
Key_Init 0x08000735 Thumb Code 64 key.o(.text.Key_Init)
Led_Init 0x08000779 Thumb Code 56 led.o(.text.Led_Init)
Led_TurnOff 0x080007b5 Thumb Code 32 led.o(.text.Led_TurnOff)
Led_TurnOn 0x080007d5 Thumb Code 28 led.o(.text.Led_TurnOn)
RCC_AHBPeriphClockCmd 0x080007f9 Thumb Code 24 stm32f0xx_rcc.o(.text.RCC_AHBPeriphClockCmd)
RCC_APB2PeriphClockCmd 0x08000815 Thumb Code 24 stm32f0xx_rcc.o(.text.RCC_APB2PeriphClockCmd)
SysTick_Handler 0x080008d1 Thumb Code 28 systick.o(.text.SysTick_Handler)
SystemInit 0x080008f1 Thumb Code 212 system_stm32f0xx.o(.text.SystemInit)
TaskCounter 0x080009d5 Thumb Code 56 taskcounter.o(.text.TaskCounter)
TaskKey 0x08000a25 Thumb Code 296 taskkey.o(.text.TaskKey)
TaskLed 0x08000b99 Thumb Code 104 taskled.o(.text.TaskLed)
TaskMandelbrot 0x08000c19 Thumb Code 460 taskmandelbrot.o(.text.TaskMandelbrot)
TaskPoti 0x08000e0d Thumb Code 84 taskpoti.o(.text.TaskPoti)
TaskWatch 0x08000e79 Thumb Code 112 taskwatch.o(.text.TaskWatch)
Tft_ClearArea 0x08000f0d Thumb Code 112 tftdisplay.o(.text.Tft_ClearArea)
Tft_ClearScreen 0x08000f7d Thumb Code 128 tftdisplay.o(.text.Tft_ClearScreen)
Tft_DrawChar 0x08001015 Thumb Code 292 tftdisplay.o(.text.Tft_DrawChar)
Tft_DrawPixel 0x0800113d Thumb Code 88 tftdisplay.o(.text.Tft_DrawPixel)
Tft_DrawString 0x08001199 Thumb Code 84 tftdisplay.o(.text.Tft_DrawString)
Tft_Init 0x080011ed Thumb Code 136 tftdisplay.o(.text.Tft_Init)
Tft_SetFont 0x0800129d Thumb Code 48 tftdisplay.o(.text.Tft_SetFont)
Tft_SetForegroundColourRgb16 0x080012d1 Thumb Code 8 tftdisplay.o(.text.Tft_SetForegroundColourRgb16)
Tick_GetMs 0x08001439 Thumb Code 8 systick.o(.text.Tick_GetMs)
Tick_InitSysTick 0x08001445 Thumb Code 52 systick.o(.text.Tick_InitSysTick)
__aeabi_assert 0x08001489 Thumb Code 46 main_1.o(.text.__aeabi_assert)
main 0x080014b9 Thumb Code 28 main_1.o(.text.main)
__0snprintf$6 0x080014d9 Thumb Code 50 printf6.o(i.__0snprintf$6)
__1snprintf$6 0x080014d9 Thumb Code 0 printf6.o(i.__0snprintf$6)
__2snprintf 0x080014d9 Thumb Code 0 printf6.o(i.__0snprintf$6)
__ARM_clz 0x08001511 Thumb Code 46 depilogue.o(i.__ARM_clz)
__scatterload_copy 0x0800153f Thumb Code 14 handlers.o(i.__scatterload_copy)
__scatterload_null 0x0800154d Thumb Code 2 handlers.o(i.__scatterload_null)
__scatterload_zeroinit 0x0800154f Thumb Code 14 handlers.o(i.__scatterload_zeroinit)
TftFont_16x24 0x08002dd0 Data 16 tftfont_16x24.o(.rodata.TftFont_16x24)
Region$$Table$$Base 0x08002e00 Number 0 anon$$obj.o(Region$$Table)
Region$$Table$$Limit 0x08002e20 Number 0 anon$$obj.o(Region$$Table)
SystemCoreClock 0x20000000 Data 4 system_stm32f0xx.o(.data.SystemCoreClock)
__initial_sp 0x20000428 Data 0 startup_stm32f072.o(STACK)
__initial_sp 0x20000898 Data 0 startup_stm32f072.o(STACK)
@ -1135,97 +1295,153 @@ Memory Map of the image
Image Entry point : 0x080000c1
Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00002738, Max: 0x00020000, ABSOLUTE)
Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00002e28, Max: 0x00020000, ABSOLUTE)
Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x00002730, Max: 0x00020000, ABSOLUTE)
Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x00002e20, Max: 0x00020000, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x08000000 0x08000000 0x000000c0 Data RO 311 RESET startup_stm32f072.o
0x080000c0 0x080000c0 0x00000000 Code RO 397 * .ARM.Collect$$$$00000000 mc_p.l(entry.o)
0x080000c0 0x080000c0 0x00000004 Code RO 675 .ARM.Collect$$$$00000001 mc_p.l(entry2.o)
0x080000c4 0x080000c4 0x00000004 Code RO 678 .ARM.Collect$$$$00000004 mc_p.l(entry5.o)
0x080000c8 0x080000c8 0x00000000 Code RO 680 .ARM.Collect$$$$00000008 mc_p.l(entry7b.o)
0x080000c8 0x080000c8 0x00000000 Code RO 682 .ARM.Collect$$$$0000000A mc_p.l(entry8b.o)
0x080000c8 0x080000c8 0x00000008 Code RO 683 .ARM.Collect$$$$0000000B mc_p.l(entry9a.o)
0x080000d0 0x080000d0 0x00000000 Code RO 685 .ARM.Collect$$$$0000000D mc_p.l(entry10a.o)
0x080000d0 0x080000d0 0x00000000 Code RO 687 .ARM.Collect$$$$0000000F mc_p.l(entry11a.o)
0x080000d0 0x080000d0 0x00000004 Code RO 676 .ARM.Collect$$$$00002712 mc_p.l(entry2.o)
0x080000d4 0x080000d4 0x0000001c Code RO 312 .text startup_stm32f072.o
0x080000f0 0x080000f0 0x00000164 Code RO 667 .text mf_p.l(dadd.o)
0x08000254 0x08000254 0x000000d0 Code RO 669 .text mf_p.l(dmul.o)
0x08000324 0x08000324 0x0000002c Code RO 671 .text mf_p.l(dcmpgt.o)
0x08000350 0x08000350 0x0000001c Code RO 673 .text mf_p.l(dfltui.o)
0x0800036c 0x0800036c 0x0000003e Code RO 698 .text mc_p.l(uidiv_div0.o)
0x080003aa 0x080003aa 0x00000020 Code RO 706 .text mc_p.l(llshl.o)
0x080003ca 0x080003ca 0x00000026 Code RO 708 .text mc_p.l(llsshr.o)
0x080003f0 0x080003f0 0x00000000 Code RO 710 .text mc_p.l(iusefp.o)
0x080003f0 0x080003f0 0x000000be Code RO 711 .text mf_p.l(depilogue.o)
0x08000000 0x08000000 0x000000c0 Data RO 319 RESET startup_stm32f072.o
0x080000c0 0x080000c0 0x00000000 Code RO 439 * .ARM.Collect$$$$00000000 mc_p.l(entry.o)
0x080000c0 0x080000c0 0x00000004 Code RO 717 .ARM.Collect$$$$00000001 mc_p.l(entry2.o)
0x080000c4 0x080000c4 0x00000004 Code RO 720 .ARM.Collect$$$$00000004 mc_p.l(entry5.o)
0x080000c8 0x080000c8 0x00000000 Code RO 722 .ARM.Collect$$$$00000008 mc_p.l(entry7b.o)
0x080000c8 0x080000c8 0x00000000 Code RO 724 .ARM.Collect$$$$0000000A mc_p.l(entry8b.o)
0x080000c8 0x080000c8 0x00000008 Code RO 725 .ARM.Collect$$$$0000000B mc_p.l(entry9a.o)
0x080000d0 0x080000d0 0x00000000 Code RO 727 .ARM.Collect$$$$0000000D mc_p.l(entry10a.o)
0x080000d0 0x080000d0 0x00000000 Code RO 729 .ARM.Collect$$$$0000000F mc_p.l(entry11a.o)
0x080000d0 0x080000d0 0x00000004 Code RO 718 .ARM.Collect$$$$00002712 mc_p.l(entry2.o)
0x080000d4 0x080000d4 0x0000001c Code RO 320 .text startup_stm32f072.o
0x080000f0 0x080000f0 0x00000164 Code RO 709 .text mf_p.l(dadd.o)
0x08000254 0x08000254 0x000000d0 Code RO 711 .text mf_p.l(dmul.o)
0x08000324 0x08000324 0x0000002c Code RO 713 .text mf_p.l(dcmpgt.o)
0x08000350 0x08000350 0x0000001c Code RO 715 .text mf_p.l(dfltui.o)
0x0800036c 0x0800036c 0x0000003e Code RO 740 .text mc_p.l(uidiv_div0.o)
0x080003aa 0x080003aa 0x00000020 Code RO 748 .text mc_p.l(llshl.o)
0x080003ca 0x080003ca 0x00000026 Code RO 750 .text mc_p.l(llsshr.o)
0x080003f0 0x080003f0 0x00000000 Code RO 752 .text mc_p.l(iusefp.o)
0x080003f0 0x080003f0 0x000000be Code RO 753 .text mf_p.l(depilogue.o)
0x080004ae 0x080004ae 0x00000002 PAD
0x080004b0 0x080004b0 0x00000030 Code RO 721 .text mc_p.l(init.o)
0x080004e0 0x080004e0 0x00000022 Code RO 724 .text mc_p.l(llushr.o)
0x08000502 0x08000502 0x00000012 Code RO 122 .text.ADC_Cmd stm32f0xx_adc.o
0x08000514 0x08000514 0x00000028 Code RO 118 .text.ADC_Init stm32f0xx_adc.o
0x0800053c 0x0800053c 0x00000048 Code RO 63 .text.Adc_Init adc.o
0x08000584 0x08000584 0x00000030 Code RO 102 .text.Debug_Init debug.o
0x080005b4 0x080005b4 0x00000010 Code RO 104 .text.Debug_Set debug.o
0x080005c4 0x080005c4 0x00000014 Code RO 106 .text.Debug_Unset debug.o
0x080005d8 0x080005d8 0x00000074 Code RO 186 .text.GPIO_Init stm32f0xx_gpio.o
0x0800064c 0x0800064c 0x00000010 Code RO 188 .text.GPIO_StructInit stm32f0xx_gpio.o
0x0800065c 0x0800065c 0x0000000c Code RO 204 .text.GPIO_WriteBit stm32f0xx_gpio.o
0x08000668 0x08000668 0x00000044 Code RO 2 .text.Key_Init key.o
0x080006ac 0x080006ac 0x0000003c Code RO 14 .text.Led_Init led.o
0x080006e8 0x080006e8 0x0000001c Code RO 281 .text.RCC_AHBPeriphClockCmd stm32f0xx_rcc.o
0x08000704 0x08000704 0x0000001c Code RO 283 .text.RCC_APB2PeriphClockCmd stm32f0xx_rcc.o
0x08000720 0x08000720 0x00000020 Code RO 77 .text.SysTick_Handler systick.o
0x08000740 0x08000740 0x000000e4 Code RO 319 .text.SystemInit system_stm32f0xx.o
0x08000824 0x08000824 0x00000050 Code RO 347 .text.TaskCounter taskcounter.o
0x08000874 0x08000874 0x00000024 Code RO 357 .text.TaskKey taskkey.o
0x08000898 0x08000898 0x00000028 Code RO 365 .text.TaskLed taskled.o
0x080008c0 0x080008c0 0x00000164 Code RO 373 .text.TaskMandelbrot taskmandelbrot.o
0x08000a24 0x08000a24 0x00000028 Code RO 382 .text.TaskPoti taskpoti.o
0x08000a4c 0x08000a4c 0x00000028 Code RO 390 .text.TaskWatch taskwatch.o
0x08000a74 0x08000a74 0x00000098 Code RO 35 .text.Tft_ClearScreen tftdisplay.o
0x08000b0c 0x08000b0c 0x00000128 Code RO 47 .text.Tft_DrawChar tftdisplay.o
0x08000c34 0x08000c34 0x00000060 Code RO 41 .text.Tft_DrawPixel tftdisplay.o
0x08000c94 0x08000c94 0x00000054 Code RO 49 .text.Tft_DrawString tftdisplay.o
0x08000ce8 0x08000ce8 0x000000b0 Code RO 29 .text.Tft_Init tftdisplay.o
0x08000d98 0x08000d98 0x00000034 Code RO 39 .text.Tft_SetFont tftdisplay.o
0x08000dcc 0x08000dcc 0x0000015c Code RO 37 .text.Tft_SetWindow tftdisplay.o
0x08000f28 0x08000f28 0x00000044 Code RO 79 .text.Tick_InitSysTick systick.o
0x08000f6c 0x08000f6c 0x0000002e Code RO 92 .text.__aeabi_assert main_1.o
0x08000f9a 0x08000f9a 0x00000002 PAD
0x08000f9c 0x08000f9c 0x00000060 Code RO 90 .text.main main_1.o
0x08000ffc 0x08000ffc 0x00000038 Code RO 452 i.__0snprintf$1 mc_p.l(printf1.o)
0x08001034 0x08001034 0x0000002e Code RO 713 i.__ARM_clz mf_p.l(depilogue.o)
0x08001062 0x08001062 0x0000000e Code RO 729 i.__scatterload_copy mc_p.l(handlers.o)
0x08001070 0x08001070 0x00000002 Code RO 730 i.__scatterload_null mc_p.l(handlers.o)
0x08001072 0x08001072 0x0000000e Code RO 731 i.__scatterload_zeroinit mc_p.l(handlers.o)
0x08001080 0x08001080 0x00000150 Code RO 458 i._printf_core mc_p.l(printf1.o)
0x080011d0 0x080011d0 0x00000016 Code RO 459 i._snputc mc_p.l(printf1.o)
0x080011e6 0x080011e6 0x00001500 Data RO 340 .rodata.Bitmaps_16x24 tftfont_16x24.o
0x080026e6 0x080026e6 0x00000002 PAD
0x080026e8 0x080026e8 0x00000010 Data RO 341 .rodata.TftFont_16x24 tftfont_16x24.o
0x080026f8 0x080026f8 0x00000015 Data RO 54 .rodata.str1.1 tftdisplay.o
0x0800270d 0x0800270d 0x00000003 PAD
0x08002710 0x08002710 0x00000020 Data RO 728 Region$$Table anon$$obj.o
0x080004b0 0x080004b0 0x00000030 Code RO 763 .text mc_p.l(init.o)
0x080004e0 0x080004e0 0x00000022 Code RO 766 .text mc_p.l(llushr.o)
0x08000502 0x08000502 0x00000012 Code RO 130 .text.ADC_Cmd stm32f0xx_adc.o
0x08000514 0x08000514 0x00000006 Code RO 168 .text.ADC_GetConversionValue stm32f0xx_adc.o
0x0800051a 0x0800051a 0x00000018 Code RO 176 .text.ADC_GetFlagStatus stm32f0xx_adc.o
0x08000532 0x08000532 0x00000002 PAD
0x08000534 0x08000534 0x00000028 Code RO 126 .text.ADC_Init stm32f0xx_adc.o
0x0800055c 0x0800055c 0x0000000a Code RO 166 .text.ADC_StartOfConversion stm32f0xx_adc.o
0x08000566 0x08000566 0x00000002 PAD
0x08000568 0x08000568 0x00000068 Code RO 69 .text.Adc_GetValue adc.o
0x080005d0 0x080005d0 0x00000048 Code RO 65 .text.Adc_Init adc.o
0x08000618 0x08000618 0x00000030 Code RO 110 .text.Debug_Init debug.o
0x08000648 0x08000648 0x00000010 Code RO 112 .text.Debug_Set debug.o
0x08000658 0x08000658 0x00000014 Code RO 114 .text.Debug_Unset debug.o
0x0800066c 0x0800066c 0x00000074 Code RO 194 .text.GPIO_Init stm32f0xx_gpio.o
0x080006e0 0x080006e0 0x0000000a Code RO 200 .text.GPIO_ReadInputDataBit stm32f0xx_gpio.o
0x080006ea 0x080006ea 0x00000002 PAD
0x080006ec 0x080006ec 0x00000010 Code RO 196 .text.GPIO_StructInit stm32f0xx_gpio.o
0x080006fc 0x080006fc 0x0000000c Code RO 212 .text.GPIO_WriteBit stm32f0xx_gpio.o
0x08000708 0x08000708 0x0000002c Code RO 4 .text.Key_GetState key.o
0x08000734 0x08000734 0x00000044 Code RO 2 .text.Key_Init key.o
0x08000778 0x08000778 0x0000003c Code RO 14 .text.Led_Init led.o
0x080007b4 0x080007b4 0x00000020 Code RO 18 .text.Led_TurnOff led.o
0x080007d4 0x080007d4 0x00000024 Code RO 16 .text.Led_TurnOn led.o
0x080007f8 0x080007f8 0x0000001c Code RO 289 .text.RCC_AHBPeriphClockCmd stm32f0xx_rcc.o
0x08000814 0x08000814 0x0000001c Code RO 291 .text.RCC_APB2PeriphClockCmd stm32f0xx_rcc.o
0x08000830 0x08000830 0x000000a0 Code RO 96 .text.Superloop main_1.o
0x080008d0 0x080008d0 0x00000020 Code RO 79 .text.SysTick_Handler systick.o
0x080008f0 0x080008f0 0x000000e4 Code RO 327 .text.SystemInit system_stm32f0xx.o
0x080009d4 0x080009d4 0x00000050 Code RO 355 .text.TaskCounter taskcounter.o
0x08000a24 0x08000a24 0x00000174 Code RO 366 .text.TaskKey taskkey.o
0x08000b98 0x08000b98 0x00000080 Code RO 390 .text.TaskLed taskled.o
0x08000c18 0x08000c18 0x000001f4 Code RO 402 .text.TaskMandelbrot taskmandelbrot.o
0x08000e0c 0x08000e0c 0x0000006c Code RO 416 .text.TaskPoti taskpoti.o
0x08000e78 0x08000e78 0x00000094 Code RO 428 .text.TaskWatch taskwatch.o
0x08000f0c 0x08000f0c 0x00000070 Code RO 47 .text.Tft_ClearArea tftdisplay.o
0x08000f7c 0x08000f7c 0x00000098 Code RO 35 .text.Tft_ClearScreen tftdisplay.o
0x08001014 0x08001014 0x00000128 Code RO 49 .text.Tft_DrawChar tftdisplay.o
0x0800113c 0x0800113c 0x0000005c Code RO 41 .text.Tft_DrawPixel tftdisplay.o
0x08001198 0x08001198 0x00000054 Code RO 51 .text.Tft_DrawString tftdisplay.o
0x080011ec 0x080011ec 0x000000b0 Code RO 29 .text.Tft_Init tftdisplay.o
0x0800129c 0x0800129c 0x00000034 Code RO 39 .text.Tft_SetFont tftdisplay.o
0x080012d0 0x080012d0 0x0000000c Code RO 31 .text.Tft_SetForegroundColourRgb16 tftdisplay.o
0x080012dc 0x080012dc 0x0000015c Code RO 37 .text.Tft_SetWindow tftdisplay.o
0x08001438 0x08001438 0x0000000c Code RO 83 .text.Tick_GetMs systick.o
0x08001444 0x08001444 0x00000044 Code RO 81 .text.Tick_InitSysTick systick.o
0x08001488 0x08001488 0x0000002e Code RO 98 .text.__aeabi_assert main_1.o
0x080014b6 0x080014b6 0x00000002 PAD
0x080014b8 0x080014b8 0x00000020 Code RO 94 .text.main main_1.o
0x080014d8 0x080014d8 0x00000038 Code RO 604 i.__0snprintf$6 mc_p.l(printf6.o)
0x08001510 0x08001510 0x0000002e Code RO 755 i.__ARM_clz mf_p.l(depilogue.o)
0x0800153e 0x0800153e 0x0000000e Code RO 771 i.__scatterload_copy mc_p.l(handlers.o)
0x0800154c 0x0800154c 0x00000002 Code RO 772 i.__scatterload_null mc_p.l(handlers.o)
0x0800154e 0x0800154e 0x0000000e Code RO 773 i.__scatterload_zeroinit mc_p.l(handlers.o)
0x0800155c 0x0800155c 0x00000304 Code RO 610 i._printf_core mc_p.l(printf6.o)
0x08001860 0x08001860 0x00000020 Code RO 611 i._printf_post_padding mc_p.l(printf6.o)
0x08001880 0x08001880 0x0000002c Code RO 612 i._printf_pre_padding mc_p.l(printf6.o)
0x080018ac 0x080018ac 0x00000016 Code RO 613 i._snputc mc_p.l(printf6.o)
0x080018c2 0x080018c2 0x0000000c Data RO 20 .rodata..Lswitch.table.Led_TurnOff led.o
0x080018ce 0x080018ce 0x00001500 Data RO 348 .rodata.Bitmaps_16x24 tftfont_16x24.o
0x08002dce 0x08002dce 0x00000002 PAD
0x08002dd0 0x08002dd0 0x00000010 Data RO 349 .rodata.TftFont_16x24 tftfont_16x24.o
0x08002de0 0x08002de0 0x00000003 Data RO 395 .rodata.ledSeq taskled.o
0x08002de3 0x08002de3 0x00000015 Data RO 56 .rodata.str1.1 tftdisplay.o
0x08002df8 0x08002df8 0x00000007 Data RO 405 .rodata.str1.1 taskmandelbrot.o
0x08002dff 0x08002dff 0x00000001 PAD
0x08002e00 0x08002e00 0x00000020 Data RO 770 Region$$Table anon$$obj.o
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08002730, Size: 0x00000428, Max: 0x00004000, ABSOLUTE)
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08002e20, Size: 0x00000898, Max: 0x00004000, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x20000000 0x08002730 0x00000004 Data RW 323 .data.SystemCoreClock system_stm32f0xx.o
0x20000004 0x08002734 0x00000002 Data RW 51 .data.Tft_Cfg.0 tftdisplay.o
0x20000006 0x08002736 0x00000002 PAD
0x20000008 - 0x00000004 Zero RW 349 .bss.TaskCounter.counter taskcounter.o
0x2000000c - 0x00000002 Zero RW 52 .bss.Tft_Cfg.1 tftdisplay.o
0x2000000e 0x08002736 0x00000002 PAD
0x20000010 - 0x00000004 Zero RW 53 .bss.Tft_Cfg.2 tftdisplay.o
0x20000014 - 0x00000004 Zero RW 81 .bss.msTicks systick.o
0x20000018 - 0x0000000e Zero RW 350 .bss.tmpBuf taskcounter.o
0x20000026 0x08002736 0x00000002 PAD
0x20000028 - 0x00000400 Zero RW 309 STACK startup_stm32f072.o
0x20000000 0x08002e20 0x00000004 Data RW 331 .data.SystemCoreClock system_stm32f0xx.o
0x20000004 0x08002e24 0x00000002 Data RW 53 .data.Tft_Cfg.0 tftdisplay.o
0x20000006 0x08002e26 0x00000002 PAD
0x20000008 - 0x00000004 Zero RW 379 .bss.Key_GetDebounced.lastChange.0 taskkey.o
0x2000000c - 0x00000004 Zero RW 380 .bss.Key_GetDebounced.lastChange.1 taskkey.o
0x20000010 - 0x00000004 Zero RW 381 .bss.Key_GetDebounced.lastChange.2 taskkey.o
0x20000014 - 0x00000001 Zero RW 373 .bss.Key_GetDebounced.lastRaw.0 taskkey.o
0x20000015 - 0x00000001 Zero RW 374 .bss.Key_GetDebounced.lastRaw.1 taskkey.o
0x20000016 - 0x00000001 Zero RW 375 .bss.Key_GetDebounced.lastRaw.2 taskkey.o
0x20000017 - 0x00000001 Zero RW 376 .bss.Key_GetDebounced.stable.0 taskkey.o
0x20000018 - 0x00000001 Zero RW 377 .bss.Key_GetDebounced.stable.1 taskkey.o
0x20000019 - 0x00000001 Zero RW 378 .bss.Key_GetDebounced.stable.2 taskkey.o
0x2000001a 0x08002e26 0x00000002 PAD
0x2000001c - 0x00000004 Zero RW 357 .bss.TaskCounter.counter taskcounter.o
0x20000020 - 0x00000001 Zero RW 358 .bss.TaskCounter.initDone taskcounter.o
0x20000021 - 0x00000001 Zero RW 370 .bss.TaskKey.initDone taskkey.o
0x20000022 - 0x00000001 Zero RW 371 .bss.TaskKey.lastState taskkey.o
0x20000023 - 0x0000000e Zero RW 368 .bss.TaskKey.tmpBuf taskkey.o
0x20000031 - 0x00000001 Zero RW 369 .bss.TaskKey.userPrev taskkey.o
0x20000032 - 0x00000001 Zero RW 393 .bss.TaskLed.idx taskled.o
0x20000033 - 0x00000001 Zero RW 392 .bss.TaskLed.initDone taskled.o
0x20000034 - 0x00000004 Zero RW 394 .bss.TaskLed.lastSwitch taskled.o
0x20000038 - 0x00000001 Zero RW 404 .bss.TaskMandelbrot.initDone taskmandelbrot.o
0x20000039 - 0x00000001 Zero RW 418 .bss.TaskPoti.initDone taskpoti.o
0x2000003a 0x08002e26 0x00000002 PAD
0x2000003c - 0x00000004 Zero RW 419 .bss.TaskPoti.lastValue taskpoti.o
0x20000040 - 0x00000001 Zero RW 431 .bss.TaskWatch.initDone taskwatch.o
0x20000041 0x08002e26 0x00000003 PAD
0x20000044 - 0x00000004 Zero RW 432 .bss.TaskWatch.lastSeconds taskwatch.o
0x20000048 - 0x0000000e Zero RW 430 .bss.TaskWatch.tmpBuf taskwatch.o
0x20000056 0x08002e26 0x00000002 PAD
0x20000058 - 0x00000002 Zero RW 54 .bss.Tft_Cfg.1 tftdisplay.o
0x2000005a 0x08002e26 0x00000002 PAD
0x2000005c - 0x00000004 Zero RW 55 .bss.Tft_Cfg.2 tftdisplay.o
0x20000060 - 0x00000001 Zero RW 406 .bss.clearing taskmandelbrot.o
0x20000061 0x08002e26 0x00000003 PAD
0x20000064 - 0x00000004 Zero RW 407 .bss.curX taskmandelbrot.o
0x20000068 - 0x00000004 Zero RW 408 .bss.curY taskmandelbrot.o
0x2000006c - 0x00000002 Zero RW 372 .bss.current_color taskkey.o
0x2000006e 0x08002e26 0x00000002 PAD
0x20000070 - 0x00000004 Zero RW 85 .bss.msTicks systick.o
0x20000074 0x08002e26 0x00000004 PAD
0x20000078 - 0x00000400 Zero RW 100 .bss.processStack main_1.o
0x20000478 - 0x0000000e Zero RW 359 .bss.tmpBuf taskcounter.o
0x20000486 - 0x0000000e Zero RW 420 .bss.tmpBuf taskpoti.o
0x20000494 0x08002e26 0x00000004 PAD
0x20000498 - 0x00000400 Zero RW 317 STACK startup_stm32f072.o
==============================================================================
@ -1235,30 +1451,30 @@ Image component sizes
Code (inc. data) RO Data RW Data ZI Data Debug Object Name
72 4 0 0 0 2542 adc.o
176 16 0 0 0 2542 adc.o
84 12 0 0 0 2230 debug.o
68 4 0 0 0 2548 key.o
60 4 0 0 0 2866 led.o
142 4 0 0 0 1155 main_1.o
112 4 0 0 0 2548 key.o
128 12 12 0 0 2866 led.o
238 8 0 0 1024 1719 main_1.o
28 8 192 0 1024 624 startup_stm32f072.o
58 4 0 0 0 7487 stm32f0xx_adc.o
144 4 0 0 0 4581 stm32f0xx_gpio.o
98 4 0 0 0 7487 stm32f0xx_adc.o
154 4 0 0 0 4581 stm32f0xx_gpio.o
56 8 0 0 0 10733 stm32f0xx_rcc.o
228 16 0 4 0 2208 system_stm32f0xx.o
100 20 0 0 4 2727 systick.o
80 20 0 0 18 876 taskcounter.o
36 8 0 0 0 666 taskkey.o
40 8 0 0 0 668 taskled.o
356 32 0 0 0 1869 taskmandelbrot.o
40 8 0 0 0 671 taskpoti.o
40 8 0 0 0 674 taskwatch.o
1204 180 21 2 6 11256 tftdisplay.o
112 24 0 0 4 2836 systick.o
80 24 0 0 19 811 taskcounter.o
372 76 0 0 37 2218 taskkey.o
128 24 3 0 6 1127 taskled.o
500 40 7 0 10 2107 taskmandelbrot.o
108 24 0 0 19 880 taskpoti.o
148 36 0 0 19 914 taskwatch.o
1324 180 21 2 6 12103 tftdisplay.o
0 0 5392 0 0 765 tftfont_16x24.o
----------------------------------------------------------------------
2838 352 5642 8 1056 57146 Object Totals
4082 520 5662 8 2192 61299 Object Totals
0 0 32 0 0 0 (incl. Generated)
2 0 5 2 4 0 (incl. Padding)
8 0 3 2 24 0 (incl. Padding)
----------------------------------------------------------------------
@ -1278,7 +1494,7 @@ Image component sizes
32 0 0 0 0 68 llshl.o
38 0 0 0 0 68 llsshr.o
34 0 0 0 0 68 llushr.o
414 10 0 0 0 236 printf1.o
926 10 0 0 0 392 printf6.o
62 0 0 0 0 72 uidiv_div0.o
356 4 0 0 0 140 dadd.o
44 0 0 0 0 68 dcmpgt.o
@ -1287,18 +1503,18 @@ Image component sizes
208 6 0 0 0 88 dmul.o
----------------------------------------------------------------------
1552 42 0 0 0 1160 Library Totals
2064 42 0 0 0 1316 Library Totals
2 0 0 0 0 0 (incl. Padding)
----------------------------------------------------------------------
Code (inc. data) RO Data RW Data ZI Data Debug Library Name
678 28 0 0 0 580 mc_p.l
1190 28 0 0 0 736 mc_p.l
872 14 0 0 0 580 mf_p.l
----------------------------------------------------------------------
1552 42 0 0 0 1160 Library Totals
2064 42 0 0 0 1316 Library Totals
----------------------------------------------------------------------
@ -1307,15 +1523,15 @@ Image component sizes
Code (inc. data) RO Data RW Data ZI Data Debug
4390 394 5642 8 1056 57610 Grand Totals
4390 394 5642 8 1056 57610 ELF Image Totals
4390 394 5642 8 0 0 ROM Totals
6146 562 5662 8 2192 61831 Grand Totals
6146 562 5662 8 2192 61831 ELF Image Totals
6146 562 5662 8 0 0 ROM Totals
==============================================================================
Total RO Size (Code + RO Data) 10032 ( 9.80kB)
Total RW Size (RW Data + ZI Data) 1064 ( 1.04kB)
Total ROM Size (Code + RO Data + RW Data) 10040 ( 9.80kB)
Total RO Size (Code + RO Data) 11808 ( 11.53kB)
Total RW Size (RW Data + ZI Data) 2200 ( 2.15kB)
Total ROM Size (Code + RO Data + RW Data) 11816 ( 11.54kB)
==============================================================================

Binary file not shown.

View file

@ -8,7 +8,7 @@ Copyright (C) 2025 ARM Ltd and ARM Germany GmbH. All rights reserved.
License Information: Christian Gamsjaeger
FHOOE
User-based license: Keil MDK Community (non-commercial free of charge)
Valid until: Jun 1 2033. Cached until: Oct 15 2026
Valid until: Jun 1 2033. Cached until: Oct 20 2026
Tool Versions:
Toolchain: Keil MDK Community (non-commercial free of charge Version: 5.42.0.0
@ -29,31 +29,21 @@ Project File Date: 10/08/2026
<h2>Output:</h2>
*** Using Compiler 'V6.23', folder: 'C:\Users\gaems\AppData\Local\Keil_v5\ARM\ARMCLANG\Bin'
Rebuild target 'Apus'
Build target 'Apus'
Note: source file '.\src\main.c' - object file renamed from '.\output\main.o' to '.\output\main_1.o'.
compiling Key.c...
compiling Led.c...
compiling TftDisplay.c...
compiling Adc.c...
compiling systick.c...
compiling main.c...
compiling Debug.c...
compiling stm32f0xx_adc.c...
compiling stm32f0xx_gpio.c...
compiling stm32f0xx_rcc.c...
assembling startup_stm32f072.s...
compiling system_stm32f0xx.c...
compiling TftFont_6x8.c...
compiling TftFont_16x24.c...
compiling TaskCounter.c...
compiling TaskKey.c...
compiling TaskLed.c...
compiling TaskMandelbrot.c...
compiling TaskPoti.c...
compiling TaskWatch.c...
src/main.c(16): warning: In file included from...
./stm32f0-stdperiph\stm32f0xx_gpio.h(38): warning: In file included from...
./src/Devices\stm32f0xx.h(357): warning: In file included from...
./src/Devices\core_cm0.h(149): warning: In file included from...
./src/Devices\core_cmFunc.h(429): warning: inline asm clobber list contains reserved registers: SP [-Winline-asm]
429 | __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp");
| ^
./src/Devices\core_cmFunc.h(429): note: Reserved registers on the clobber list may not be preserved across the asm statement, and clobbering them may lead to undefined behaviour.
1 warning generated.
linking...
Program Size: Code=4390 RO-data=5642 RW-data=8 ZI-data=1056
".\output\Apus.axf" - 0 Error(s), 0 Warning(s).
Program Size: Code=6146 RO-data=5662 RW-data=8 ZI-data=2192
".\output\Apus.axf" - 0 Error(s), 1 Warning(s).
<h2>Software Packages used:</h2>
@ -66,7 +56,7 @@ Package Vendor: Keil
C:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include
<h2>Collection of Component Files used:</h2>
Build Time Elapsed: 00:00:04
Build Time Elapsed: 00:00:01
</pre>
</body>
</html>

View file

@ -3,11 +3,11 @@
<title>Static Call Graph - [.\output\Apus.axf]</title></head>
<body><HR>
<H1>Static Call Graph for image .\output\Apus.axf</H1><HR>
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 6230001: Last Updated: Thu Oct 8 12:54:30 2026
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 6230001: Last Updated: Tue Oct 13 19:36:04 2026
<BR><P>
<H3>Maximum Stack Usage = 380 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
<H3>Maximum Stack Usage = 388 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
Call chain for Maximum Stack Depth:</H3>
main &rArr; TaskMandelbrot &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
main &rArr; Superloop &rArr; TaskMandelbrot &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
<P>
<H3>
Mutually Recursive functions
@ -61,7 +61,7 @@ Function Pointers
<LI><a href="#[25]">USB_IRQHandler</a> from startup_stm32f072.o(.text) referenced from startup_stm32f072.o(RESET)
<LI><a href="#[6]">WWDG_IRQHandler</a> from startup_stm32f072.o(.text) referenced from startup_stm32f072.o(RESET)
<LI><a href="#[28]">__main</a> from entry.o(.ARM.Collect$$$$00000000) referenced from startup_stm32f072.o(.text)
<LI><a href="#[29]">_snputc</a> from printf1.o(i._snputc) referenced from printf1.o(i.__0snprintf$1)
<LI><a href="#[29]">_snputc</a> from printf6.o(i._snputc) referenced from printf6.o(i.__0snprintf$6)
<LI><a href="#[26]">main</a> from main_1.o(.text.main) referenced from entry9a.o(.ARM.Collect$$$$0000000B)
</UL>
<P>
@ -71,7 +71,7 @@ Global Symbols
<P><STRONG><a name="[28]"></a>__main</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry.o(.ARM.Collect$$$$00000000))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f072.o(.text)
</UL>
<P><STRONG><a name="[5a]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
<P><STRONG><a name="[68]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
<P><STRONG><a name="[2a]"></a>_main_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
<BR><BR>[Calls]<UL><LI><a href="#[2b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
@ -81,15 +81,15 @@ Global Symbols
<BR><BR>[Called By]<UL><LI><a href="#[2b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
</UL>
<P><STRONG><a name="[5b]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
<P><STRONG><a name="[69]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
<P><STRONG><a name="[5c]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
<P><STRONG><a name="[6a]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
<P><STRONG><a name="[5d]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
<P><STRONG><a name="[6b]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
<P><STRONG><a name="[5e]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
<P><STRONG><a name="[6c]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
<P><STRONG><a name="[5f]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
<P><STRONG><a name="[6d]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
<P><STRONG><a name="[0]"></a>Reset_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, startup_stm32f072.o(.text))
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f072.o(RESET)
@ -231,7 +231,7 @@ Global Symbols
<LI><a href="#[2f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
</UL>
<BR>[Called By]<UL><LI><a href="#[31]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dsub
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<LI><a href="#[32]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_drsub
</UL>
@ -240,7 +240,7 @@ Global Symbols
</UL>
<BR>[Calls]<UL><LI><a href="#[2c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
</UL>
<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
</UL>
<P><STRONG><a name="[32]"></a>__aeabi_drsub</STRONG> (Thumb, 12 bytes, Stack size 8 bytes, dadd.o(.text), UNUSED)
@ -252,13 +252,13 @@ Global Symbols
</UL>
<BR>[Calls]<UL><LI><a href="#[2f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
</UL>
<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
</UL>
<P><STRONG><a name="[4b]"></a>__aeabi_dcmpgt</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, dcmpgt.o(.text))
<P><STRONG><a name="[5e]"></a>__aeabi_dcmpgt</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, dcmpgt.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = __aeabi_dcmpgt
</UL>
<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
</UL>
<P><STRONG><a name="[34]"></a>__aeabi_ui2d</STRONG> (Thumb, 24 bytes, Stack size 16 bytes, dfltui.o(.text))
@ -266,17 +266,22 @@ Global Symbols
</UL>
<BR>[Calls]<UL><LI><a href="#[2f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
</UL>
<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
</UL>
<P><STRONG><a name="[54]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 16 bytes, uidiv_div0.o(.text))
<P><STRONG><a name="[3c]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 16 bytes, uidiv_div0.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = __aeabi_uidiv
</UL>
<BR>[Called By]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tick_InitSysTick
<BR>[Called By]<UL><LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tick_InitSysTick
<LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_GetValue
</UL>
<P><STRONG><a name="[59]"></a>__aeabi_uidivmod</STRONG> (Thumb, 62 bytes, Stack size 16 bytes, uidiv_div0.o(.text), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
<P><STRONG><a name="[60]"></a>__aeabi_uidivmod</STRONG> (Thumb, 62 bytes, Stack size 16 bytes, uidiv_div0.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = __aeabi_uidivmod
</UL>
<BR>[Called By]<UL><LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
</UL>
<P><STRONG><a name="[2d]"></a>__aeabi_llsl</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, llshl.o(.text))
@ -286,7 +291,7 @@ Global Symbols
<LI><a href="#[2f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
</UL>
<P><STRONG><a name="[60]"></a>_ll_shift_l</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, llshl.o(.text), UNUSED)
<P><STRONG><a name="[6e]"></a>_ll_shift_l</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, llshl.o(.text), UNUSED)
<P><STRONG><a name="[2e]"></a>__aeabi_lasr</STRONG> (Thumb, 38 bytes, Stack size 8 bytes, llsshr.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = __aeabi_lasr
@ -294,9 +299,9 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[2c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
</UL>
<P><STRONG><a name="[61]"></a>_ll_sshift_r</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, llsshr.o(.text), UNUSED)
<P><STRONG><a name="[6f]"></a>_ll_sshift_r</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, llsshr.o(.text), UNUSED)
<P><STRONG><a name="[62]"></a>__I$use$fp</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, iusefp.o(.text), UNUSED)
<P><STRONG><a name="[70]"></a>__I$use$fp</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, iusefp.o(.text), UNUSED)
<P><STRONG><a name="[30]"></a>_double_round</STRONG> (Thumb, 26 bytes, Stack size 8 bytes, depilogue.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = _double_round
@ -324,7 +329,7 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[2a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_main_scatterload
</UL>
<P><STRONG><a name="[63]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
<P><STRONG><a name="[71]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
<P><STRONG><a name="[36]"></a>__aeabi_llsr</STRONG> (Thumb, 34 bytes, Stack size 8 bytes, llushr.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = __aeabi_llsr
@ -332,125 +337,166 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[2f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
</UL>
<P><STRONG><a name="[64]"></a>_ll_ushift_r</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, llushr.o(.text), UNUSED)
<P><STRONG><a name="[72]"></a>_ll_ushift_r</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, llushr.o(.text), UNUSED)
<P><STRONG><a name="[3b]"></a>ADC_Cmd</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_adc.o(.text.ADC_Cmd))
<BR><BR>[Called By]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_Init
<P><STRONG><a name="[40]"></a>ADC_Cmd</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f0xx_adc.o(.text.ADC_Cmd))
<BR><BR>[Called By]<UL><LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_Init
</UL>
<P><STRONG><a name="[3a]"></a>ADC_Init</STRONG> (Thumb, 36 bytes, Stack size 16 bytes, stm32f0xx_adc.o(.text.ADC_Init))
<P><STRONG><a name="[3b]"></a>ADC_GetConversionValue</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f0xx_adc.o(.text.ADC_GetConversionValue))
<BR><BR>[Called By]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_GetValue
</UL>
<P><STRONG><a name="[39]"></a>ADC_GetFlagStatus</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_adc.o(.text.ADC_GetFlagStatus))
<BR><BR>[Called By]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_GetValue
</UL>
<P><STRONG><a name="[3f]"></a>ADC_Init</STRONG> (Thumb, 36 bytes, Stack size 16 bytes, stm32f0xx_adc.o(.text.ADC_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = ADC_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_Init
<BR>[Called By]<UL><LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_Init
</UL>
<P><STRONG><a name="[38]"></a>Adc_Init</STRONG> (Thumb, 68 bytes, Stack size 48 bytes, adc.o(.text.Adc_Init))
<P><STRONG><a name="[3a]"></a>ADC_StartOfConversion</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f0xx_adc.o(.text.ADC_StartOfConversion))
<BR><BR>[Called By]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_GetValue
</UL>
<P><STRONG><a name="[38]"></a>Adc_GetValue</STRONG> (Thumb, 92 bytes, Stack size 24 bytes, adc.o(.text.Adc_GetValue))
<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = Adc_GetValue &rArr; __aeabi_uidiv
</UL>
<BR>[Calls]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC_GetConversionValue
<LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC_StartOfConversion
<LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC_GetFlagStatus
<LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidiv
</UL>
<BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskPoti
</UL>
<P><STRONG><a name="[3d]"></a>Adc_Init</STRONG> (Thumb, 68 bytes, Stack size 48 bytes, adc.o(.text.Adc_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = Adc_Init &rArr; ADC_Init
</UL>
<BR>[Calls]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC_Cmd
<LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC_Init
<LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_APB2PeriphClockCmd
<BR>[Calls]<UL><LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC_Cmd
<LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ADC_Init
<LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_APB2PeriphClockCmd
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[3c]"></a>Debug_Init</STRONG> (Thumb, 40 bytes, Stack size 16 bytes, debug.o(.text.Debug_Init))
<P><STRONG><a name="[41]"></a>Debug_Init</STRONG> (Thumb, 40 bytes, Stack size 16 bytes, debug.o(.text.Debug_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = Debug_Init &rArr; GPIO_Init
</UL>
<BR>[Calls]<UL><LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
<LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_StructInit
<LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
<BR>[Calls]<UL><LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_StructInit
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[40]"></a>Debug_Set</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, debug.o(.text.Debug_Set))
<P><STRONG><a name="[45]"></a>Debug_Set</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, debug.o(.text.Debug_Set))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = Debug_Set
</UL>
<BR>[Calls]<UL><LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_WriteBit
<BR>[Calls]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_WriteBit
</UL>
<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskPoti
<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskLed
<LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskCounter
<LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
<LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SysTick_Handler
</UL>
<P><STRONG><a name="[42]"></a>Debug_Unset</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, debug.o(.text.Debug_Unset))
<P><STRONG><a name="[47]"></a>Debug_Unset</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, debug.o(.text.Debug_Unset))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = Debug_Unset
</UL>
<BR>[Calls]<UL><LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_WriteBit
<BR>[Calls]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_WriteBit
</UL>
<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskPoti
<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskLed
<LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskCounter
<LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
<LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SysTick_Handler
</UL>
<P><STRONG><a name="[3f]"></a>GPIO_Init</STRONG> (Thumb, 116 bytes, Stack size 24 bytes, stm32f0xx_gpio.o(.text.GPIO_Init))
<P><STRONG><a name="[44]"></a>GPIO_Init</STRONG> (Thumb, 116 bytes, Stack size 24 bytes, stm32f0xx_gpio.o(.text.GPIO_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = GPIO_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Init
<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_Init
<LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_Init
<BR>[Called By]<UL><LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Init
<LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_Init
<LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_Init
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_Init
</UL>
<P><STRONG><a name="[3e]"></a>GPIO_StructInit</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text.GPIO_StructInit))
<BR><BR>[Called By]<UL><LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Init
<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_Init
<LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_Init
<P><STRONG><a name="[49]"></a>GPIO_ReadInputDataBit</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text.GPIO_ReadInputDataBit))
<BR><BR>[Called By]<UL><LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_GetState
</UL>
<P><STRONG><a name="[41]"></a>GPIO_WriteBit</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text.GPIO_WriteBit))
<BR><BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<P><STRONG><a name="[43]"></a>GPIO_StructInit</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text.GPIO_StructInit))
<BR><BR>[Called By]<UL><LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Init
<LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_Init
<LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_Init
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_Init
</UL>
<P><STRONG><a name="[43]"></a>Key_Init</STRONG> (Thumb, 64 bytes, Stack size 24 bytes, key.o(.text.Key_Init))
<P><STRONG><a name="[46]"></a>GPIO_WriteBit</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f0xx_gpio.o(.text.GPIO_WriteBit))
<BR><BR>[Called By]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_TurnOff
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_TurnOn
</UL>
<P><STRONG><a name="[48]"></a>Key_GetState</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, key.o(.text.Key_GetState))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = Key_GetState
</UL>
<BR>[Calls]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_ReadInputDataBit
</UL>
<BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
</UL>
<P><STRONG><a name="[4a]"></a>Key_Init</STRONG> (Thumb, 64 bytes, Stack size 24 bytes, key.o(.text.Key_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 48<LI>Call Chain = Key_Init &rArr; GPIO_Init
</UL>
<BR>[Calls]<UL><LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
<LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_StructInit
<LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
<BR>[Calls]<UL><LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_StructInit
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[44]"></a>Led_Init</STRONG> (Thumb, 56 bytes, Stack size 32 bytes, led.o(.text.Led_Init))
<P><STRONG><a name="[4b]"></a>Led_Init</STRONG> (Thumb, 56 bytes, Stack size 32 bytes, led.o(.text.Led_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = Led_Init &rArr; GPIO_Init
</UL>
<BR>[Calls]<UL><LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
<LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_StructInit
<LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
<BR>[Calls]<UL><LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_StructInit
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[3d]"></a>RCC_AHBPeriphClockCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text.RCC_AHBPeriphClockCmd))
<BR><BR>[Called By]<UL><LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Init
<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_Init
<LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_Init
<P><STRONG><a name="[4c]"></a>Led_TurnOff</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, led.o(.text.Led_TurnOff))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = Led_TurnOff
</UL>
<BR>[Calls]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_WriteBit
</UL>
<BR>[Called By]<UL><LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskLed
</UL>
<P><STRONG><a name="[39]"></a>RCC_APB2PeriphClockCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text.RCC_APB2PeriphClockCmd))
<BR><BR>[Called By]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_Init
<P><STRONG><a name="[4d]"></a>Led_TurnOn</STRONG> (Thumb, 28 bytes, Stack size 8 bytes, led.o(.text.Led_TurnOn))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = Led_TurnOn
</UL>
<BR>[Calls]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_WriteBit
</UL>
<BR>[Called By]<UL><LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskLed
</UL>
<P><STRONG><a name="[42]"></a>RCC_AHBPeriphClockCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text.RCC_AHBPeriphClockCmd))
<BR><BR>[Called By]<UL><LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Init
<LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_Init
<LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_Init
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_Init
</UL>
<P><STRONG><a name="[3e]"></a>RCC_APB2PeriphClockCmd</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f0xx_rcc.o(.text.RCC_APB2PeriphClockCmd))
<BR><BR>[Called By]<UL><LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_Init
</UL>
<P><STRONG><a name="[5]"></a>SysTick_Handler</STRONG> (Thumb, 28 bytes, Stack size 8 bytes, systick.o(.text.SysTick_Handler))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = SysTick_Handler &rArr; Debug_Unset
</UL>
<BR>[Calls]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<BR>[Calls]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
</UL>
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f072.o(RESET)
</UL>
@ -459,200 +505,244 @@ Global Symbols
</UL>
<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f072.o(.text)
</UL>
<P><STRONG><a name="[45]"></a>TaskCounter</STRONG> (Thumb, 60 bytes, Stack size 16 bytes, taskcounter.o(.text.TaskCounter))
<BR><BR>[Stack]<UL><LI>Max Depth = 300<LI>Call Chain = TaskCounter &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
<P><STRONG><a name="[53]"></a>TaskCounter</STRONG> (Thumb, 56 bytes, Stack size 8 bytes, taskcounter.o(.text.TaskCounter))
<BR><BR>[Stack]<UL><LI>Max Depth = 292<LI>Call Chain = TaskCounter &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2snprintf
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<BR>[Calls]<UL><LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2snprintf
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[48]"></a>TaskKey</STRONG> (Thumb, 28 bytes, Stack size 8 bytes, taskkey.o(.text.TaskKey))
<BR><BR>[Stack]<UL><LI>Max Depth = 292<LI>Call Chain = TaskKey &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
<P><STRONG><a name="[54]"></a>TaskKey</STRONG> (Thumb, 296 bytes, Stack size 48 bytes, taskkey.o(.text.TaskKey))
<BR><BR>[Stack]<UL><LI>Max Depth = 332<LI>Call Chain = TaskKey &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<BR>[Calls]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tick_GetMs
<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetForegroundColourRgb16
<LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_GetState
<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2snprintf
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[49]"></a>TaskLed</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, taskled.o(.text.TaskLed))
<BR><BR>[Stack]<UL><LI>Max Depth = 292<LI>Call Chain = TaskLed &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
<P><STRONG><a name="[55]"></a>TaskLed</STRONG> (Thumb, 104 bytes, Stack size 16 bytes, taskled.o(.text.TaskLed))
<BR><BR>[Stack]<UL><LI>Max Depth = 300<LI>Call Chain = TaskLed &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<BR>[Calls]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tick_GetMs
<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_TurnOff
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_TurnOn
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[4a]"></a>TaskMandelbrot</STRONG> (Thumb, 324 bytes, Stack size 96 bytes, taskmandelbrot.o(.text.TaskMandelbrot))
<P><STRONG><a name="[58]"></a>TaskMandelbrot</STRONG> (Thumb, 460 bytes, Stack size 96 bytes, taskmandelbrot.o(.text.TaskMandelbrot))
<BR><BR>[Stack]<UL><LI>Max Depth = 380<LI>Call Chain = TaskMandelbrot &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[31]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dsub
<LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dcmpgt
<BR>[Calls]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dcmpgt
<LI><a href="#[2c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
<LI><a href="#[31]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dsub
<LI><a href="#[33]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dmul
<LI><a href="#[34]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_ui2d
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawPixel
<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tick_GetMs
<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_ClearArea
<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawPixel
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[4d]"></a>TaskPoti</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, taskpoti.o(.text.TaskPoti))
<BR><BR>[Stack]<UL><LI>Max Depth = 292<LI>Call Chain = TaskPoti &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
<P><STRONG><a name="[57]"></a>TaskPoti</STRONG> (Thumb, 84 bytes, Stack size 16 bytes, taskpoti.o(.text.TaskPoti))
<BR><BR>[Stack]<UL><LI>Max Depth = 300<LI>Call Chain = TaskPoti &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<BR>[Calls]<UL><LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_GetValue
<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2snprintf
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[4e]"></a>TaskWatch</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, taskwatch.o(.text.TaskWatch))
<BR><BR>[Stack]<UL><LI>Max Depth = 292<LI>Call Chain = TaskWatch &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
<P><STRONG><a name="[56]"></a>TaskWatch</STRONG> (Thumb, 112 bytes, Stack size 24 bytes, taskwatch.o(.text.TaskWatch))
<BR><BR>[Stack]<UL><LI>Max Depth = 308<LI>Call Chain = TaskWatch &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<BR>[Calls]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tick_GetMs
<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
<LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidiv
<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2snprintf
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[56]"></a>Tft_ClearScreen</STRONG> (Thumb, 128 bytes, Stack size 16 bytes, tftdisplay.o(.text.Tft_ClearScreen))
<P><STRONG><a name="[5d]"></a>Tft_ClearArea</STRONG> (Thumb, 112 bytes, Stack size 24 bytes, tftdisplay.o(.text.Tft_ClearArea))
<BR><BR>[Stack]<UL><LI>Max Depth = 220<LI>Call Chain = Tft_ClearArea &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetWindow
</UL>
<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
</UL>
<P><STRONG><a name="[52]"></a>Tft_ClearScreen</STRONG> (Thumb, 128 bytes, Stack size 16 bytes, tftdisplay.o(.text.Tft_ClearScreen))
<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = Tft_ClearScreen
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[4f]"></a>Tft_DrawChar</STRONG> (Thumb, 292 bytes, Stack size 56 bytes, tftdisplay.o(.text.Tft_DrawChar))
<P><STRONG><a name="[62]"></a>Tft_DrawChar</STRONG> (Thumb, 292 bytes, Stack size 56 bytes, tftdisplay.o(.text.Tft_DrawChar))
<BR><BR>[Stack]<UL><LI>Max Depth = 252<LI>Call Chain = Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetWindow
<BR>[Calls]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetWindow
</UL>
<BR>[Called By]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
<BR>[Called By]<UL><LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawString
</UL>
<P><STRONG><a name="[4c]"></a>Tft_DrawPixel</STRONG> (Thumb, 88 bytes, Stack size 16 bytes, tftdisplay.o(.text.Tft_DrawPixel))
<P><STRONG><a name="[5f]"></a>Tft_DrawPixel</STRONG> (Thumb, 88 bytes, Stack size 16 bytes, tftdisplay.o(.text.Tft_DrawPixel))
<BR><BR>[Stack]<UL><LI>Max Depth = 212<LI>Call Chain = Tft_DrawPixel &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetWindow
<BR>[Calls]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetWindow
</UL>
<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
</UL>
<P><STRONG><a name="[47]"></a>Tft_DrawString</STRONG> (Thumb, 84 bytes, Stack size 32 bytes, tftdisplay.o(.text.Tft_DrawString))
<P><STRONG><a name="[59]"></a>Tft_DrawString</STRONG> (Thumb, 84 bytes, Stack size 32 bytes, tftdisplay.o(.text.Tft_DrawString))
<BR><BR>[Stack]<UL><LI>Max Depth = 284<LI>Call Chain = Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawChar
<BR>[Calls]<UL><LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawChar
</UL>
<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskPoti
<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskLed
<LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskCounter
<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskPoti
<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskLed
<LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskCounter
</UL>
<P><STRONG><a name="[51]"></a>Tft_Init</STRONG> (Thumb, 136 bytes, Stack size 32 bytes, tftdisplay.o(.text.Tft_Init))
<P><STRONG><a name="[4f]"></a>Tft_Init</STRONG> (Thumb, 136 bytes, Stack size 32 bytes, tftdisplay.o(.text.Tft_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = Tft_Init &rArr; GPIO_Init
</UL>
<BR>[Calls]<UL><LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
<LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_StructInit
<LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
<BR>[Calls]<UL><LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_StructInit
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;RCC_AHBPeriphClockCmd
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[55]"></a>Tft_SetFont</STRONG> (Thumb, 48 bytes, Stack size 0 bytes, tftdisplay.o(.text.Tft_SetFont))
<BR><BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<P><STRONG><a name="[50]"></a>Tft_SetFont</STRONG> (Thumb, 48 bytes, Stack size 0 bytes, tftdisplay.o(.text.Tft_SetFont))
<BR><BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[53]"></a>Tick_InitSysTick</STRONG> (Thumb, 52 bytes, Stack size 8 bytes, systick.o(.text.Tick_InitSysTick))
<P><STRONG><a name="[5c]"></a>Tft_SetForegroundColourRgb16</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, tftdisplay.o(.text.Tft_SetForegroundColourRgb16))
<BR><BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
</UL>
<P><STRONG><a name="[5b]"></a>Tick_GetMs</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, systick.o(.text.Tick_GetMs))
<BR><BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskLed
<LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
</UL>
<P><STRONG><a name="[51]"></a>Tick_InitSysTick</STRONG> (Thumb, 52 bytes, Stack size 8 bytes, systick.o(.text.Tick_InitSysTick))
<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = Tick_InitSysTick &rArr; __aeabi_uidiv
</UL>
<BR>[Calls]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidiv
<BR>[Calls]<UL><LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidiv
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
<BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<P><STRONG><a name="[52]"></a>__aeabi_assert</STRONG> (Thumb, 46 bytes, Stack size 156 bytes, main_1.o(.text.__aeabi_assert))
<P><STRONG><a name="[63]"></a>__aeabi_assert</STRONG> (Thumb, 46 bytes, Stack size 156 bytes, main_1.o(.text.__aeabi_assert))
<BR><BR>[Stack]<UL><LI>Max Depth = 156<LI>Call Chain = __aeabi_assert
</UL>
<BR>[Called By]<UL><LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetWindow
<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetWindow
</UL>
<P><STRONG><a name="[26]"></a>main</STRONG> (Thumb, 92 bytes, Stack size 0 bytes, main_1.o(.text.main))
<BR><BR>[Stack]<UL><LI>Max Depth = 380<LI>Call Chain = main &rArr; TaskMandelbrot &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
<P><STRONG><a name="[26]"></a>main</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, main_1.o(.text.main))
<BR><BR>[Stack]<UL><LI>Max Depth = 388<LI>Call Chain = main &rArr; Superloop &rArr; TaskMandelbrot &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskPoti
<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskLed
<LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskCounter
<LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Init
<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tick_InitSysTick
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<LI><a href="#[38]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_Init
<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetFont
<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_ClearScreen
<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_Init
<LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_Init
<BR>[Calls]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Superloop
</UL>
<BR>[Address Reference Count : 1]<UL><LI> entry9a.o(.ARM.Collect$$$$0000000B)
</UL>
<P><STRONG><a name="[57]"></a>__0snprintf$1</STRONG> (Thumb, 50 bytes, Stack size 40 bytes, printf1.o(i.__0snprintf$1), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
<P><STRONG><a name="[64]"></a>__0snprintf$6</STRONG> (Thumb, 50 bytes, Stack size 40 bytes, printf6.o(i.__0snprintf$6), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
</UL>
<P><STRONG><a name="[65]"></a>__1snprintf$1</STRONG> (Thumb, 0 bytes, Stack size 40 bytes, printf1.o(i.__0snprintf$1), UNUSED)
<P><STRONG><a name="[73]"></a>__1snprintf$6</STRONG> (Thumb, 0 bytes, Stack size 40 bytes, printf6.o(i.__0snprintf$6), UNUSED)
<P><STRONG><a name="[46]"></a>__2snprintf</STRONG> (Thumb, 0 bytes, Stack size 40 bytes, printf1.o(i.__0snprintf$1))
<P><STRONG><a name="[5a]"></a>__2snprintf</STRONG> (Thumb, 0 bytes, Stack size 40 bytes, printf6.o(i.__0snprintf$6))
<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = __2snprintf
</UL>
<BR>[Called By]<UL><LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskCounter
<BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskPoti
<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskCounter
</UL>
<P><STRONG><a name="[35]"></a>__ARM_clz</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, depilogue.o(i.__ARM_clz))
<BR><BR>[Called By]<UL><LI><a href="#[2f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
</UL>
<P><STRONG><a name="[66]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
<P><STRONG><a name="[74]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
<P><STRONG><a name="[67]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
<P><STRONG><a name="[75]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
<P><STRONG><a name="[68]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
<P><STRONG><a name="[76]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
<P>
<H3>
Local Symbols
</H3>
<P><STRONG><a name="[50]"></a>Tft_SetWindow</STRONG> (Thumb, 248 bytes, Stack size 40 bytes, tftdisplay.o(.text.Tft_SetWindow))
<P><STRONG><a name="[61]"></a>Tft_SetWindow</STRONG> (Thumb, 248 bytes, Stack size 40 bytes, tftdisplay.o(.text.Tft_SetWindow))
<BR><BR>[Stack]<UL><LI>Max Depth = 196<LI>Call Chain = Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Calls]<UL><LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_assert
<BR>[Calls]<UL><LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_assert
</UL>
<BR>[Called By]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawChar
<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawPixel
<BR>[Called By]<UL><LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawChar
<LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_ClearArea
<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_DrawPixel
</UL>
<P><STRONG><a name="[58]"></a>_printf_core</STRONG> (Thumb, 332 bytes, Stack size 88 bytes, printf1.o(i._printf_core), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
<P><STRONG><a name="[4e]"></a>Superloop</STRONG> (Thumb, 156 bytes, Stack size 8 bytes, main_1.o(.text.Superloop))
<BR><BR>[Stack]<UL><LI>Max Depth = 388<LI>Call Chain = Superloop &rArr; TaskMandelbrot &rArr; Tft_DrawString &rArr; Tft_DrawChar &rArr; Tft_SetWindow &rArr; __aeabi_assert
</UL>
<BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0snprintf$1
<BR>[Calls]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskMandelbrot
<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskPoti
<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskWatch
<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskLed
<LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskKey
<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TaskCounter
<LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Init
<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tick_InitSysTick
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Unset
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Debug_Set
<LI><a href="#[3d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Adc_Init
<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_SetFont
<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_ClearScreen
<LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Tft_Init
<LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Led_Init
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Key_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[26]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[29]"></a>_snputc</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, printf1.o(i._snputc))
<BR>[Address Reference Count : 1]<UL><LI> printf1.o(i.__0snprintf$1)
<P><STRONG><a name="[65]"></a>_printf_core</STRONG> (Thumb, 768 bytes, Stack size 96 bytes, printf6.o(i._printf_core), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_pre_padding
<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_post_padding
</UL>
<BR>[Called By]<UL><LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0snprintf$6
</UL>
<P><STRONG><a name="[67]"></a>_printf_post_padding</STRONG> (Thumb, 32 bytes, Stack size 24 bytes, printf6.o(i._printf_post_padding), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
</UL>
<P><STRONG><a name="[66]"></a>_printf_pre_padding</STRONG> (Thumb, 44 bytes, Stack size 40 bytes, printf6.o(i._printf_pre_padding), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
</UL>
<P><STRONG><a name="[29]"></a>_snputc</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, printf6.o(i._snputc))
<BR>[Address Reference Count : 1]<UL><LI> printf6.o(i.__0snprintf$6)
</UL><P>
<H3>
Undefined Global Symbols

View file

@ -66,8 +66,8 @@ I (stm32f0-stdperiph\stm32f0xx_tim.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_usart.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_wwdg.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_misc.h)(0x6AC7611F)
F (.\src\BSP\TftDisplay.c)(0x6AC7611F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/tftdisplay.o -MMD)
I (src\BSP\TftDisplay.h)(0x6AC7611F)
F (.\src\BSP\TftDisplay.c)(0x6ACE5530)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/tftdisplay.o -MMD)
I (src\BSP\TftDisplay.h)(0x6ACE552F)
I (src\StdDef.h)(0x6AC7611F)
I (src\Devices\stdint.h)(0x6AC7611F)
I (src\Fonts\TftFont.h)(0x6AC7611F)
@ -133,7 +133,7 @@ I (stm32f0-stdperiph\stm32f0xx_tim.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_usart.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_wwdg.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_misc.h)(0x6AC7611F)
F (.\src\BSP\systick.c)(0x6AC76B25)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/systick.o -MMD)
F (.\src\BSP\systick.c)(0x6ACE4B5B)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/systick.o -MMD)
I (src\Devices\stdint.h)(0x6AC7611F)
I (src\Devices\stm32f0xx.h)(0x6AC7611F)
I (src\Devices\core_cm0.h)(0x6AC7611F)
@ -164,15 +164,15 @@ I (stm32f0-stdperiph\stm32f0xx_tim.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_usart.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_wwdg.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_misc.h)(0x6AC7611F)
I (src\BSP\systick.h)(0x6AC7611F)
I (src\BSP\systick.h)(0x6ACE4AB9)
I (src\debug.h)(0x6AC76DDF)
F (.\src\main.c)(0x6AC7765E)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/main_1.o -MMD)
F (.\src\main.c)(0x6ACE6BCE)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/main_1.o -MMD)
I (src\StdDef.h)(0x6AC7611F)
I (src\Devices\stdint.h)(0x6AC7611F)
I (src\BSP\Key.h)(0x6AC7611F)
I (src\BSP\Led.h)(0x6AC7611F)
I (src\BSP\Adc.h)(0x6AC7611F)
I (src\BSP\systick.h)(0x6AC7611F)
I (src\BSP\systick.h)(0x6ACE4AB9)
I (stm32f0-stdperiph\stm32f0xx_gpio.h)(0x6AC7611F)
I (src\Devices\stm32f0xx.h)(0x6AC7611F)
I (src\Devices\core_cm0.h)(0x6AC7611F)
@ -202,7 +202,7 @@ I (stm32f0-stdperiph\stm32f0xx_tim.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_usart.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_wwdg.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_misc.h)(0x6AC7611F)
I (src\BSP\TftDisplay.h)(0x6AC7611F)
I (src\BSP\TftDisplay.h)(0x6ACE552F)
I (src\Fonts\TftFont.h)(0x6AC7611F)
I (src\Fonts\TftFont_16x24.h)(0x6AC7611F)
I (src\Tasks\TaskAll.h)(0x6AC7611F)
@ -380,8 +380,8 @@ I (src\Fonts\TftFont_16x24.h)(0x6AC7611F)
I (src\Fonts\TftFont.h)(0x6AC7611F)
I (src\StdDef.h)(0x6AC7611F)
I (src\Devices\stdint.h)(0x6AC7611F)
F (.\src\Tasks\TaskCounter.c)(0x6AC76B7A)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskcounter.o -MMD)
I (src\BSP\TftDisplay.h)(0x6AC7611F)
F (.\src\Tasks\TaskCounter.c)(0x6ACE5531)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskcounter.o -MMD)
I (src\BSP\TftDisplay.h)(0x6ACE552F)
I (src\StdDef.h)(0x6AC7611F)
I (src\Devices\stdint.h)(0x6AC7611F)
I (src\Fonts\TftFont.h)(0x6AC7611F)
@ -416,11 +416,13 @@ I (stm32f0-stdperiph\stm32f0xx_tim.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_usart.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_wwdg.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_misc.h)(0x6AC7611F)
F (.\src\Tasks\TaskKey.c)(0x6AC76BA8)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskkey.o -MMD)
I (src\BSP\TftDisplay.h)(0x6AC7611F)
F (.\src\Tasks\TaskKey.c)(0x6ACE5533)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskkey.o -MMD)
I (src\BSP\TftDisplay.h)(0x6ACE552F)
I (src\StdDef.h)(0x6AC7611F)
I (src\Devices\stdint.h)(0x6AC7611F)
I (src\Fonts\TftFont.h)(0x6AC7611F)
I (src\BSP\Key.h)(0x6AC7611F)
I (src\BSP\systick.h)(0x6ACE4AB9)
I (src\Tasks\TaskKey.h)(0x6AC7611F)
I (src\Debug.h)(0x6AC76DDF)
I (stm32f0-stdperiph\stm32f0xx_gpio.h)(0x6AC7611F)
@ -452,12 +454,14 @@ I (stm32f0-stdperiph\stm32f0xx_tim.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_usart.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_wwdg.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_misc.h)(0x6AC7611F)
F (.\src\Tasks\TaskLed.c)(0x6AC76BD4)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskled.o -MMD)
I (src\BSP\TftDisplay.h)(0x6AC7611F)
F (.\src\Tasks\TaskLed.c)(0x6ACE5537)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskled.o -MMD)
I (src\BSP\TftDisplay.h)(0x6ACE552F)
I (src\StdDef.h)(0x6AC7611F)
I (src\Devices\stdint.h)(0x6AC7611F)
I (src\Fonts\TftFont.h)(0x6AC7611F)
I (src\BSP\Led.h)(0x6AC7611F)
I (src\Tasks\TaskLed.h)(0x6AC7611F)
I (src\BSP\systick.h)(0x6ACE4AB9)
I (src\Debug.h)(0x6AC76DDF)
I (stm32f0-stdperiph\stm32f0xx_gpio.h)(0x6AC7611F)
I (src\Devices\stm32f0xx.h)(0x6AC7611F)
@ -488,11 +492,12 @@ I (stm32f0-stdperiph\stm32f0xx_tim.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_usart.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_wwdg.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_misc.h)(0x6AC7611F)
F (.\src\Tasks\TaskMandelbrot.c)(0x6AC76C46)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskmandelbrot.o -MMD)
I (src\BSP\TftDisplay.h)(0x6AC7611F)
F (.\src\Tasks\TaskMandelbrot.c)(0x6ACE5548)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskmandelbrot.o -MMD)
I (src\BSP\TftDisplay.h)(0x6ACE552F)
I (src\StdDef.h)(0x6AC7611F)
I (src\Devices\stdint.h)(0x6AC7611F)
I (src\Fonts\TftFont.h)(0x6AC7611F)
I (src\BSP\systick.h)(0x6ACE4AB9)
I (src\Tasks\TaskMandelbrot.h)(0x6AC7611F)
I (src\Debug.h)(0x6AC76DDF)
I (stm32f0-stdperiph\stm32f0xx_gpio.h)(0x6AC7611F)
@ -524,11 +529,12 @@ I (stm32f0-stdperiph\stm32f0xx_tim.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_usart.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_wwdg.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_misc.h)(0x6AC7611F)
F (.\src\Tasks\TaskPoti.c)(0x6AC76C1D)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskpoti.o -MMD)
I (src\BSP\TftDisplay.h)(0x6AC7611F)
F (.\src\Tasks\TaskPoti.c)(0x6ACE5535)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskpoti.o -MMD)
I (src\BSP\TftDisplay.h)(0x6ACE552F)
I (src\StdDef.h)(0x6AC7611F)
I (src\Devices\stdint.h)(0x6AC7611F)
I (src\Fonts\TftFont.h)(0x6AC7611F)
I (src\BSP\Adc.h)(0x6AC7611F)
I (src\Tasks\TaskPoti.h)(0x6AC7611F)
I (src\Debug.h)(0x6AC76DDF)
I (stm32f0-stdperiph\stm32f0xx_gpio.h)(0x6AC7611F)
@ -560,11 +566,12 @@ I (stm32f0-stdperiph\stm32f0xx_tim.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_usart.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_wwdg.h)(0x6AC7611F)
I (stm32f0-stdperiph\stm32f0xx_misc.h)(0x6AC7611F)
F (.\src\Tasks\TaskWatch.c)(0x6AC76BF9)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskwatch.o -MMD)
I (src\BSP\TftDisplay.h)(0x6AC7611F)
F (.\src\Tasks\TaskWatch.c)(0x6ACE5534)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m0 -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -gdwarf-4 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -Wno-reserved-identifier -I ./src -I ./stm32f0-stdperiph -I ./src/Devices -I ./src/Tasks -IC:/Users/gaems/AppData/Local/arm/packs/Keil/STM32F0xx_DFP/2.1.1/Drivers/CMSIS/Device/ST/STM32F0xx/Include -D__UVISION_VERSION="542" -DSTM32F072xB -DSTM32F072 -DUSE_STDPERIPH_DRIVER -o ./output/taskwatch.o -MMD)
I (src\BSP\TftDisplay.h)(0x6ACE552F)
I (src\StdDef.h)(0x6AC7611F)
I (src\Devices\stdint.h)(0x6AC7611F)
I (src\Fonts\TftFont.h)(0x6AC7611F)
I (src\BSP\systick.h)(0x6ACE4AB9)
I (src\Tasks\TaskWatch.h)(0x6AC7611F)
I (src\Debug.h)(0x6AC76DDF)
I (stm32f0-stdperiph\stm32f0xx_gpio.h)(0x6AC7611F)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,6 +1,7 @@
./output/taskkey.o: src\Tasks\TaskKey.c src\BSP\TftDisplay.h src\StdDef.h \
src\Devices\stdint.h src\Fonts\TftFont.h src\Tasks\TaskKey.h \
src\Debug.h stm32f0-stdperiph\stm32f0xx_gpio.h src\Devices\stm32f0xx.h \
src\Devices\stdint.h src\Fonts\TftFont.h src\BSP\Key.h \
src\BSP\systick.h src\Tasks\TaskKey.h src\Debug.h \
stm32f0-stdperiph\stm32f0xx_gpio.h src\Devices\stm32f0xx.h \
src\Devices\core_cm0.h src\Devices\core_cmInstr.h \
src\Devices\core_cmFunc.h src\Devices\system_stm32f0xx.h \
src\Devices\stm32f0xx_conf.h stm32f0-stdperiph\stm32f0xx_adc.h \

Binary file not shown.

View file

@ -1,6 +1,7 @@
./output/taskled.o: src\Tasks\TaskLed.c src\BSP\TftDisplay.h src\StdDef.h \
src\Devices\stdint.h src\Fonts\TftFont.h src\Tasks\TaskLed.h \
src\Debug.h stm32f0-stdperiph\stm32f0xx_gpio.h src\Devices\stm32f0xx.h \
src\Devices\stdint.h src\Fonts\TftFont.h src\BSP\Led.h \
src\Tasks\TaskLed.h src\BSP\systick.h src\Debug.h \
stm32f0-stdperiph\stm32f0xx_gpio.h src\Devices\stm32f0xx.h \
src\Devices\core_cm0.h src\Devices\core_cmInstr.h \
src\Devices\core_cmFunc.h src\Devices\system_stm32f0xx.h \
src\Devices\stm32f0xx_conf.h stm32f0-stdperiph\stm32f0xx_adc.h \

Binary file not shown.

View file

@ -1,7 +1,7 @@
./output/taskmandelbrot.o: src\Tasks\TaskMandelbrot.c \
src\BSP\TftDisplay.h src\StdDef.h src\Devices\stdint.h \
src\Fonts\TftFont.h src\Tasks\TaskMandelbrot.h src\Debug.h \
stm32f0-stdperiph\stm32f0xx_gpio.h src\Devices\stm32f0xx.h \
src\Fonts\TftFont.h src\BSP\systick.h src\Tasks\TaskMandelbrot.h \
src\Debug.h stm32f0-stdperiph\stm32f0xx_gpio.h src\Devices\stm32f0xx.h \
src\Devices\core_cm0.h src\Devices\core_cmInstr.h \
src\Devices\core_cmFunc.h src\Devices\system_stm32f0xx.h \
src\Devices\stm32f0xx_conf.h stm32f0-stdperiph\stm32f0xx_adc.h \

Binary file not shown.

View file

@ -1,5 +1,5 @@
./output/taskpoti.o: src\Tasks\TaskPoti.c src\BSP\TftDisplay.h \
src\StdDef.h src\Devices\stdint.h src\Fonts\TftFont.h \
src\StdDef.h src\Devices\stdint.h src\Fonts\TftFont.h src\BSP\Adc.h \
src\Tasks\TaskPoti.h src\Debug.h stm32f0-stdperiph\stm32f0xx_gpio.h \
src\Devices\stm32f0xx.h src\Devices\core_cm0.h \
src\Devices\core_cmInstr.h src\Devices\core_cmFunc.h \

Binary file not shown.

View file

@ -1,15 +1,15 @@
./output/taskwatch.o: src\Tasks\TaskWatch.c src\BSP\TftDisplay.h \
src\StdDef.h src\Devices\stdint.h src\Fonts\TftFont.h \
src\Tasks\TaskWatch.h src\Debug.h stm32f0-stdperiph\stm32f0xx_gpio.h \
src\Devices\stm32f0xx.h src\Devices\core_cm0.h \
src\Devices\core_cmInstr.h src\Devices\core_cmFunc.h \
src\Devices\system_stm32f0xx.h src\Devices\stm32f0xx_conf.h \
stm32f0-stdperiph\stm32f0xx_adc.h stm32f0-stdperiph\stm32f0xx_can.h \
stm32f0-stdperiph\stm32f0xx_cec.h stm32f0-stdperiph\stm32f0xx_crc.h \
stm32f0-stdperiph\stm32f0xx_crs.h stm32f0-stdperiph\stm32f0xx_comp.h \
stm32f0-stdperiph\stm32f0xx_dac.h stm32f0-stdperiph\stm32f0xx_dbgmcu.h \
stm32f0-stdperiph\stm32f0xx_dma.h stm32f0-stdperiph\stm32f0xx_exti.h \
stm32f0-stdperiph\stm32f0xx_flash.h \
src\BSP\systick.h src\Tasks\TaskWatch.h src\Debug.h \
stm32f0-stdperiph\stm32f0xx_gpio.h src\Devices\stm32f0xx.h \
src\Devices\core_cm0.h src\Devices\core_cmInstr.h \
src\Devices\core_cmFunc.h src\Devices\system_stm32f0xx.h \
src\Devices\stm32f0xx_conf.h stm32f0-stdperiph\stm32f0xx_adc.h \
stm32f0-stdperiph\stm32f0xx_can.h stm32f0-stdperiph\stm32f0xx_cec.h \
stm32f0-stdperiph\stm32f0xx_crc.h stm32f0-stdperiph\stm32f0xx_crs.h \
stm32f0-stdperiph\stm32f0xx_comp.h stm32f0-stdperiph\stm32f0xx_dac.h \
stm32f0-stdperiph\stm32f0xx_dbgmcu.h stm32f0-stdperiph\stm32f0xx_dma.h \
stm32f0-stdperiph\stm32f0xx_exti.h stm32f0-stdperiph\stm32f0xx_flash.h \
stm32f0-stdperiph\stm32f0xx_syscfg.h stm32f0-stdperiph\stm32f0xx_i2c.h \
stm32f0-stdperiph\stm32f0xx_iwdg.h stm32f0-stdperiph\stm32f0xx_pwr.h \
stm32f0-stdperiph\stm32f0xx_rcc.h stm32f0-stdperiph\stm32f0xx_rtc.h \

Binary file not shown.

Binary file not shown.

View file

@ -285,6 +285,27 @@ BOOL Tft_DrawVLine(uint16_t const x, uint16_t const y, uint16_t const length)
return FALSE;
}
/*
* Fills the given area with the background colour
*/
BOOL Tft_ClearArea(uint16_t const x, uint16_t const y, uint16_t const width,
uint16_t const height)
{
if(((x + width) <= TFT_WIDTH) &&
((y + height) <= TFT_HEIGHT))
{
if((width > 0) && (height > 0))
{
Tft_SetWindow(x, y, width, height);
Tft_WritePixels(Tft_Cfg.colours[Tft_ColourIdx_Background],
width * height);
}
/* else Nothing to do */
return TRUE;
}
return FALSE;
}
/*
* Draws the given char at the given position

View file

@ -129,6 +129,17 @@ BOOL Tft_DrawHLine(uint16_t const x, uint16_t const y, uint16_t const length);
*/
BOOL Tft_DrawVLine(uint16_t const x, uint16_t const y, uint16_t const length);
/**
* @brief Fill area with the active background colour
* @param x: X coordinate of the upper left corner
* @param y: Y coordinate of the upper left corner
* @param width: Width of the area in pixels
* @param height: Height of the area in pixels
* @retval TRUE if the function succeeded else FALSE
*/
BOOL Tft_ClearArea(uint16_t const x, uint16_t const y, uint16_t const width,
uint16_t const height);
/**
* @brief Draw character (in active foreground colour)
* @param x: X coordinate refering to the left edge of the char

View file

@ -19,7 +19,7 @@
#define _100_ms 100
/* Private variables ------------------------------------------------------- */
static uint32_t msTicks; // Counts 1ms timeTicks
static volatile uint32_t msTicks; // Counts 1ms timeTicks
/*-----------------------------------------------------------------------------
* SysTick_Handler: Counts every 1ms
@ -40,3 +40,11 @@ void SysTick_Handler (void){
void Tick_InitSysTick(void){
SysTick_Config(SystemCoreClock/1000); /* Generate interrupt each 1 ms */
}
/*-------------------------------------------------------------------------------
* Tick_GetMs: Returns the milliseconds since Tick_InitSysTick* Parameters: (none)
* Return: current tick count in ms
*------------------------------------------------------------------------------*/
uint32_t Tick_GetMs(void){
return msTicks;
}

View file

@ -8,6 +8,7 @@
/* Exported functions ------------------------------------------------------- */
void Tick_Delay (uint32_t dlyTicks);
void Tick_InitSysTick(void);
uint32_t Tick_GetMs(void);
void SysTick_Handler2 (void);

View file

@ -17,14 +17,21 @@
#define MAX_LEN 14 // Maximale Anzahl Zeichen pro Zeile
static char tmpBuf[MAX_LEN];
/**
* @brief Increments the counter and prints it, the label is only drawn once
*/
void TaskCounter (void)
{
Debug_Set(counter);
static uint32_t counter = 0;
static BOOL initDone = FALSE;
if (!initDone)
{
Tft_DrawString(10, 18+0*24, "Cnt ");
initDone = TRUE;
}
counter++;
snprintf(tmpBuf, MAX_LEN, "%d", counter);
Tft_DrawString(10, 18+0*24, "Cnt ");
Tft_DrawString(10 + 16*7, 18+0*24, tmpBuf);
Debug_Unset(counter);
}

View file

@ -10,14 +10,90 @@
*/
#include "BSP/TftDisplay.h"
#include "BSP/Key.h"
#include "BSP/systick.h"
#include "StdDef.h"
#include "TaskKey.h"
#include "Debug.h"
#include <stdio.h>
#define MAX_LEN 14 // Maximale Anzahl Zeichen pro Zeile
#define DEBOUNCE_MS 20u
static uint16_t current_color = TFT_COLOR_BLACK;
/**
* @brief Returns the key state, a change is only accepted after being stable for DEBOUNCE_MS
*/
static BOOL Key_GetDebounced (KeyType key, uint32_t now)
{
static BOOL lastRaw[KeyType_Count];
static BOOL stable[KeyType_Count];
static uint32_t lastChange[KeyType_Count];
BOOL raw = Key_GetState(key);
if (raw != lastRaw[key])
{
lastRaw[key] = raw;
lastChange[key] = now;
}
else if (now - lastChange[key] >= DEBOUNCE_MS)
{
stable[key] = raw;
}
return stable[key];
}
/**
* @brief Shows the debounced key states, key USER changes the colour on each press
*/
void TaskKey (void)
{
Debug_Set(key);
Tft_DrawString(10, 18+1*24, "Key ");
Debug_Unset(key);
static char tmpBuf[MAX_LEN];
static BOOL userPrev = FALSE;
static BOOL initDone = FALSE;
static uint8_t lastState = 0;
uint32_t now = Tick_GetMs();
BOOL wakeup = Key_GetDebounced(KeyType_WAKEUP, now);
BOOL user0 = Key_GetDebounced(KeyType_USER0, now);
BOOL user1 = Key_GetDebounced(KeyType_USER1, now);
BOOL user = user0 || user1;
uint8_t state = (wakeup << 2) | (user0 << 1) | user1;
if (user && !userPrev)
{
if (current_color == TFT_COLOR_BLACK)
{
current_color = TFT_COLOR_BLUE;
Tft_SetForegroundColourRgb16(TFT_COLOR_BLUE);
}
else if (current_color == TFT_COLOR_BLUE)
{
current_color = TFT_COLOR_GREEN;
Tft_SetForegroundColourRgb16(TFT_COLOR_GREEN);
}
else
{
current_color = TFT_COLOR_BLACK;
Tft_SetForegroundColourRgb16(TFT_COLOR_BLACK);
}
}
userPrev = user;
if (!initDone)
{
Tft_DrawString(10, 18+1*24, "Key ");
}
if (!initDone || state != lastState)
{
snprintf(tmpBuf, MAX_LEN, "%d %d %d", wakeup, user0, user1);
Tft_DrawString(10 + 16*7, 18+1*24, tmpBuf);
lastState = state;
}
initDone = TRUE;
}

View file

@ -1,22 +1,46 @@
/**
******************************************************************************
* @file TaskLed.c
* @author Josef Langer
* @version V1.1
* @date 07.10.2022
* @brief Task LED, Running light, changes every 100ms between LED 3,4 and 5
******************************************************************************
*/
#include "BSP/TftDisplay.h"
#include "StdDef.h"
#include "TaskLed.h"
#include "Debug.h"
void TaskLed (void)
{
Debug_Set(led);
Tft_DrawString(10, 18+2*24, "Led ");
Debug_Unset(led);
}
/**
******************************************************************************
* @file TaskLed.c
* @author Josef Langer
* @version V1.1
* @date 07.10.2022
* @brief Task LED, Running light, changes every 100ms between LED 3,4 and 5
******************************************************************************
*/
#include "BSP/TftDisplay.h"
#include "BSP/Led.h"
#include "StdDef.h"
#include "TaskLed.h"
#include "BSP/systick.h"
#include "Debug.h"
#define LED_PERIOD_MS 100u
#define LED_COUNT (sizeof(ledSeq) / sizeof(ledSeq[0]))
static const LEDType ledSeq[] = { LEDType_LED3, LEDType_LED4, LEDType_LED5 };
/**
* @brief Non-blocking running light, switches to the next LED every 100 ms
*/
void TaskLed (void)
{
static BOOL initDone = FALSE;
static uint8_t idx = 0;
static uint32_t lastSwitch = 0;
if (!initDone)
{
Tft_DrawString(10, 18+2*24, "Led ");
Led_TurnOn(ledSeq[0]);
lastSwitch = Tick_GetMs();
initDone = TRUE;
}
else if (Tick_GetMs() - lastSwitch >= LED_PERIOD_MS)
{
Led_TurnOff(ledSeq[idx]);
idx = (idx + 1u) % LED_COUNT;
Led_TurnOn(ledSeq[idx]);
lastSwitch += LED_PERIOD_MS;
}
}

View file

@ -10,18 +10,26 @@
#include "BSP/TftDisplay.h"
#include "BSP/systick.h"
#include "StdDef.h"
#include "TaskMandelbrot.h"
#include "Debug.h"
// Quelle Algorithmus Mandelbrot: http://warp.povusers.org/Mandelbrot/
// Quelle Algorithmus Mandelbrot: http://warp.povusers.org/Mandelbrot/
#define ImageHeight 150
#define ImageWidth 150
#define OFFSET 150
#define TIME_BUDGET_MS 5u // Maximale Rechenzeit pro Aufruf
static unsigned curX = 0;
static unsigned curY = 0;
static BOOL clearing = FALSE;
static void MandelBrot (void)
/**
* @brief Calculates and draws a single pixel of the Mandelbrot set
*/
static void MandelBrotPixel (unsigned x, unsigned y)
{
double MinRe = -2.0;
double MaxRe = 1.0;
@ -31,36 +39,69 @@ static void MandelBrot (void)
double Im_factor = (MaxIm-MinIm)/(ImageHeight-1);
unsigned MaxIterations = 30;
for(unsigned y=0; y<ImageHeight; ++y)
{
double c_im = MaxIm - y*Im_factor;
for(unsigned x=0; x<ImageWidth; ++x)
{
double c_re = MinRe + x*Re_factor;
double c_im = MaxIm - y*Im_factor;
double c_re = MinRe + x*Re_factor;
double Z_re = c_re, Z_im = c_im;
unsigned char isInside = TRUE;
for(unsigned n=0; n<MaxIterations; ++n)
{
double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
if(Z_re2 + Z_im2 > 4)
{
isInside = FALSE;
break;
}
Z_im = 2*Z_re*Z_im + c_im;
Z_re = Z_re2 - Z_im2 + c_re;
}
if(isInside) { Tft_DrawPixel(y, x + OFFSET); }
double Z_re = c_re, Z_im = c_im;
unsigned char isInside = TRUE;
for(unsigned n=0; n<MaxIterations; ++n)
{
double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
if(Z_re2 + Z_im2 > 4)
{
isInside = FALSE;
break;
}
Z_im = 2*Z_re*Z_im + c_im;
Z_re = Z_re2 - Z_im2 + c_re;
}
if(isInside) { Tft_DrawPixel(y, x + OFFSET); }
}
/**
* @brief Draws the Mandelbrot set in slices of at most TIME_BUDGET_MS per call,
* continues at the last pixel on the next call. A finished image is
* cleared row by row before it is drawn again.
*/
void TaskMandelbrot (void)
{
Debug_Set(mandelbrot);
Tft_DrawString(10, 18+5*24, "ManBr ");
MandelBrot();
Debug_Unset(mandelbrot);
static BOOL initDone = FALSE;
uint32_t start = Tick_GetMs();
if (!initDone)
{
Tft_DrawString(10, 18+5*24, "ManBr ");
initDone = TRUE;
}
while (Tick_GetMs() - start < TIME_BUDGET_MS)
{
if (clearing)
{
Tft_ClearArea(0, curX + OFFSET, ImageHeight, 1);
if (++curX >= ImageWidth)
{
curX = 0;
clearing = FALSE;
// the image area overlaps the lower part of the label
Tft_DrawString(10, 18+5*24, "ManBr ");
}
}
else
{
MandelBrotPixel(curX, curY);
if (++curX >= ImageWidth)
{
curX = 0;
if (++curY >= ImageHeight)
{
curY = 0;
clearing = TRUE;
}
}
}
}
}

View file

@ -10,13 +10,39 @@
#include "BSP/TftDisplay.h"
#include "BSP/Adc.h"
#include "StdDef.h"
#include "TaskPoti.h"
#include "Debug.h"
#include <stdio.h>
#include <stdlib.h>
#define MAX_ADC_TIMEOUT 5
#define MAX_LEN 14
#define POTI_THRESHOLD_MV 10
static char tmpBuf[MAX_LEN];
/**
* @brief Prints the potentiometer voltage in mV, redraws only on a change > POTI_THRESHOLD_MV
*/
void TaskPoti (void)
{
Debug_Set(poti);
Tft_DrawString(10, 18+4*24, "Poti ");
Debug_Unset(poti);
static BOOL initDone = FALSE;
static int32_t lastValue = 0;
int32_t potiValue = Adc_GetValue(MAX_ADC_TIMEOUT);
if (!initDone)
{
Tft_DrawString(10, 18+4*24, "Poti ");
}
if (!initDone || abs(potiValue - lastValue) > POTI_THRESHOLD_MV)
{
snprintf(tmpBuf, MAX_LEN, "%4d", potiValue);
Tft_DrawString(10 + 16*7, 18+4*24, tmpBuf);
lastValue = potiValue;
}
initDone = TRUE;
}

View file

@ -1,22 +1,44 @@
/**
******************************************************************************
* @file TaskWatch.c
* @author Josef Langer
* @version V1.1
* @date 07.10.2022
* @brief Task Watch, prints the operating time on the display (hh:mm:ss)
******************************************************************************
*/
#include "BSP/TftDisplay.h"
#include "StdDef.h"
#include "TaskWatch.h"
#include "Debug.h"
void TaskWatch (void)
{
Debug_Set(watch);
Tft_DrawString(10, 18+3*24, "Watch ");
Debug_Unset(watch);
}
/**
******************************************************************************
* @file TaskWatch.c
* @author Josef Langer
* @version V1.1
* @date 07.10.2022
* @brief Task Watch, prints the operating time on the display (mm:ss)
******************************************************************************
*/
#include "BSP/TftDisplay.h"
#include "BSP/systick.h"
#include "StdDef.h"
#include "TaskWatch.h"
#include "Debug.h"
#include <stdio.h>
#define MAX_LEN 14 // Maximale Anzahl Zeichen pro Zeile
/**
* @brief Prints the operating time as mm:ss, redraws only when the second changes
*/
void TaskWatch (void)
{
static char tmpBuf[MAX_LEN];
static BOOL initDone = FALSE;
static uint32_t lastSeconds = 0;
uint32_t seconds = Tick_GetMs() / 1000u;
if (!initDone)
{
Tft_DrawString(10, 18+3*24, "Watch ");
}
if (!initDone || seconds != lastSeconds)
{
snprintf(tmpBuf, MAX_LEN, "%02u:%02u", seconds / 60u, seconds % 60u);
Tft_DrawString(10 + 16*7, 18+3*24, tmpBuf);
lastSeconds = seconds;
}
initDone = TRUE;
}

View file

@ -21,7 +21,30 @@
#include <stdio.h>
#define PS_SIZE 1024
static char processStack[PS_SIZE] __attribute__((aligned(8)));
static void Superloop(void) __attribute__((noinline, noreturn));
/**
* @brief Switches the thread mode to the process stack and starts the superloop.
* main itself must not use its stack frame after the switch, because
* that frame was created on the main stack.
*/
int main(void)
{
__set_PSP((uint32_t)processStack + PS_SIZE);
__set_CONTROL(2);
__ISB();
Superloop();
}
/**
* @brief Initialization and superloop, runs on the process stack
*/
static void Superloop(void)
{
Key_Init();
Led_Init();
@ -30,23 +53,33 @@ int main(void)
Adc_Init(ADC_CHANNEL_POTENTIOMETER);
Tick_InitSysTick();
Debug_Init();
Tft_ClearScreen();
while (1)
{
Tft_ClearScreen();
//measure overhead
Debug_Set(mandelbrot);
Debug_Unset(mandelbrot);
Debug_Set(mandelbrot);
Debug_Unset(mandelbrot);
{
Debug_Set(counter);
TaskCounter();
Debug_Unset(counter);
Debug_Set(key);
TaskKey();
TaskLed();
Debug_Unset(key);
Debug_Set(led);
TaskLed();
Debug_Unset(led);
Debug_Set(watch);
TaskWatch();
TaskPoti();
TaskMandelbrot();
Debug_Unset(watch);
Debug_Set(poti);
TaskPoti();
Debug_Unset(poti);
Debug_Set(mandelbrot);
TaskMandelbrot();
Debug_Unset(mandelbrot);
}
}