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

 
 
> GCC - inline не работает
EugeNNe
сообщение Jun 8 2009, 11:29
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997



GCC. Определяю функцию:

static inline void Reset(void) __attribute__((always_inline));

Ну не хочет ГЦЦ фукцию как inline делать. В чём может быть проблема?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
EugeNNe
сообщение Jun 9 2009, 05:02
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997



Пожалуста код:

static inline void Reset(void) __attribute__((always_inline));

Reset()
{
PORTD &=~(1<<PD7);
_delay_loop_2(1843);
PORTD |=(1<<PD7);
asm volatile ("jmp 0");
}
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Jun 9 2009, 06:12
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



Цитата(BigBolt @ Jun 9 2009, 09:02) *
Пожалуста код:

Имхо не надо разделять прототип и реализацию. Сделайте вот так:
Код
static inline void  Reset(void) __attribute__((always_inline))
{              
      PORTD &=~(1<<PD7);        
      _delay_loop_2(1843);      
      PORTD |=(1<<PD7);          
      asm volatile ("jmp 0");    
}

А еще лучше сделать так:
Код
inline extern void  Reset(void)
{
    // ....
}

Тогда функция будет инлайнится всегда, при любом уровне оптимизации (конечно, если вы захотите вызвать ее по указателю - то будет создан экземпляр)
Go to the top of the page
 
+Quote Post
EugeNNe
сообщение Jun 9 2009, 06:34
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997



Цитата(Alex B._ @ Jun 9 2009, 10:12) *
Имхо не надо разделять прототип и реализацию. Сделайте вот так:
Код
static inline void  Reset(void) __attribute__((always_inline))
{              
      PORTD &=~(1<<PD7);        
      _delay_loop_2(1843);      
      PORTD |=(1<<PD7);          
      asm volatile ("jmp 0");    
}

А еще лучше сделать так:
Код
inline extern void  Reset(void)
{
    // ....
}

Тогда функция будет инлайнится всегда, при любом уровне оптимизации (конечно, если вы захотите вызвать ее по указателю - то будет создан экземпляр)


Всё заработало. Посмотрел как сделана библиотека delay.h. Действительно прототип и реализация в одном месте. У меня же прототип был в хидере, а реализация в сишном файле. Запихал всё в один файл и заработало...
Вы же подтвердили что так и надо делать... В доке ничего не сказано такого
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- BigBolt   GCC - inline не работает   Jun 8 2009, 11:29
- - AHTOXA   Судя по названию (Reset), возможно, где-то использ...   Jun 8 2009, 11:32
|- - BigBolt   Цитата(AHTOXA @ Jun 8 2009, 15:32) Судя п...   Jun 8 2009, 11:58
- - Сергей Борщ   Цитата(BigBolt @ Jun 8 2009, 14:29) В чём...   Jun 8 2009, 12:21
- - aesok   Цитата(BigBolt @ Jun 8 2009, 15:29) GCC. ...   Jun 8 2009, 13:32
- - ARV   а вот хотел спросить, какую роль играет, если игра...   Jun 8 2009, 14:48
|- - demiurg_spb   На мой взгляд атрибут лучше приписывать поближе к ...   Jun 8 2009, 16:16
|- - klen   чтото мне кажется что не любой код функции зайнлан...   Jun 8 2009, 20:19
|- - Сергей Борщ   Цитата(BigBolt @ Jun 9 2009, 09:34) У мен...   Jun 9 2009, 08:15
|- - Tiro   Цитата(BigBolt @ Jun 9 2009, 09:34) Всё з...   Jun 9 2009, 10:16
- - forever failure   Должно всё инлайнится. У меня таких функций пруд-п...   Jun 9 2009, 05:36
- - ARV   и все-таки, есть разница между ... __attribute__...   Jun 9 2009, 09:40


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:13
Рейтинг@Mail.ru


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