Память программы не увеличивается при включении библиотеки math.h

Я немного новичок в мире Atmel. Когда-то я мог писать и компилировать C с помощью Visual Studio, но немного отвык от практики.

Итак, я пытаюсь понять использование памяти в микроконтроллере ATTINY1616. Я открыл Atmel Studios, создал исполняемый проект на C и выбрал правильный микроконтроллер. Я создаю проект, в котором почти ничего нет, и вижу, что память программы составляет 154 bytes. Это мой базовый уровень.

Теперь я попытался добавить строку #include <math.h>, чтобы посмотреть, увеличится ли использование памяти моей программой. Это не так. Затем я попытался добавить float a = 2.000678f; внутрь main. По-прежнему не увеличивается после создания проекта. Что я здесь неправильно понимаю?

/*
* GccApplication2.c
*
* Created: 12/20/2018 9:21:43 PM
* Author : joely
*/ 

#include <avr/io.h>
#include <math.h>

int main(void)
{ 
    float a = 2.000678f;
    /* Replace with your application code */
    while (1) 
    {
    }
}

person Joe Lyons    schedule 21.12.2018    source источник
comment
Константа, вероятно, была оптимизирована, так как вы никогда не используете ее в своей программе.   -  person DYZ    schedule 21.12.2018
comment
В этих случаях всегда полезно увидеть файл карты, сгенерированный компоновщиком. Здесь вы видите, например, какие функции требуются вашему исполняемому файлу. Он также содержит информацию, если функции или данные были усечены из исполняемого файла, потому что они не используются. И многое другое.   -  person Jonny Schubert    schedule 21.12.2018
comment
Спасибо за комментарии. Наверное, я предполагал, что компилятор найдет для меня место в памяти микроконтроллера. Нужно ли мне делать что-то конкретное, например, чтобы сохранить его в ОЗУ? Кроме того, @ Johnny, я постараюсь найти это, чтобы опубликовать позже сегодня. Спасибо.   -  person Joe Lyons    schedule 21.12.2018


Ответы (2)


Файлы заголовков обычно содержат только объявления функций, а не определения.

Вы не используете ни одну из функций, объявленных в math.h, поэтому библиотека, в которой они находятся, не подключается к вашей программе. Если вы используете один из них, например float b = sin(a), то содержимое математической библиотеки требуется и связано (при условии, что для этого вы передаете -lm в gcc).

person dbush    schedule 21.12.2018
comment
Использование одной подпрограммы из математической библиотеки не обязательно должно ссылаться на «содержимое математической библиотеки». Он должен быть связан с частью математической библиотеки, которая может быть разделена или не разделена на несколько объектных модулей. - person Eric Postpischil; 21.12.2018
comment
Итак, я попробовал это и прошлой ночью, но с float b = atan(a); . Это по-прежнему не увеличило использование памяти программ или использование памяти данных. Я думаю, что сборка проекта - это как-то не компилирующий код, но когда у меня есть опечатки, он выдает ошибки. - person Joe Lyons; 21.12.2018
comment
Также в студиях Atmel, где бы я добавил -lm? Варианты сборки? Благодарю вас! - person Joe Lyons; 21.12.2018

Поэтому, попросив друзей с опытом работы с микроконтроллерами, я нашел решение.

В Atmel Studio вам нужно перейти в Project-->Application Properties--->Toolchain и изменить оптимизацию на none.

Затем он распознает мои числа с плавающей запятой и сохраняет их в памяти программы, а когда atan() используется для выполнения вычисления, он также заполняет пространство тем же кодом выше.

person Joe Lyons    schedule 28.12.2018