Это очевидное переполнение стека. S08 - невероятно ограниченный по ресурсам 8-битный MCU. Это не ПК. У него нет FPU. Это означает, что вы не можете и не должны использовать арифметику с плавающей запятой, когда-либо . Период. И вообще избегайте использования 32-битной арифметики.
Что происходит, когда вы запускаете math.h, так это то, что Codewarrior внедряет бесполезную программную библиотеку с плавающей запятой, полностью убивая всю доступную память и ресурсы ЦП во всем MCU, поворачиваяваша программа в бесполезном беспорядке. Одного log
вызова было достаточно для уничтожения стека. Я не удивлен, у вас есть 100-200 байтов стека на дефолт. И когда это происходит, стек переполняется в области памяти .data
/ .bss
, в которых хранятся переменные x
и Temp
, уничтожая их во время записи бессмысленных в этих областях.
Если вы на самом деле нужно , чтобы использовать вычисления с плавающей запятой, тогда вам не повезло, вы выбрали неправильный MCU. Нужно было выбрать Cortex M4.
Кроме того, вы всегда должны размещать стек так, чтобы он рос (это SP с понижающим счетом) в безопасных областях памяти, а не в разделах .data
/ .bss
. ,Почему Codewarrior не делает этого по умолчанию, очень странно. Превращение стека в карту регистров также не является идеальным, но в случае, если вы не используете все периферийные устройства таймера около 0x70, это, по крайней мере, менее плохой сценарий, чем повреждение всех переменных в программе.