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

 
 
> как в 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
Ответов
SasaVitebsk
сообщение Aug 17 2008, 10:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

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

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

Я бы вообще попытался бы отказаться от рекурсии. Например в пользу бинарного перебора либо дерева. Очень неэффективна рекурсия в большенстве своём.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Aug 17 2008, 19:09
Сообщение #3


Местный
***

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



Цитата(SasaVitebsk @ Aug 17 2008, 14:16) *
Если в рекурсивной ф-ции вы объявите локальную переменную, то она будет размещена на стеке, а если вы её объявите static, то будет создан лишь один экземпляр переменной в памяти (Правда надо осмыслить логику работы).

А чего осмысливать - рекурсивная функция должна быть реентерабельной, т.е. никаких static-ов в ней быть не должно.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 18 2008, 00:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Qwertty @ Aug 17 2008, 22:09) *
А чего осмысливать - рекурсивная функция должна быть реентерабельной, т.е. никаких static-ов в ней быть не должно.

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

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

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

Опишите задачу, которую вы пытаетесь рекурсией решать. Мы тут коллегиально попытаемся её в обход пустить. smile.gif
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
- - singlskv   Цитата(Kibi @ May 20 2008, 11:06) есть пр...   May 20 2008, 08:08
|- - Kibi   Цитата(singlskv @ May 20 2008, 12:08) Пря...   May 20 2008, 09:50
|- - VladimirYU   Цитата(Kibi @ May 20 2008, 13:50) когда с...   May 20 2008, 10:01
|- - defunct   Цитата(Kibi @ May 20 2008, 12:50) когда с...   May 20 2008, 10:04
|- - Kibi   Цитата(defunct @ May 20 2008, 14:04) Вы з...   May 20 2008, 10:29
|- - Непомнящий Евгений   Цитата(Kibi @ May 20 2008, 14:29) нет, ло...   May 20 2008, 10:47
||- - Qwertty   Цитата(Непомнящий Евгений @ May 20 2008, 14...   May 20 2008, 10:54
||- - Kibi   Цитата(Непомнящий Евгений @ May 20 2008, 14...   May 20 2008, 10:59
||- - aesok   Цитата(Kibi @ May 20 2008, 14:59) просьба...   May 20 2008, 11:04
||- - 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


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

 


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


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