реклама на сайте
подробности

 
 
 
Closed TopicStart new topic
> CAVR выкидывает цикл задержки, что не так?
ikm
сообщение Mar 16 2017, 09:15
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



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


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 16 2017, 09:21
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ikm @ Mar 16 2017, 11:15) *
unused function 'start_delay'
"У нас принято джентельменам верить на слово".

Попробуйте так:
CODE
void main(void)
{
    start_delay ();
    ...
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
aiwa
сообщение Mar 16 2017, 09:28
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



del

Сообщение отредактировал aiwa - Mar 16 2017, 09:29
Go to the top of the page
 
+Quote Post
ikm
сообщение Mar 16 2017, 09:41
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



Цитата(Сергей Борщ @ Mar 16 2017, 12:21) *
Код
void main(void)
{
    start_delay ();
    ...
}



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



--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
aiwa
сообщение Mar 16 2017, 10:27
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



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

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

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

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

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 16 2017, 11:03
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 16 2017, 11:21
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

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

Если вы хотите обеспечить автоматическую задержку всегда, не пиша ее вызов явно, то вам надо изучать возможности неявного вызова вашей функции до main.
Go to the top of the page
 
+Quote Post
ikm
сообщение Mar 16 2017, 11:25
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



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

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


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

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

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




--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 16 2017, 11:37
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Тогда вопрос, это обязательное условие для компилятора и я должен при использовании какой либо функции вне main включать её внутрь?
У вас похоже смешались понятия описания функции и ее вызова. Само описание функции (а это именно то, что вы и сделали) не выполняет ее тела. команды внутри тела функции выполняются только когда вы ее вызываете. И происходить это может не обязательно внутри main, но и внутри любой другой функции (но в этом случае эту 'любую другую функцию' тоже должен кто то позвать). В конце концов все растет от main (в С++ есть и другие корни, откуда может расти, но про это пока не будем sm.gif )
Go to the top of the page
 
+Quote Post
ikm
сообщение Mar 16 2017, 11:48
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



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

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


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 16 2017, 13:42
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

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

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

int some_unused_var = start_delay();

...

void main()
{
...
}
Или с помощью классов, но это не интересно (так как тривиально) rolleyes.gif
Go to the top of the page
 
+Quote Post
ikm
сообщение Mar 16 2017, 14:36
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894





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




--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post

Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016