Kibi 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба есть проблема с компилятором WinAVR-20071221 в прерываниях он ставит push/pop, в результате стека не хватает, хочу заменить на st/ld, кто знает как это зделать, перейти на iar нет возможности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба есть проблема с компилятором WinAVR-20071221 в прерываниях он ставит push/pop, в результате стека не хватает, хочу заменить на st/ld, кто знает как это зделать, перейти на iar нет возможности. Не хотелось бы вас огорчать , но насколько я знаю в иаре тоже в прерываниях push/pop... НУ вот так они организованы.... А что за камень что стэк не помесчается ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 23 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба есть проблема с компилятором WinAVR-20071221 в прерываниях он ставит push/pop, в результате стека не хватает, хочу заменить на st/ld, кто знает как это зделать, перейти на iar нет возможности. При вызове функций и заходе в прерывания в любом случае адрес возврата сохраняется в стеке. Также компилятор размещает на стеке локальные переменные и копии регистров, которые портятся во время обработки прерываний. Так что не используйте в прерывании функций, не определяйте в функциях локальных переменных - и потребление стека уменьшится. Крайний вариант - писать обработчики прерываний на асме, тогда можно сделать всё что угодно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба есть проблема с компилятором 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 поможет сократить размер необходимой памяти ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kibi 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Прямо, никак... Обходными путями можно, только весь контекст придется ручками сохранять, типа: void TIMER2_COMP_vect(void) __attribute__((signal)) __attribute__((naked)); void TIMER2_COMP_vect() { {сохраняем контекст} {восстанавливаем контекст} __asm__ __volatile__("reti"); // выходим } Только вот непонятен до конца вопрос, как использование st/ld поможет сократить размер необходимой памяти ? когда сохраняем регистры с помощью st они сохраняются не в стеке, а в памяти выделенной под временные переменные, а вот когда идет push то переменные сохраняются в стек, стек растет и перекрывает собой адресное пространство временных переменных, которые в свою очередь используются в прерывании, в результате стек слетает:( чуть расширю вопрос, есть ли какие нибудь дериктивы чтоб локальные переменные ни при каких условиях не занимали область памяти стека??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба когда сохраняем регистры с помощью st они сохраняются не в стеке, а в памяти выделенной под временные переменные, а вот когда идет push то переменные сохраняются в стек, стек растет и перекрывает собой адресное пространство временных переменных, которые в свою очередь используются в прерывании, в результате стек слетает:( чуть расширю вопрос, есть ли какие нибудь дериктивы чтоб локальные переменные ни при каких условиях не занимали область памяти стека??? может быть static поможет? может быть static поможет? или через heap. Сначала new потом обязательно delete. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба когда сохраняем регистры с помощью st они сохраняются не в стеке, а в памяти выделенной под временные переменные, а вот когда идет push то переменные сохраняются в стек, стек растет и перекрывает собой адресное пространство временных переменных, Вы заблуждаетесь. Временные (локальные) переменные располагаются также в стеке, а вот глобальные лежат по строго фиксированным адресам. Обращаться к стеку можно как с помощью PUSH/POP так и с помощью LD/ST. Судя по всему у Вас просто не хватает стека для нормальной работы программы. Менять PUSH/POP на LD/ST ничего не даст если памяти не хватает. Выход здесь такой - просто увеличить объем стека (сократить количество глобальных переменных, за счет замены их локальными переменными). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kibi 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Вы заблуждаетесь. Временные (локальные) переменные располагаются также в стеке, а вот глобальные лежат по строго фиксированным адресам. Обращаться к стеку можно как с помощью PUSH/POP так и с помощью LD/ST. Судя по всему у Вас просто не хватает стека для нормальной работы программы. Менять PUSH/POP на LD/ST ничего не даст если памяти не хватает. Выход здесь такой - просто увеличить объем стека (сократить количество глобальных переменных, за счет замены их локальными переменными). нет, локальные распологаются не в области стека, проверял, проблема то возникает из-за небольшой рекурсии, но если push/pop заменить на st/ld, как было в iar, то все работает, но на iar вернуться нельзя, в том то и проблема, если кто знает директивы компилятору, чтоб push/pop заменить на st/ld то они мне впринципе и нужны, памяти используется 96%, но опятьже из-за небольшой рекурсии есть залезание в стек локальными переменными, к сожаленю логику программы переделывать мне месяц не дадут, сократить объем памяти тоже нет возможности:( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба нет, локальные распологаются не в области стека, проверял А где по вашему они располагаются??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 20 мая, 2008 Опубликовано 20 мая, 2008 (изменено) · Жалоба нет, локальные распологаются не в области стека, проверял, проблема то возникает из-за небольшой рекурсии, но если push/pop заменить на st/ld, как было в iar, то все работает Не понимаю как такое может быть. Если есть рекурсия, то локальные переменные обязательно должны быть в стеке, иначе у тебя будет один комплект переменных на все вызовы. Либо - ты рекурсией называешь что-то не то. Изменено 20 мая, 2008 пользователем 777777 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Qwertty 0 20 мая, 2008 Опубликовано 20 мая, 2008 (изменено) · Жалоба А где по вашему они располагаются??? Обычно в регистрах. Если их не очень много. А вот предыдущее содержимое регистров идет в стек. Изменено 20 мая, 2008 пользователем Qwertty Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kibi 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба А где по вашему они располагаются??? если считать что стек распологается в sram и локальные и глобальные тамже, то да, спорить не буду, вопрос как ограничить компилятору залезание в область стека, iar это делает, может я тупой, да я привык работать на асме, и там таких проблем нет, ладно вопрос остается открытым, полезу заново перечитывать документацию по компилятору, мож если более внимательнее перечитаю то найду решение, просьба не флудить в теме, если есть решение как заменить push/pop на st/ld при компиляции, то прошу поделиться опытом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 20 мая, 2008 Опубликовано 20 мая, 2008 (изменено) · Жалоба просьба не флудить в теме, если есть решение как заменить push/pop на st/ld при компиляции, то прошу поделиться опытом. Если не флудить - то никак нельзя. А если немного пофлудить, то: С каким уровнем оптимизации Вы компилируете проэкт? В какой памяти Вы распологаете строковые переменные и/или таблицы констант? Анатолий. Изменено 20 мая, 2008 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Все дело IMHO в разных способах организации стека. В ИАР он рганизован программно без использования регистра указателя стека, поэтому там St/Ld, а у вас фактически аппаратно с использованием регистра указателя стека, такова реализация компилятора. Боюсь, что никак эту особенность вам не обойти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Qwertty 0 20 мая, 2008 Опубликовано 20 мая, 2008 (изменено) · Жалоба если есть решение как заменить push/pop на st/ld при компиляции, то прошу поделиться опытом. Решение привел выше singlskv. А в начале обработчика ассемблерной вставкой сохраняйте регистры куда угодно. Только чем это поможет непонятно. И еще непонятно, как связаны обработчик прерывания и рекурсия. Вы в обработчике используете рекурсивную функцию? Или речь про вложенные прерывания? В какой памяти Вы распологаете строковые переменные А что, есть варианты? :07: Изменено 20 мая, 2008 пользователем Qwertty Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться