Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CAVR выкидывает цикл задержки
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
ikm
Хочу сделать задержку на старте :
Код
#define START_DELAY            3        // задержка при старте и паузе, с (max 65535)

void start_delay (void)        // Задержка на старте
    {
    volatile int i = START_DELAY;
        while (i) {delay_ms(1000); i--;}
    }  

void main(void)
{...
}

При компиляции CAVR пишет предупреждение:
unused function 'start_delay' was removed by the linker

Да конечно можно просто поставить delay_ms(3000); и забыть, но у меня задача разобраться.
Сергей Борщ
QUOTE (ikm @ Mar 16 2017, 11:15) *
unused function 'start_delay'
"У нас принято джентельменам верить на слово".

Попробуйте так:
CODE
void main(void)
{
    start_delay ();
    ...
}
aiwa
del
ikm
Цитата(Сергей Борщ @ Mar 16 2017, 12:21) *
Код
void main(void)
{
    start_delay ();
    ...
}



А чем это отличается от delay_ms( );
Не понял про "джентельменов"

aiwa
Цитата(ikm @ Mar 16 2017, 11:41) *
Не понял про "джентельменов"

Если Вы написали функцию без "required"-аттрибута Вы обязались ее использовать, но этого не делаете.

Цитата(ikm @ Mar 16 2017, 11:41) *
А чем это отличается от delay_ms( );

delay_ms - библиотечная?
Тогда у компилятора не может быть никаких претензий.

Сергей Борщ
QUOTE (ikm @ Mar 16 2017, 11:41) *
Не понял про "джентельменов"
Если компилятор говорит, что вы не используете эту функцию, у меня нет оснований ему не верить. Вы пишете, что хотите сделать задержку, а компилятор говорит, что вы этого не делаете. Я показал, как сделать то, что вы хотите и убрать это сообщение компилятора.
XVR
Цитата
Хочу сделать задержку на старте :

Родовой 'баг' любого компилятора в том, что он делает код для того, что програмист написал, а не для того, о чем он думал.
Может вы и хотели сделать 'задержку на старте', но вы ее не сделали. Вы только подготовились к этому действу, написав функцию. Теперь неплохо было бы ее вызвать - сам компилятор этого делать не будет

Если вы хотите обеспечить автоматическую задержку всегда, не пиша ее вызов явно, то вам надо изучать возможности неявного вызова вашей функции до main.
ikm
Цитата(aiwa @ Mar 16 2017, 13:27) *
Если Вы написали функцию без "required"-аттрибута Вы обязались ее использовать, но этого не делаете.

delay_ms - библиотечная?
Тогда у компилятора не может быть никаких претензий.


delay_ms конечно библиотечная, к ней вопросов нет. Она успешно используется в теле цикла main.

Только сейчас сложил ваш ответ и предыдущий и понял. Что я создал функцию strart_delay () и должен был использовать её в теле самого main.
Спасибо за разъяснения.

Тогда вопрос, это обязательное условие для компилятора и я должен при использовании какой либо функции вне main включать её внутрь?


XVR
Цитата
Тогда вопрос, это обязательное условие для компилятора и я должен при использовании какой либо функции вне main включать её внутрь?
У вас похоже смешались понятия описания функции и ее вызова. Само описание функции (а это именно то, что вы и сделали) не выполняет ее тела. команды внутри тела функции выполняются только когда вы ее вызываете. И происходить это может не обязательно внутри main, но и внутри любой другой функции (но в этом случае эту 'любую другую функцию' тоже должен кто то позвать). В конце концов все растет от main (в С++ есть и другие корни, откуда может расти, но про это пока не будем sm.gif )
ikm
Цитата(XVR @ Mar 16 2017, 14:37) *
У вас похоже смешались понятия описания функции и ее вызова. Само описание функции (а это именно то, что вы и сделали) не выполняет ее тела. команды внутри тела функции выполняются только когда вы ее вызываете. И происходить это может не обязательно внутри main, но и внутри любой другой функции (но в этом случае эту 'любую другую функцию' тоже должен кто то позвать). В конце концов все растет от main (в С++ есть и другие корни, откуда может расти, но про это пока не будем sm.gif )

У меня как раз не правильное представление было вообще о порядке обработке компилятором написаного кода. Я понимаю,что я могу описывать любую функцию в любом месте, даже в отдельном файле и потом вставить в main. Но не понимал,что компилятор обрабатывает только main, и смотрит если эта функция там не используется, то он её не выполняет. Хотя может и это представление не до конца верно.
И всё таки вопрос (для общего образования) можно ли исполнять функции вне тела main, или это всё глупости, и надо просто писать последовательность вызова функций в самом main и морочить голову?
XVR
Цитата
И всё таки вопрос (для общего образования) можно ли исполнять функции вне тела main
Что бы исполнить функцию, нужно выполнить ее вызов (написать ее имя с круглыми скобками после него, ну и возможно с параметрами в скобках). Вызов сам по себе является исполняемым кодом, и должен быть вставлен где то, где допустим исполняемый код. В С такое место одно - тело какой либо функции. Таким образом функции могут вызываться только из других функций. Очевидно, что должна существовать точка, от которой все будет расти - это и есть функция main.

Т.е. ответ - в С функции могут исполняться только внутри тела другой функции (не обязательно main), но не на глобальном уровне.

В С++ есть еще одно место, где допустим исполняемый код - инициализация переменных. Т.е. в С++ функцию можно вызвать так:
Код
int start_delay()
{
...
}

int some_unused_var = start_delay();

...

void main()
{
...
}
Или с помощью классов, но это не интересно (так как тривиально) rolleyes.gif
ikm


Спасибо большое Всем за разъяснения.


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.