Читайте также:
|
|
В C, функция должна быть объявлена для компилятора, чтобы знать, как её вызвать. Объявление может быть сделано следующим образом:
int a_function (intfirst, char * second);
Это означает, что функция берет два параметра: целое число (first) и указатель на символ (second). Функция возвращает значение, целое число.
В общем случае, это единственное что известно компилятору относительно функции. Поэтому, должно способствовать выводу соглашения о вызовах из этой информации.
C и C++ написания
В C++, функция может иметь C или C++ написание. Только функции, написанные на C, могут быть осуществлены на ассемблере.
Далее приведен пример объявления функции на C:
extern "C"
{
int f(int);
}
Часто практически совместно использовать файлы заголовка между C и C++. Следующий пример показывает объявление функции написанной на C в C и C++:
#ifdef __cplusplus
extern "C"
{
#endif
int f(int);
#ifdef __cplusplus
}
#endif
Сохранение рабочих регистров
AVR регистры CPU разделены на три отдельных части, которые описаны в этой главе.
Рабочие регистры
Любая функция может изменять содержание рабочего регистра. Если функция нуждается в значение регистра после вызова другой функции, оно должно сохраняться в течение этого вызова, например в стеке.
Для обоих соглашений о вызовах, следующие 14 регистров могут использоваться как рабочие регистры функций:
R0-R3, R16-R23, и R30-R31
Сохраняемые регистры
Сохраняемые регистры наоборот сохраняются вопреки вызовам функций. Любая функция может использовать сохраняемый регистр в своих целях, но должна сохранить прежнее значение до использования и восстанавливать его при выходе функции.
Для обоих соглашений о вызовах, следующие сохраняемые регистры используются:
R4-R15 и R24-R27
Обратите внимание, что регистраторы R4-R15 могут быть блокированы из командной строки, и использоваться для глобальных регистровых переменных; см. -lock_regs и __regvar.
Специальные регистраторы
Для некоторых регистраторов имеются некоторые предпосылки, которые вы должны рассмотреть:
· указатель вершины стека регистр Y должен всегда указывать на последний элемент стека. В случае прерывания, все ниже точки, на который указывает указатель стека, будет разрушено.
· При использовании -v4 или -v6 опции процессора, регистр RAMPY - указатель на часть стека данных.
· При использовании опции процессора, которая использует любой из регистров EIND, RAMPX, или RAMPZ, эти регистры работают как рабочие регистры.
Дата добавления: 2014-12-19; просмотров: 96 | Поможем написать вашу работу | Нарушение авторских прав |