Kibi 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Все дело IMHO в разных способах организации стека. В ИАР он рганизован программно без использования регистра указателя стека, поэтому там St/Ld, а у вас фактически аппаратно с использованием регистра указателя стека, такова реализация компилятора. Боюсь, что никак эту особенность вам не обойти. думаю что да, но вопрос остается открытым, как сказать компилятору не ставить push/pop Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Решение привел выше singlskv. А в начале обработчика ассемблерной вставкой сохраняйте регистры куда угодно. Только чем это поможет непонятно. Реализуемый, но жостаточно рискованный способ, можно задеть, например, глобальные переменные или static. Данный подход это первый шаг к откату на asm. Искать выход нужно в организации программы в целом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Мне кажется, что первопричина тут в том, что один и тот-же регистр в случае PUSH сохраняется в стеке несколько раз, а в случае ST тоже несколько раз, но на одно и то же место. И вот эту проблемму нужно решать (лишние сохранения регистров). Например не вызывать в прерывании функции и т.п. А замена PUSH на ST это симптоматическое лечение, которое может привести к тяжёлым глюкам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба Реализуемый, но жостаточно рискованный способ, можно задеть, например, глобальные переменные или static. Дык эти переменные будут также отжирать оперативку, единственное - что не на стеке. Чем это поможет? Если есть лишняя оперативка - можно просто размер стека увеличить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 20 мая, 2008 Опубликовано 20 мая, 2008 (изменено) · Жалоба В какой памяти Вы распологаете строковые переменные А что, есть варианты? :07: Неправильно выразился... стороковые константы? Анатолий. Изменено 20 мая, 2008 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 20 мая, 2008 Опубликовано 20 мая, 2008 · Жалоба думаю что да, но вопрос остается открытым, как сказать компилятору не ставить push/popДумаю что искать это Вы будете очень долго... Вам вроде уже сказали что нет такой возможности, хотя повторое чтение мануалов конечно еще никому не мешало :) Ну а если хотите конкретной помощи, тады код в студию.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 17 августа, 2008 Опубликовано 17 августа, 2008 · Жалоба нет, локальные распологаются не в области стека, проверял, проблема то возникает из-за небольшой рекурсии, но если push/pop заменить на st/ld, как было в iar, то все работает, но на iar вернуться нельзя, в том то и проблема, если кто знает директивы компилятору, чтоб push/pop заменить на st/ld то они мне впринципе и нужны, памяти используется 96%, но опятьже из-за небольшой рекурсии есть залезание в стек локальными переменными, к сожаленю логику программы переделывать мне месяц не дадут, сократить объем памяти тоже нет возможности:( Плохо проверяли. 1. Локальные переменные всегда располагаются в стеке если не помещаются в регистрах. 2. В IAR два стека, стек данных CSTACK, и стек возвратов RSTACK. И в IAR можно вручную задать их объем, т.о. память под стек заданного объема будет жестко резервирована и будет учитываться при подсчете занимаемой памяти. 3. В WinAVR есть один общий стек ничинающийся с RAMEND ничем не ограниченный снизу (память не резервируется и соответственно стек не учитывается при подсчете занятой памяти). Вы должны сами заботиться о том чтобы стека хватало. Если у вас используется 96% памяти, то значит под стек у вас осталось всего 4%. Умножте количество памяти вашего МК на 0.04 и будет вам число в байтах отведенное под стек в вашей программе. Учтите что для входа в прерывание нужно хотя бы 35 байт RAM + память на вызовы функций + память под локальные переменные. Меньше 256 байт стека, я считаю кощунством. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 17 августа, 2008 Опубликовано 17 августа, 2008 · Жалоба Совершенно согласен defunct. с Я бы добавил ещё следующее. В IAR сумма стеков примерно будет равна с той же программе (С учётом эффективности компиляторов). Таким образом нельзя говорить о вариантах реализации стека PUSH/STD, а можно говорить лишь о недостаточности памяти в целом. Либо о вашем непонимании. Вы поймите если переменная должна оказаться в стеке, то не имеет значения каким образом и в какой именно стек она будет положена! Главное, что она займёт место в памяти. Другое дело - объявление переменных и параметров. Это может сказаться на эффективности и объёме занимаемой памяти. Например при увеличении числа параметров передаваемом в ф-цию, вероятнее всего у вас увеличится объём занимаемой памяти (стека). Если в рекурсивной ф-ции вы объявите локальную переменную, то она будет размещена на стеке, а если вы её объявите static, то будет создан лишь один экземпляр переменной в памяти (Правда надо осмыслить логику работы). Я бы вообще попытался бы отказаться от рекурсии. Например в пользу бинарного перебора либо дерева. Очень неэффективна рекурсия в большенстве своём. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Qwertty 0 17 августа, 2008 Опубликовано 17 августа, 2008 · Жалоба Если в рекурсивной ф-ции вы объявите локальную переменную, то она будет размещена на стеке, а если вы её объявите static, то будет создан лишь один экземпляр переменной в памяти (Правда надо осмыслить логику работы). А чего осмысливать - рекурсивная функция должна быть реентерабельной, т.е. никаких static-ов в ней быть не должно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 18 августа, 2008 Опубликовано 18 августа, 2008 · Жалоба А чего осмысливать - рекурсивная функция должна быть реентерабельной, т.е. никаких static-ов в ней быть не должно. :) Просто пытаюсь осторожно высказываться. Ну если к примеру временная переменная возникает и уничтожается до рекурсивного вызова... :) Ну чисто теоретически... Но мне кажется что любая рекурсивная ф-ция памяти жрёт как сволочь. Зачем её применять? Особенно в условиях нехватки ресурсов Например памяти. Возьмём простейший случай - один параметр. Таким образом ф-ция минимум съест 3 байта памяти за каждый вызов. Думаю что на самом деле будет не менее 8-10 с учётом сохранения каких-нибудь регистров. Таким образом при уровне вложенности 150 - получится 1200-1500 байт! Это же немыслимо для контроллера! Опишите задачу, которую вы пытаетесь рекурсией решать. Мы тут коллегиально попытаемся её в обход пустить. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться