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

 
 
> антипод модификатора __raw
ArtemKAD
сообщение Jun 22 2007, 11:12
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Появилась тут мысля. У IAR-а для не сохранения контекста в прерывании служит __raw. А есть ли его "антипод" - модификатор заставляющий IAR сохранить контекст некоторой функции (не прерывания) в стеке? help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ArtemKAD
сообщение Jun 25 2007, 07:03
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
он ведь не знает, какие из них используются вызываемой функции,

Не понял, а кому кроме него знать как он распределит регистры для этой функции? Не я же их распределяю...
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 25 2007, 08:18
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ArtemKAD @ Jun 25 2007, 14:03) *
Не понял, а кому кроме него знать как он распределит регистры для этой функции? Не я же их распределяю...

А как же принцип раздельной компиляции? Функция-то может вообще в библиотеке лежать, и компилятор к ней доступа не имеет - ее потом уже линкер подлинкует. Компилятор обрабатывает один текущий файл и видит только код этого файла. Если используется встраиваемая фукнция, т.е. тело которой непосредственно встраивается в точку вызова, то тут да, комплятор все видит и сохраняет только то, что используется. А если фукнция вызываемая, то тут он не видит конкретного кода этой вызываемой фуникции, не знает, какие конкретно регистры в ней используются, поэтому сохраняет весь набор scratch регистров. Это для него единственный способ обеспечить целостность программы. Вывод: для эффективности не использовать вызовов функции в ISR либо использовать только встраиваемые фукнции. Для пущей уверенности - чтобы компилятор точно встроил тело функции (иногда он "умничает" и делает вызов), использовать для этой функции прагму принудительного встраивания (#pragma inline=forced).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 25 2007, 09:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(dxp @ Jun 25 2007, 11:18) *
... А если фукнция вызываемая, то тут он не видит конкретного кода этой вызываемой фуникции, не знает, какие конкретно регистры в ней используются, поэтому сохраняет весь набор scratch регистров. ...

Что-то я не все понимаю. Компиляция раздельная - понимаю, но сохранение регистров ведь в части компиляции, когда сама функция компилируется, а не вызов ее. Или?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 25 2007, 13:02
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Dog Pawlowa @ Jun 25 2007, 16:05) *
Что-то я не все понимаю. Компиляция раздельная - понимаю, но сохранение регистров ведь в части компиляции, когда сама функция компилируется, а не вызов ее. Или?

Представьте, что вы компилятор. У вас есть соглашения о сохраняемых регистрах - конкретно у EWAVR примерно половина регистров при вызове фукнции предоставляется в использование вызываемой фукнции без сохранения - бери и юзай, как хошь, в этих регистрах вызывающая функция ничего не хранит - это так называемые scratch регистры, а вторая половина регистров, если вызываемая фукнция "хочет" их поиспользовать, должна быть сохранена - это так называемые local или preserved регистры.

Вот вам предлагается сгенерить код для ISR. В этом коде присутствует вызов функции. Вы на него генерируете инструкцию call. НО! Поскольку ISR - это не обычная функция и получает управление асинхронно по отношению к потоку управления остальной программы, то в нем должны быть сохранены ВСЕ регистры, которые могут быть использованы. Здесь про local регистры нам волноваться не надо - если вызываемаая фукнция (потроха которой мы не видим) будет их использовать - она сама их сохранит, столько, сколько ей надо. Но вот scratch регистры она сохранять не будет (по вышеописанному соглашению). Поэтому мы просто обязаны их сохранить сами. Поскольку мы не знаем, какие именно регистры вызываемая фукнция будет использовать, мы должны сохранить их все. Отсюда и неэффективность. Если же фукнцию сделать встраиваемой, т.е. когда ее тело видно нам на момент кодогенерации, то мы, видя, что в ней используется, сохраняем только используемые регистры. Все логично.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post



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

 


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


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