|
|
  |
CAVR выкидывает цикл задержки, что не так? |
|
|
|
Mar 16 2017, 09:15
|
Знающий
   
Группа: Свой
Сообщений: 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); и забыть, но у меня задача разобраться.
--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
|
|
|
|
|
Mar 16 2017, 09:21
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 16 2017, 09:41
|
Знающий
   
Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894

|
Цитата(Сергей Борщ @ Mar 16 2017, 12:21)  Код void main(void) { start_delay (); ... } А чем это отличается от delay_ms( ); Не понял про "джентельменов"
--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
|
|
|
|
|
Mar 16 2017, 10:27
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(ikm @ Mar 16 2017, 11:41)  Не понял про "джентельменов" Если Вы написали функцию без "required"-аттрибута Вы обязались ее использовать, но этого не делаете. Цитата(ikm @ Mar 16 2017, 11:41)  А чем это отличается от delay_ms( ); delay_ms - библиотечная? Тогда у компилятора не может быть никаких претензий.
|
|
|
|
|
Mar 16 2017, 11:03
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 16 2017, 11:21
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата Хочу сделать задержку на старте : Родовой 'баг' любого компилятора в том, что он делает код для того, что програмист написал, а не для того, о чем он думал. Может вы и хотели сделать 'задержку на старте', но вы ее не сделали. Вы только подготовились к этому действу, написав функцию. Теперь неплохо было бы ее вызвать - сам компилятор этого делать не будет Если вы хотите обеспечить автоматическую задержку всегда, не пиша ее вызов явно, то вам надо изучать возможности неявного вызова вашей функции до main.
|
|
|
|
|
Mar 16 2017, 11:25
|
Знающий
   
Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894

|
Цитата(aiwa @ Mar 16 2017, 13:27)  Если Вы написали функцию без "required"-аттрибута Вы обязались ее использовать, но этого не делаете.
delay_ms - библиотечная? Тогда у компилятора не может быть никаких претензий. delay_ms конечно библиотечная, к ней вопросов нет. Она успешно используется в теле цикла main. Только сейчас сложил ваш ответ и предыдущий и понял. Что я создал функцию strart_delay () и должен был использовать её в теле самого main. Спасибо за разъяснения. Тогда вопрос, это обязательное условие для компилятора и я должен при использовании какой либо функции вне main включать её внутрь?
--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
|
|
|
|
|
Mar 16 2017, 11:48
|
Знающий
   
Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894

|
Цитата(XVR @ Mar 16 2017, 14:37)  У вас похоже смешались понятия описания функции и ее вызова. Само описание функции (а это именно то, что вы и сделали) не выполняет ее тела. команды внутри тела функции выполняются только когда вы ее вызываете. И происходить это может не обязательно внутри main, но и внутри любой другой функции (но в этом случае эту 'любую другую функцию' тоже должен кто то позвать). В конце концов все растет от main (в С++ есть и другие корни, откуда может расти, но про это пока не будем  ) У меня как раз не правильное представление было вообще о порядке обработке компилятором написаного кода. Я понимаю,что я могу описывать любую функцию в любом месте, даже в отдельном файле и потом вставить в main. Но не понимал,что компилятор обрабатывает только main, и смотрит если эта функция там не используется, то он её не выполняет. Хотя может и это представление не до конца верно. И всё таки вопрос (для общего образования) можно ли исполнять функции вне тела main, или это всё глупости, и надо просто писать последовательность вызова функций в самом main и морочить голову?
--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
|
|
|
|
|
Mar 16 2017, 13:42
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата И всё таки вопрос (для общего образования) можно ли исполнять функции вне тела main Что бы исполнить функцию, нужно выполнить ее вызов (написать ее имя с круглыми скобками после него, ну и возможно с параметрами в скобках). Вызов сам по себе является исполняемым кодом, и должен быть вставлен где то, где допустим исполняемый код. В С такое место одно - тело какой либо функции. Таким образом функции могут вызываться только из других функций. Очевидно, что должна существовать точка, от которой все будет расти - это и есть функция main. Т.е. ответ - в С функции могут исполняться только внутри тела другой функции (не обязательно main), но не на глобальном уровне. В С++ есть еще одно место, где допустим исполняемый код - инициализация переменных. Т.е. в С++ функцию можно вызвать так: Код int start_delay() { ... }
int some_unused_var = start_delay();
...
void main() { ... } Или с помощью классов, но это не интересно (так как тривиально)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|