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

 
 
 
Reply to this topicStart new topic
_Артём_
сообщение Dec 31 2011, 18:50
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Не могу понять смысл этих строк:
Код
#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?
Спасибо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 2 2012, 08:56
Сообщение #2


Гуру
******

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



QUOTE (_Артём_ @ Dec 31 2011, 20:50) *
вроде понятно что о SP, но почему 28?
Упоминанаие стека данных и стека возврата наталкивает на мысль, что речь идет о порте для AVR под IAR. IAR использует регистровую пару Y как указатель вершины программного стека для данных. Y состоит из регистров R28:R29, которые отражены на адресное пространство ОЗУ по адресам 28 и 29.
Поскольку реализация ассемблерных вставок в IAR не позволяет связать регистры и имена C(С++)-переменных, такая реализация доступа - наиболее простая и эффективная в данном случае.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 3 2012, 20:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Сергей Борщ @ Jan 2 2012, 10:56) *
Упоминанаие стека данных и стека возврата наталкивает на мысль, что речь идет о порте для 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



Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 12 2012, 21:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 21:53
Рейтинг@Mail.ru


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