|
|
  |
GCC - inline не работает |
|
|
|
Jun 8 2009, 11:58
|
Местный
  
Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997

|
Цитата(AHTOXA @ Jun 8 2009, 15:32)  Судя по названию (Reset), возможно, где-то используется адрес этой функции? Например, в таблице векторов? Ну вообще говоря, эта функция вызывается в прерывании таймера.
|
|
|
|
|
Jun 8 2009, 13:32
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(BigBolt @ Jun 8 2009, 15:29)  GCC. Определяю функцию:
static inline void Reset(void) __attribute__((always_inline)); То что Вы привели не являеться определением функции. Это описание функции. Пожалуйста приведите, для тех у кого отсутствуют телепатические способности, как и каком файле Вы определяете функцию Reset, и как и в каком файле Вы ее используете. Анатолий.
Сообщение отредактировал aesok - Jun 8 2009, 13:33
|
|
|
|
|
Jun 9 2009, 06:12
|

Знающий
   
Группа: Свой
Сообщений: 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) { // .... } Тогда функция будет инлайнится всегда, при любом уровне оптимизации (конечно, если вы захотите вызвать ее по указателю - то будет создан экземпляр)
|
|
|
|
|
Jun 9 2009, 06:34
|
Местный
  
Группа: Участник
Сообщений: 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. Действительно прототип и реализация в одном месте. У меня же прототип был в хидере, а реализация в сишном файле. Запихал всё в один файл и заработало... Вы же подтвердили что так и надо делать... В доке ничего не сказано такого
|
|
|
|
|
Jun 9 2009, 08:15
|

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

|
Цитата(BigBolt @ Jun 9 2009, 09:34)  У меня же прототип был в хидере, а реализация в сишном файле. Запихал всё в один файл и заработало... Вы же подтвердили что так и надо делать... В доке ничего не сказано такого Вот чтобы не плодились очередные мифы, уточню. Компилятор должен знать, что именно инлайнить в точке вызова. То есть к тому моменту, когда он встречает вызов функции, он уже должен был просмотреть определение этой функции. Где он "видел" это определение - в заголовочном файле или в этом же сишном - абсолютно без разницы. Если же тело находится в другом сишном файле - компилятор просто физически не может знать, какой именно код вставлять в точку встраивания. Это настолько очевидно, что даже и мысли не возникало это объяснять, и что кто-то может пытаться делать иначе. То есть если вы функцию используете только в одном с-файле, то ее тело может быть в этом же файле, не обязательно в заголовочном (это полезно в плюсах для функций-членов). Важно, чтобы это тело было доступно в момент встраивания.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|