Folgendes mir unerklärliche Verhalten:
Cross-Compiler: 2011.03 / 2011.09 und 2012.03 Versionen von Sourcery
Codebench Lite.
Library: Newlib C Library (1.18.0-sg++) (stdlib.h) aus der Suite
Sourcery CodeBench Lite.
Verhalten: sobald die Funktion "strtoull" im Programmcode eingebaut wird
ist die Baudrate von USART1 vervierfacht. Keine Fehlermeldungen, keine
Warnmeldungen beim compilieren, Programm läuft, Debugger läuft, evtl.
geht das Programm manchmal in den HardFault_Handler interrupt.
Das selbe Verhalten tritt auf sobald folgendes irgendwo in das Programm
eingebaut wird (also unabhängig davon ob dies auch ausgeführt wird):
1 | long long test1 = 10, test2 = 4, test3;
|
2 | test3 = test1 / test2;
|
Vermute, dass "strtoull" ebenfalls eine 64-bit Division enthält. Die
64-Bit Division führt in jedem Falle zu dem Fehlverhalten.
Erhebliche Vergrößerung des Stacks erbringt keinerlei Veränderung des
Verhaltens, selbst das Ergebnis der Division scheint korrekt (keine
ausgiebigen Versuche, da eine Division dieser Art nicht benötigt wird).
Manual "Using the GNU Compiler Collection, chapter 6.9" sagt aus, dass:
"(long long) divisions are open coded and are available only on machines
providing special support."
Die Frage ist:
Was passiert da? Schließlich ist die Baudrate unabhängig vom erzeugten
Code und lediglich ein Wert in einem CPU-Register.
Erklärungen?