Перейти к содержанию
    

как в winavr сделать так чтоб в прерывании вместо push/pop было st/ld

Все дело IMHO в разных способах организации стека. В ИАР он рганизован программно без использования регистра указателя стека, поэтому там St/Ld, а у вас фактически аппаратно с использованием регистра указателя стека, такова реализация компилятора. Боюсь, что никак эту особенность вам не обойти.

 

думаю что да, но вопрос остается открытым, как сказать компилятору не ставить push/pop

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение привел выше singlskv.

А в начале обработчика ассемблерной вставкой сохраняйте регистры куда угодно. Только чем это поможет непонятно.

Реализуемый, но жостаточно рискованный способ, можно задеть, например, глобальные переменные или static. Данный подход это первый шаг к откату на asm. Искать выход нужно в организации программы в целом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, что первопричина тут в том, что один и тот-же регистр в случае PUSH сохраняется в стеке несколько раз, а в случае ST тоже несколько раз, но на одно и то же место. И вот эту проблемму нужно решать (лишние сохранения регистров). Например не вызывать в прерывании функции и т.п. А замена PUSH на ST это симптоматическое лечение, которое может привести к тяжёлым глюкам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Реализуемый, но жостаточно рискованный способ, можно задеть, например, глобальные переменные или static.

Дык эти переменные будут также отжирать оперативку, единственное - что не на стеке. Чем это поможет? Если есть лишняя оперативка - можно просто размер стека увеличить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В какой памяти Вы распологаете строковые переменные

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

 

Неправильно выразился... стороковые константы?

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

думаю что да, но вопрос остается открытым, как сказать компилятору не ставить push/pop
Думаю что искать это Вы будете очень долго...

Вам вроде уже сказали что нет такой возможности, хотя повторое чтение мануалов

конечно еще никому не мешало :)

 

Ну а если хотите конкретной помощи, тады код в студию....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет, локальные распологаются не в области стека, проверял, проблема то возникает из-за небольшой рекурсии, но если 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 байт стека, я считаю кощунством.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совершенно согласен defunct. с Я бы добавил ещё следующее. В IAR сумма стеков примерно будет равна с той же программе (С учётом эффективности компиляторов).

 

Таким образом нельзя говорить о вариантах реализации стека PUSH/STD, а можно говорить лишь о недостаточности памяти в целом. Либо о вашем непонимании. Вы поймите если переменная должна оказаться в стеке, то не имеет значения каким образом и в какой именно стек она будет положена! Главное, что она займёт место в памяти.

 

Другое дело - объявление переменных и параметров. Это может сказаться на эффективности и объёме занимаемой памяти. Например при увеличении числа параметров передаваемом в ф-цию, вероятнее всего у вас увеличится объём занимаемой памяти (стека). Если в рекурсивной ф-ции вы объявите локальную переменную, то она будет размещена на стеке, а если вы её объявите static, то будет создан лишь один экземпляр переменной в памяти (Правда надо осмыслить логику работы).

 

Я бы вообще попытался бы отказаться от рекурсии. Например в пользу бинарного перебора либо дерева. Очень неэффективна рекурсия в большенстве своём.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если в рекурсивной ф-ции вы объявите локальную переменную, то она будет размещена на стеке, а если вы её объявите static, то будет создан лишь один экземпляр переменной в памяти (Правда надо осмыслить логику работы).

А чего осмысливать - рекурсивная функция должна быть реентерабельной, т.е. никаких static-ов в ней быть не должно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чего осмысливать - рекурсивная функция должна быть реентерабельной, т.е. никаких static-ов в ней быть не должно.

:) Просто пытаюсь осторожно высказываться. Ну если к примеру временная переменная возникает и уничтожается до рекурсивного вызова... :) Ну чисто теоретически...

 

Но мне кажется что любая рекурсивная ф-ция памяти жрёт как сволочь. Зачем её применять? Особенно в условиях нехватки ресурсов Например памяти.

 

Возьмём простейший случай - один параметр. Таким образом ф-ция минимум съест 3 байта памяти за каждый вызов. Думаю что на самом деле будет не менее 8-10 с учётом сохранения каких-нибудь регистров. Таким образом при уровне вложенности 150 - получится 1200-1500 байт! Это же немыслимо для контроллера!

 

Опишите задачу, которую вы пытаетесь рекурсией решать. Мы тут коллегиально попытаемся её в обход пустить. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...