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

 
 
> как в winavr сделать так чтоб в прерывании вместо push/pop было st/ld, ...
Kibi
сообщение May 20 2008, 07:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 11-03-08
Пользователь №: 35 811



есть проблема с компилятором WinAVR-20071221 в прерываниях он ставит push/pop, в результате стека не хватает, хочу заменить на st/ld, кто знает как это зделать, перейти на iar нет возможности.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
singlskv
сообщение May 20 2008, 08:08
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Kibi @ May 20 2008, 11:06) *
есть проблема с компилятором WinAVR-20071221 в прерываниях он ставит push/pop, в результате стека не хватает, хочу заменить на st/ld, кто знает как это зделать, перейти на iar нет возможности.
Прямо, никак...
Обходными путями можно, только весь контекст придется ручками сохранять, типа:
Код
void TIMER2_COMP_vect(void) __attribute__((signal)) __attribute__((naked));
void TIMER2_COMP_vect()
{
  {сохраняем контекст}

  {восстанавливаем контекст}
  __asm__ __volatile__("reti"); // выходим
}


Только вот непонятен до конца вопрос, как использование st/ld поможет сократить размер
необходимой памяти ?
Go to the top of the page
 
+Quote Post
Kibi
сообщение May 20 2008, 09:50
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 11-03-08
Пользователь №: 35 811



Цитата(singlskv @ May 20 2008, 12:08) *
Прямо, никак...
Обходными путями можно, только весь контекст придется ручками сохранять, типа:
Код
void TIMER2_COMP_vect(void) __attribute__((signal)) __attribute__((naked));
void TIMER2_COMP_vect()
{
  {сохраняем контекст}

  {восстанавливаем контекст}
  __asm__ __volatile__("reti"); // выходим
}


Только вот непонятен до конца вопрос, как использование st/ld поможет сократить размер
необходимой памяти ?


когда сохраняем регистры с помощью st они сохраняются не в стеке, а в памяти выделенной под временные переменные, а вот когда идет push то переменные сохраняются в стек, стек растет и перекрывает собой адресное пространство временных переменных, которые в свою очередь используются в прерывании, в результате стек слетаетsad.gif чуть расширю вопрос, есть ли какие нибудь дериктивы чтоб локальные переменные ни при каких условиях не занимали область памяти стека???
Go to the top of the page
 
+Quote Post
defunct
сообщение May 20 2008, 10:04
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Kibi @ May 20 2008, 12:50) *
когда сохраняем регистры с помощью st они сохраняются не в стеке, а в памяти выделенной под временные переменные, а вот когда идет push то переменные сохраняются в стек, стек растет и перекрывает собой адресное пространство временных переменных,

Вы заблуждаетесь. Временные (локальные) переменные располагаются также в стеке, а вот глобальные лежат по строго фиксированным адресам. Обращаться к стеку можно как с помощью PUSH/POP так и с помощью LD/ST. Судя по всему у Вас просто не хватает стека для нормальной работы программы. Менять PUSH/POP на LD/ST ничего не даст если памяти не хватает. Выход здесь такой - просто увеличить объем стека (сократить количество глобальных переменных, за счет замены их локальными переменными).
Go to the top of the page
 
+Quote Post
Kibi
сообщение May 20 2008, 10:29
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 11-03-08
Пользователь №: 35 811



Цитата(defunct @ May 20 2008, 14:04) *
Вы заблуждаетесь. Временные (локальные) переменные располагаются также в стеке, а вот глобальные лежат по строго фиксированным адресам. Обращаться к стеку можно как с помощью PUSH/POP так и с помощью LD/ST. Судя по всему у Вас просто не хватает стека для нормальной работы программы. Менять PUSH/POP на LD/ST ничего не даст если памяти не хватает. Выход здесь такой - просто увеличить объем стека (сократить количество глобальных переменных, за счет замены их локальными переменными).


нет, локальные распологаются не в области стека, проверял, проблема то возникает из-за небольшой рекурсии, но если push/pop заменить на st/ld, как было в iar, то все работает, но на iar вернуться нельзя, в том то и проблема, если кто знает директивы компилятору, чтоб push/pop заменить на st/ld то они мне впринципе и нужны, памяти используется 96%, но опятьже из-за небольшой рекурсии есть залезание в стек локальными переменными, к сожаленю логику программы переделывать мне месяц не дадут, сократить объем памяти тоже нет возможности:(
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение May 20 2008, 10:47
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Kibi @ May 20 2008, 14:29) *
нет, локальные распологаются не в области стека, проверял

А где по вашему они располагаются???
Go to the top of the page
 
+Quote Post
Kibi
сообщение May 20 2008, 10:59
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 11-03-08
Пользователь №: 35 811



Цитата(Непомнящий Евгений @ May 20 2008, 14:47) *
А где по вашему они располагаются???


если считать что стек распологается в sram и локальные и глобальные тамже, то да, спорить не буду, вопрос как ограничить компилятору залезание в область стека, iar это делает, может я тупой, да я привык работать на асме, и там таких проблем нет, ладно вопрос остается открытым, полезу заново перечитывать документацию по компилятору, мож если более внимательнее перечитаю то найду решение, просьба не флудить в теме, если есть решение как заменить push/pop на st/ld при компиляции, то прошу поделиться опытом.
Go to the top of the page
 
+Quote Post
aesok
сообщение May 20 2008, 11:04
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Kibi @ May 20 2008, 14:59) *
просьба не флудить в теме, если есть решение как заменить push/pop на st/ld при компиляции, то прошу поделиться опытом.


Если не флудить - то никак нельзя.

А если немного пофлудить, то:
С каким уровнем оптимизации Вы компилируете проэкт?
В какой памяти Вы распологаете строковые переменные и/или таблицы констант?

Анатолий.

Сообщение отредактировал aesok - May 20 2008, 11:05
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Kibi   как в winavr сделать так чтоб в прерывании вместо push/pop было st/ld   May 20 2008, 07:06
- - Kuzmi4   Цитата(Kibi @ May 20 2008, 10:06) есть пр...   May 20 2008, 07:49
- - MrYuran   Цитата(Kibi @ May 20 2008, 10:06) есть пр...   May 20 2008, 08:03
|- - VladimirYU   Цитата(Kibi @ May 20 2008, 13:50) когда с...   May 20 2008, 10:01
||- - Qwertty   Цитата(Непомнящий Евгений @ May 20 2008, 14...   May 20 2008, 10:54
||- - Qwertty   Цитата(Kibi @ May 20 2008, 14:59) если ес...   May 20 2008, 11:33
||- - VladimirYU   Цитата(Qwertty @ May 20 2008, 15:33) Реше...   May 20 2008, 11:47
|||- - galjoen   Мне кажется, что первопричина тут в том, что один ...   May 20 2008, 12:04
|||- - Непомнящий Евгений   Цитата(VladimirYU @ May 20 2008, 15:47) Р...   May 20 2008, 12:12
||- - aesok   Цитата(Qwertty @ May 20 2008, 15:33) Цита...   May 20 2008, 15:57
|- - 777777   Цитата(Kibi @ May 20 2008, 14:29) нет, ло...   May 20 2008, 10:53
|- - defunct   Цитата(Kibi @ May 20 2008, 13:29) нет, ло...   Aug 17 2008, 02:41
- - VladimirYU   Все дело IMHO в разных способах организации стека....   May 20 2008, 11:25
|- - Kibi   Цитата(VladimirYU @ May 20 2008, 15:25) В...   May 20 2008, 11:44
|- - singlskv   Цитата(Kibi @ May 20 2008, 15:44) думаю ч...   May 20 2008, 18:37
- - SasaVitebsk   Совершенно согласен defunct. с Я бы добавил ещё сл...   Aug 17 2008, 10:16
- - Qwertty   Цитата(SasaVitebsk @ Aug 17 2008, 14:16) ...   Aug 17 2008, 19:09
- - SasaVitebsk   Цитата(Qwertty @ Aug 17 2008, 22:09) А че...   Aug 18 2008, 00:28


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:16
Рейтинг@Mail.ru


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