Артём__ 0 31 декабря, 2011 Опубликовано 31 декабря, 2011 · Жалоба Не могу понять смысл этих строк: #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? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 2 января, 2012 Опубликовано 2 января, 2012 · Жалоба вроде понятно что о SP, но почему 28?Упоминанаие стека данных и стека возврата наталкивает на мысль, что речь идет о порте для AVR под IAR. IAR использует регистровую пару Y как указатель вершины программного стека для данных. Y состоит из регистров R28:R29, которые отражены на адресное пространство ОЗУ по адресам 28 и 29. Поскольку реализация ассемблерных вставок в IAR не позволяет связать регистры и имена C(С++)-переменных, такая реализация доступа - наиболее простая и эффективная в данном случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 3 января, 2012 Опубликовано 3 января, 2012 · Жалоба Упоминанаие стека данных и стека возврата наталкивает на мысль, что речь идет о порте для 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 12 января, 2012 Опубликовано 12 января, 2012 · Жалоба Ещё вопрос: в документации и в исходниках упомянуты функции LockSystemTimer/ГтLockSystemTimer и макросы LOCK_SYSTEM_TIMER/UNLOCK_SYSTEM_TIMER. Искал где они используются, но не нашёл. Так они нужны или нет? И зачем их можно применить, если они нужны? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться