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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> как в 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
Kuzmi4
сообщение May 20 2008, 07:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Цитата(Kibi @ May 20 2008, 10:06) *
есть проблема с компилятором WinAVR-20071221 в прерываниях он ставит push/pop, в результате стека не хватает, хочу заменить на st/ld, кто знает как это зделать, перейти на iar нет возможности.


Не хотелось бы вас огорчать , но насколько я знаю в иаре тоже в прерываниях push/pop... НУ вот так они организованы....
А что за камень что стэк не помесчается ?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 20 2008, 08:03
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Kibi @ May 20 2008, 10:06) *
есть проблема с компилятором WinAVR-20071221 в прерываниях он ставит push/pop, в результате стека не хватает, хочу заменить на st/ld, кто знает как это зделать, перейти на iar нет возможности.

При вызове функций и заходе в прерывания в любом случае адрес возврата сохраняется в стеке.
Также компилятор размещает на стеке локальные переменные и копии регистров, которые портятся во время обработки прерываний.
Так что не используйте в прерывании функций, не определяйте в функциях локальных переменных - и потребление стека уменьшится.
Крайний вариант - писать обработчики прерываний на асме, тогда можно сделать всё что угодно.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 20 2008, 08:08
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 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
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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
VladimirYU
сообщение May 20 2008, 10:01
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Kibi @ May 20 2008, 13:50) *
когда сохраняем регистры с помощью st они сохраняются не в стеке, а в памяти выделенной под временные переменные, а вот когда идет push то переменные сохраняются в стек, стек растет и перекрывает собой адресное пространство временных переменных, которые в свою очередь используются в прерывании, в результате стек слетаетsad.gif чуть расширю вопрос, есть ли какие нибудь дериктивы чтоб локальные переменные ни при каких условиях не занимали область памяти стека???


может быть static поможет?

Цитата(VladimirYU @ May 20 2008, 13:58) *
может быть static поможет?


или через heap. Сначала new потом обязательно delete.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 20 2008, 10:04
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 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
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #9


Знающий
****

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



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

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


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Kibi @ May 20 2008, 14:29) *
нет, локальные распологаются не в области стека, проверял, проблема то возникает из-за небольшой рекурсии, но если push/pop заменить на st/ld, как было в iar, то все работает

Не понимаю как такое может быть. Если есть рекурсия, то локальные переменные обязательно должны быть в стеке, иначе у тебя будет один комплект переменных на все вызовы. Либо - ты рекурсией называешь что-то не то.

Сообщение отредактировал 777777 - May 20 2008, 10:53
Go to the top of the page
 
+Quote Post
Qwertty
сообщение May 20 2008, 10:54
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



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

Обычно в регистрах. Если их не очень много.
А вот предыдущее содержимое регистров идет в стек.

Сообщение отредактировал Qwertty - May 20 2008, 10:55
Go to the top of the page
 
+Quote Post
Kibi
сообщение May 20 2008, 10:59
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 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
VladimirYU
сообщение May 20 2008, 11:25
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Все дело IMHO в разных способах организации стека. В ИАР он рганизован программно без использования регистра указателя стека, поэтому там St/Ld, а у вас фактически аппаратно с использованием регистра указателя стека, такова реализация компилятора. Боюсь, что никак эту особенность вам не обойти.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение May 20 2008, 11:33
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



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

Решение привел выше singlskv.
А в начале обработчика ассемблерной вставкой сохраняйте регистры куда угодно. Только чем это поможет непонятно.
И еще непонятно, как связаны обработчик прерывания и рекурсия. Вы в обработчике используете рекурсивную функцию? Или речь про вложенные прерывания?

Цитата(aesok @ May 20 2008, 15:04) *
В какой памяти Вы распологаете строковые переменные

А что, есть варианты? 07.gif

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

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:57
Рейтинг@Mail.ru


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