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

 
 
> Не могу решить проблему вызова функций IAR, используется 1 раз, но вызывается call
haker_fox
сообщение Oct 26 2005, 23:29
Сообщение #1


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Здравствуйте! Моя программа состоит из нескольких модулей. Есть главный модуль main.c, в нем для инициализации различных частей программы вызываются функции из других модулей. Причем эти функции используются однократно, при запуске программы. Уровень оптимизации стоит максимальный и по размеру кода. Просмотрев дизассемблированный текст, я увидел, что эти функции вызываются с помощью rcall. Нельзя ли что-нибудь настроить, чтоб тело этих функции помещалось на место команды rcall, т.е. чтобы они не вызывались (ведь больше они не где не используются), таким образом экономим память (оптимизация то по размеру).

В общем мой вопрос так звучит: как сделать, чтоб однократно используемые функции не вызывались, а их тело помещалось вместо вызова подпрограммы.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
haker_fox
сообщение Oct 28 2005, 14:29
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Но если разместить функции в одном модуле, то пропадет наглядность программы, видимо надо чихнуть на этот "беспредел" компилятора.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
starter48
сообщение Oct 28 2005, 14:41
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(haker_fox @ Oct 28 2005, 21:29)
Но если разместить функции в одном модуле, то пропадет наглядность программы, видимо надо чихнуть на этот "беспредел" компилятора.
*

Можешь модуль разбить на несколько с помощью #include smile.gif
Вообще это свойство компилятора. Ф-ии для работающие вместе должны объединяться в модулях. Если есть ф-я, которую нужно инлайнить в нескольких модулях , то объяви её static и запихни в подключенный в эти моули .h файл.
Т.о. модули компилируются отдельно, при этом компилятор ничего не знает о ф-ях в других модулях, кроме прототипов. И только потом линкером сгенерированный из модулей код объединяется.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 28 2005, 15:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(starter48 @ Oct 28 2005, 22:41)
Можешь модуль разбить на несколько с помощью #include smile.gif
Вообще это свойство компилятора. Ф-ии для работающие вместе должны объединяться в модулях. Если есть ф-я, которую нужно инлайнить в нескольких модулях , то объяви её static и запихни в подключенный в эти моули .h файл.
Т.о. модули компилируются отдельно, при этом компилятор ничего не знает о ф-ях в других модулях, кроме прототипов. И только потом линкером сгенерированный из модулей код объединяется.


Компилятор то знает все обо всех функциях, на то он и компилятор. Другое дело, что он не подставляет тело функции из одного модуля, в тело функции из другого. Но если написать тело в .h файл, возможно это и прокатит.
Но тут такая белиберда получится, что ой-ой.

Допустим в модуле объявлена глобальная переменная, а нужная нам инлайн-функция должна работать с этой пременной. Как этой функции, которая описанна в хедере, рассказать что в одноименном модуле для него приготовленна переменная. Писать еще одну функцию в модуле, которая будет возвращать значение переменной инлайн-функции?


--------------------
Go to the top of the page
 
+Quote Post
starter48
сообщение Oct 28 2005, 15:52
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(prottoss @ Oct 28 2005, 22:15)
Компилятор то знает все обо всех функциях, на то он и компилятор. Другое дело, что он не подставляет тело функции из одного модуля, в тело функции из другого.
*

Нет, компилятор знает только прототип ф-ии из .h для внешнего модуля, но не тело ф-ии. Исходя из прототипа производится проверка числа и типов аргументов, а в объектный файл ставится rcall без адреса. Реальный адрес проставляется линкером на этапе линковки.

Цитата(prottoss @ Oct 28 2005, 22:15)
Но если написать тело в .h файл, возможно это и прокатит.
Но тут такая белиберда получится, что ой-ой.
Допустим в модуле объявлена глобальная переменная, а нужная нам инлайн-функция должна работать с этой пременной. Как этой функции, которая описанна в хедере, рассказать что в одноименном модуле для него приготовленна переменная. Писать еще одну функцию в модуле, которая будет возвращать значение переменной инлайн-функции?
*


Нужно объявить переменную как extern в .h файле с функцией.
Т.е. в основном модуле пишем:
Код
#include"submodule.h"

int myvar;

void main (void)
{
 myfunc();
}

а в submodule.h пишем:
Код
#ifndef __submodule_h
#define __submodule_h

extern int myvar;

static void myfunc (void)
{
..... здесь используем myvar
}

#endif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 28 2005, 16:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(starter48 @ Oct 28 2005, 23:52)
Нужно объявить переменную как extern в .h файле с функцией.


Тогда объясните зачем вообще нужны отдельные модули, раз уж на то пошло.
Давайте будем писать все в одном модуле, чтоб все все знали обо всех :-)


--------------------
Go to the top of the page
 
+Quote Post
starter48
сообщение Oct 28 2005, 16:39
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(prottoss @ Oct 28 2005, 23:12)
Тогда объясните зачем вообще нужны отдельные модули, раз уж на то пошло.

1) Проще разбираться в исходниках, когда программа разбита на идеологически законченные блоки.
2) К программе можно прилинковать модуль написанный на другом языке.
3) Каждый модуль можно скомпилировать со своими настройками компилятора.
4) Программа быстрее перекомпилируется, т.к. компилятор компилирует только изменившиеся модули.
Цитата(prottoss @ Oct 28 2005, 23:12)
Давайте будем писать все в одном модуле, чтоб все все знали обо всех :-)
*

Да, если проект не очень большой, то так обычно и делается.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 28 2005, 16:53
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(starter48 @ Oct 29 2005, 00:39)
1) Проще разбираться в исходниках, когда программа разбита на идеологически законченные блоки.
2) К программе можно прилинковать модуль написанный на другом языке.
3) Каждый модуль можно скомпилировать со своими настройками компилятора.
4) Программа быстрее перекомпилируется, т.к. компилятор компилирует только изменившиеся модули.


К этому Вы забыли еще добавить
5) разграничение пространства имен.


--------------------
Go to the top of the page
 
+Quote Post
starter48
сообщение Oct 28 2005, 17:11
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(prottoss @ Oct 28 2005, 23:53)
Цитата(starter48 @ Oct 29 2005, 00:39)
1) Проще разбираться в исходниках, когда программа разбита на идеологически законченные блоки.
2) К программе можно прилинковать модуль написанный на другом языке.
3) Каждый модуль можно скомпилировать со своими настройками компилятора.
4) Программа быстрее перекомпилируется, т.к. компилятор компилирует только изменившиеся модули.


К этому Вы забыли еще добавить
5) разграничение пространства имен.
*


Да, причём, это можно поставить на первое место.
Зачем спрашивал, если сам всё знаешь? smile.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 28 2005, 18:59
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(starter48 @ Oct 29 2005, 01:11)
Зачем спрашивал, если сам всё знаешь? smile.gif


Цитата(starter48 @ Oct 28 2005 @ 23:52)
Нужно объявить переменную как extern в .h файле с функцией.


Где ж тут разграничение пространства имен? Если глобальные переменные одного модуля известны всем модулям?


--------------------
Go to the top of the page
 
+Quote Post
starter48
сообщение Oct 28 2005, 19:29
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(prottoss @ Oct 29 2005, 01:59)
Цитата(starter48 @ Oct 29 2005, 01:11)
Зачем спрашивал, если сам всё знаешь? smile.gif


Цитата(starter48 @ Oct 28 2005 @ 23:52)
Нужно объявить переменную как extern в .h файле с функцией.


Где ж тут разграничение пространства имен? Если глобальные переменные одного модуля известны всем модулям?
*


А как ты собрался инлайнить ф-ю одного модуля в другой, если эта ф-я использует статические переменные в другом модуле?
Переменные, которые ты собрался использовать во встраиваемых ф-ях нужно сделать видимыми для всех, т.к. статическую переменную оптимизатор может просто выкинуть.
При инлайне код ф-ии встраивается в код соответствующего модуля, значит, и доступ к используемым в этой ф-ии переменным из этого модуля должен быть.
Разграничение пр-ва имён будет действовать на те переменные и ф-ии, которые объявлены со словом static. Вообще, все переменные и ф-ии, которые не используются в других модулях следует объявлять как static, т.к. это развязывает руки компилятору для оптимизации.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- haker_fox   Не могу решить проблему вызова функций IAR   Oct 26 2005, 23:29
- - prottoss   Цитата(haker_fox @ Oct 27 2005, 07:29)В общем...   Oct 26 2005, 23:39
- - haker_fox   ЦитатаВообще для этого в IAR (не знаю как в других...   Oct 26 2005, 23:58
|- - prottoss   Цитата(haker_fox @ Oct 27 2005, 07:58)А нельз...   Oct 27 2005, 00:36
- - haker_fox   2prottoss: спасибо! Я поставля эти директивы в...   Oct 27 2005, 00:56
- - starter48   Цитата(haker_fox @ Oct 27 2005, 06:29)В общем...   Oct 28 2005, 10:55
|- - prottoss   Цитата(starter48 @ Oct 29 2005, 03:29)А как т...   Oct 29 2005, 19:27
- - _artem_   Po moemu C99 podderzivaet inline keyword . No IAR ...   Oct 29 2005, 19:43
- - halfdoom   Цитата(haker_fox @ Oct 27 2005, 02:29)Моя про...   Oct 31 2005, 10:40
- - Balaganov   Цитата(halfdoom @ Oct 31 2005, 13:40) Цит...   Nov 26 2005, 11:38
- - zltigo   Цитата(Balaganov @ Nov 26 2005, 13:38) Ес...   Nov 26 2005, 22:26
- - Balaganov   Цитата(zltigo @ Nov 27 2005, 01:26) Цитат...   Nov 27 2005, 22:48


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

 


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


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