Перейти к содержанию
    

CAVR выкидывает цикл задержки

Хочу сделать задержку на старте :

#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); и забыть, но у меня задача разобраться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

unused function 'start_delay'
"У нас принято джентельменам верить на слово".

 

Попробуйте так:

void main(void)
{
    start_delay ();
    ...
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void main(void)
{
    start_delay ();
    ...
}

 

 

А чем это отличается от delay_ms( );

Не понял про "джентельменов"

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понял про "джентельменов"

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

 

А чем это отличается от delay_ms( );

delay_ms - библиотечная?

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понял про "джентельменов"
Если компилятор говорит, что вы не используете эту функцию, у меня нет оснований ему не верить. Вы пишете, что хотите сделать задержку, а компилятор говорит, что вы этого не делаете. Я показал, как сделать то, что вы хотите и убрать это сообщение компилятора.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу сделать задержку на старте :

Родовой 'баг' любого компилятора в том, что он делает код для того, что програмист написал, а не для того, о чем он думал.

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

 

Если вы хотите обеспечить автоматическую задержку всегда, не пиша ее вызов явно, то вам надо изучать возможности неявного вызова вашей функции до main.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

delay_ms - библиотечная?

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

 

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

 

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

Спасибо за разъяснения.

 

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда вопрос, это обязательное условие для компилятора и я должен при использовании какой либо функции вне main включать её внутрь?
У вас похоже смешались понятия описания функции и ее вызова. Само описание функции (а это именно то, что вы и сделали) не выполняет ее тела. команды внутри тела функции выполняются только когда вы ее вызываете. И происходить это может не обязательно внутри main, но и внутри любой другой функции (но в этом случае эту 'любую другую функцию' тоже должен кто то позвать). В конце концов все растет от main (в С++ есть и другие корни, откуда может расти, но про это пока не будем :) )

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас похоже смешались понятия описания функции и ее вызова. Само описание функции (а это именно то, что вы и сделали) не выполняет ее тела. команды внутри тела функции выполняются только когда вы ее вызываете. И происходить это может не обязательно внутри main, но и внутри любой другой функции (но в этом случае эту 'любую другую функцию' тоже должен кто то позвать). В конце концов все растет от main (в С++ есть и другие корни, откуда может расти, но про это пока не будем :) )

У меня как раз не правильное представление было вообще о порядке обработке компилятором написаного кода. Я понимаю,что я могу описывать любую функцию в любом месте, даже в отдельном файле и потом вставить в main. Но не понимал,что компилятор обрабатывает только main, и смотрит если эта функция там не используется, то он её не выполняет. Хотя может и это представление не до конца верно.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

int start_delay()
{
...
}

int some_unused_var = start_delay();

...

void main()
{
...
}

Или с помощью классов, но это не интересно (так как тривиально) :rolleyes:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...