Перейти к содержанию
    

Непонятный момент

Не могу понять смысл этих строк:

#define  ABS_WORD(x)  (*((volatile word*)x))

INLINE inline TStackItem* GetDataSP()   { return reinterpret_cast<TStackItem*>(ABS_WORD(28)); }
INLINE inline TStackItem* GetReturnSP() { return reinterpret_cast<TStackItem*>(SP); }

 

вроде понятно что о SP, но почему 28?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вроде понятно что о SP, но почему 28?
Упоминанаие стека данных и стека возврата наталкивает на мысль, что речь идет о порте для AVR под IAR. IAR использует регистровую пару Y как указатель вершины программного стека для данных. Y состоит из регистров R28:R29, которые отражены на адресное пространство ОЗУ по адресам 28 и 29.

Поскольку реализация ассемблерных вставок в IAR не позволяет связать регистры и имена C(С++)-переменных, такая реализация доступа - наиболее простая и эффективная в данном случае.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Упоминанаие стека данных и стека возврата наталкивает на мысль, что речь идет о порте для AVR под IAR. IAR использует регистровую пару Y как указатель вершины программного стека для данных. Y состоит из регистров R28:R29, которые отражены на адресное пространство ОЗУ по адресам 28 и 29.

Поскольку реализация ассемблерных вставок в IAR не позволяет связать регистры и имена C(С++)-переменных, такая реализация доступа - наиболее простая и эффективная в данном случае.

 

Спасибо, понятно.

Ларчик просто окрывался...

 

Ещё такой вопрос: я правильно понял, что функции GetDataSP/SetDataSP используются только при переключении стеков прерываний (TISRW_SS)?

 

И в какой код компилируются эти функции?

SetDataSP это:

    STS       0x001C,R16     Store direct to data space
    STS       0x001D,R17     Store direct to data space
    RET

 

GetDataSP

    LDS       R16,0x001C     Load direct from data space
    LDS       R17,0x001D     Load direct from data space

 

Можно ли изменить эти функции так:

GetDataSP

    MOV      R16,R28     
    MOV      R17,R29

 

SetDataSP

    MOV      R28,R16
    MOV      R29,R17
    RET

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё вопрос: в документации и в исходниках упомянуты функции LockSystemTimer/ГтLockSystemTimer и макросы LOCK_SYSTEM_TIMER/UNLOCK_SYSTEM_TIMER. Искал где они используются, но не нашёл.

Так они нужны или нет? И зачем их можно применить, если они нужны?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...