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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Программная запись FLASH AT91SAM7S128
aaarrr
сообщение Apr 1 2009, 13:10
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 1 2009, 16:55) *
Кто мертвый груз, вы о чем?

О том, что эти несчастные 128 байт надо добавить к стеку заранее, хотя задействованы они будут "раз в пятилетку".

Цитата(defunct @ Apr 1 2009, 16:55) *
Не понимаю чем может быть статическое резервирование RAM, лучше динамического распределения.
Не стоит хранить в RAM код, который применяется раз в пятилетку.

Хотя бы тем, что не будет такого маразма при каждом вызове iap_ExecCmd:
- выделили 128 байт на стеке
- скопировали туда 128 байт с начала iap_FlashCmdFunc, не разбираясь, надо ли так много
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 14:30
Сообщение #17


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Apr 1 2009, 16:10) *
О том, что эти несчастные 128 байт надо добавить к стеку заранее, хотя задействованы они будут "раз в пятилетку".

Я так понимаю вы сейчас пишите в контексте, как бы это сказать, некоего ОСа, в котором используются отдельные маленькие стеки для каждой задачи. Верно? Если я прав, то конечно вам нельзя себе позволить разместить автоматическую 128-ми байтовую переменную в стеке. Но это сугубо ваша проблема, а не проблема предложенного подхода.

Я же пользую общий стек для всех задач, поэтому никогда не испытываю проблем с его объемом. Я могу себе позволить выделить в стеке буфер под например 1.5KB Ethernet пакет, без задней мысли. Поэтому выделить 128 байт в стеке это для меня не проблема, настолько же насколько объявиление переменной типа int.

к слову в оригинальном коде, память я выделяю из пакетного пула:
Код
void iap_ExecCmd( U32 FCR_val)
{
    PPACKET_BUF pPacketDesc = pool_AllocPart();
    U32 ThumbMode = (U32)iap_FlashCmdFunc & 0x01;

    while (!pPacketDesc)
    {
        Kernel_Dispatch();
        pPacketDesc = pool_AllocPart();
    }
    ...


А специально для форума подготовил код использующий стек-фрейм, т.к. он получается отвязанным от конкретной реализации.

Большой стек у меня получается вчастности за счет того, что в программе практически нет лишнего статически распределенного мусора. Как например функций записи страницы флеш.

Цитата
Хотя бы тем, что не будет такого маразма при каждом вызове iap_ExecCmd:
- выделили 128 байт на стеке
- скопировали туда 128 байт с начала iap_FlashCmdFunc, не разбираясь, надо ли так много

С другой стороны не будет и такого маразма как в вашей реализации:
- Откусили ~n-байт от RAM (которого и так не много) навсегда;
- мало того еще надо лезть и править скрипт линкера;
- при переносе программы между компиляторами код работать не будет, т.к. надо еще и учитывать особенности компилятора.

Насчет скопировали неразбираясь надо ли так много, а стоит ли оно того это разбирательство? По скорости никто не жмет, т.к. непосредственно запись страницы флеш длится на порядки дольше чем это избыточное копирование.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 15:11
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 1 2009, 18:30) *
Но это сугубо ваша проблема, а не проблема предложенного подхода.

Нет, не моя. Выделять на стеке огромные объекты - это не лучший подход в любом случае.

Цитата(defunct @ Apr 1 2009, 18:30) *
С другой стороны не будет и такого маразма как в вашей реализации:
- Откусили ~n-байт от RAM (которого и так не много) навсегда;
- мало того еще надо лезть и править скрипт линкера;
- при переносе программы между компиляторами код работать не будет, т.к. надо еще и учитывать особенности компилятора.

n в районе <50, неужели в ваших проектах настолько плохо с RAM?
Владение инструментарием - это норма, а не маразм.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 15:34
Сообщение #19


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Apr 1 2009, 18:11) *
Нет, не моя. Выделять на стеке огромные объекты - это не лучший подход в любом случае.

128 байт это не огромный объем, это сравнимо с контекстом регистров процессора (16x4), поэтому не делайте из мухи слона на ровном месте.

Цитата
n в районе <50, неужели в ваших проектах настолько плохо с RAM?

Как говорится, с мира по нитке, глядиш и набежит KB, а это уже существенно.

Цитата
Владение инструментарием - это норма, а не маразм.

Выделили и скопировали - это тоже норма, а не маразм, при динамическом распределении памяти.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 15:42
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 1 2009, 19:34) *
Как говорится, с мира по нитке, глядиш и набежит KB, а это уже существенно.

И кто теперь делает из мухи слона?

Цитата(defunct @ Apr 1 2009, 19:34) *
Выделили и скопировали - это тоже норма, а не маразм, при динамическом распределении памяти.

Только скопировали то, что:
1. Сгенерировано компилятором
2. Для вырезания и копирования не предназначено

Т.е. теоретически имеет право не работать.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 15:51
Сообщение #21


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Только скопировали то, что:
1. Сгенерировано компилятором
2. Для вырезания и копирования не предназначено

Т.е. теоретически имеет право не работать.

Если бы мы обсуждали некий гипотетический способ достижения цели, можно было бы порассуждать теоретически.
А так имеется конкретный __рабочий__ код, стоит ли вспоминать о его теоретическом праве? ;>
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 15:55
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 1 2009, 19:51) *
Если бы мы обсуждали некий гипотетический способ достижения цели, можно было бы порассуждать теоретически.
А так имеется конкретный __рабочий__ код, стоит ли вспоминать о его теоретическом праве? ;>

Этот "рабочий" код с легкостью может реализовать свое право и стать __нерабочим__ при смене компилятора или опций оптимизации.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 17:00
Сообщение #23


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Apr 1 2009, 18:55) *
Этот "рабочий" код с легкостью может реализовать свое право и стать __нерабочим__ при смене компилятора или опций оптимизации.

Ключевое слово "может" реализовать, и также слегкостью может и не реализовать.
Для успокоения, можно отключить оптимизацию одной функции (той что копируется), но думаю и этого делать не потребуется.

В отличие от вашего подхода, когда код жестко привязывается к конкретному компилятору, и при переносе однозначно становится нерабочим.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 17:17
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 1 2009, 21:00) *
В отличие от вашего подхода, когда код жестко привязывается к конкретному компилятору, и при переносе однозначно становится нерабочим.

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

Цитата(defunct @ Apr 1 2009, 21:00) *
Ключевое слово "может" реализовать, и также слегкостью может и не реализовать.

При переходе дороги на красный свет вас может сбить машина. Так что, будем ломиться на красный?
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 17:34
Сообщение #25


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Apr 1 2009, 20:17) *
а уж скрипт линкера в любом случае менять придется.

Зачем его менять в любом случае?
Кто мешает писать так, чтобы не надо было менять.

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

некоторые компиляторы требуют атрибут __ram, и т.п. так, что ничего я не путаю.

Цитата(aaarrr @ Apr 1 2009, 20:17) *
При переходе дороги на красный свет вас может сбить машина. Так что, будем ломиться на красный?

А почему бы и нет, если есть подземный переход.
Конечно, для тех кто привык всегда по поверхности - подземка не подойдет.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 17:44
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 1 2009, 21:34) *
Зачем его менять в любом случае?
Кто мешает писать так, чтобы не надо было менять.

Никто не мешает, если это не противоречит правилам. Ваш пример противоречит.
Хотите использовать какой-нибудь simple memory map и визарды - да флаг в руки, только далеко не всегда это возможно.

Цитата(defunct @ Apr 1 2009, 21:34) *
...ничего я не путаю.

Работоспособность кода и возможность собрать его компиляторами X и Y - абсолютно разные вещи.

Цитата(defunct @ Apr 1 2009, 21:34) *
А почему бы и нет, если есть подземный переход.
Конечно, для тех кто привык всегда по поверхности - подземка не подойдет.

Это не подземный переход, а канализационный коллектор.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 18:34
Сообщение #27


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Apr 1 2009, 20:44) *
Ваш пример противоречит.

Вашим правилам он противоречит что ли? Ну так не делайте так, если он противоречит вашим правилам.

Цитата
Работоспособность кода и возможность собрать его компиляторами X и Y - абсолютно разные вещи.

Невозможность собрать приводит к неработоспособности кода. очевидно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 18:58
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 1 2009, 22:34) *
Вашим правилам он противоречит что ли? Ну так не делайте так, если он противоречит вашим правилам.

И моим в том числе. Делать не буду, и другим не советую.

Цитата(defunct @ Apr 1 2009, 22:34) *
Невозможность собрать приводит к неработоспособности кода. очевидно.

Невозможность собрать приводит к отсутствию предмета как такового, ничуть не влияя на его потенциальную работоспособность.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 20:26
Сообщение #29


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Apr 1 2009, 21:58) *
Делать не буду, и другим не советую.

А я советую делать так. По крайней мере для сохранения конфигурации способ идеален по следующим причинам:

1. Накладные постоянные расходы RAM - 0.
2. Код всегда лежит во флеш, т.о. он не может быть случайно перетерт.
3. Можно забыть, что такое скрипты линкера.
4. Вопреки опасениям уважаемого aaarrr, никаких проблем с переносом между компиляторами и установленным уровнем оптимизации нет. Специально попробовал в трех компиляторах IAR 4.40, RVDS 3.1 и Keil CA последний, все с максимальным уровнем оптимизации (т.е. один раз написав код, перенос между компиляторами не требует никаких правок, ни сам код ни скрипты ничего менять не надо). Ну а если вдруг при использовании какого-то компилятора (допускаю) случится худшее и код откажется работать, нужно будет отключить оптимизацию одной функции (iap_FlashCmdFunc() в примере) и все.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 20:51
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 2 2009, 00:26) *
1. Накладные постоянные расходы RAM - 0.

Даже с этим можно поспорить, если нет кучи или другого подобного источника памяти.

Цитата(defunct @ Apr 2 2009, 00:26) *
2. Код всегда лежит во флеш, т.о. он не может быть сучайно перетерт.

В нормальной программе ничего не может быть случайно перетерто.

Цитата(defunct @ Apr 2 2009, 00:26) *
3. Можно забыть, что такое скрипты линкера.

Но лучше все же помнить.

Цитата(defunct @ Apr 2 2009, 00:26) *
4. Вопреки предположениям уважаемого aaarrr, никаких проблем с переносом между компиляторами и установленным уровнем оптимизации, специально попробовал в трех компиляторах IAR 4.40, RVDS 3.1 и Keil CA последний, все с максимальным уровнем оптимизации (т.е. один раз написав код, перенос между компиляторами не требует никаких правок).

Для данного конкретного случая вполне очевидный результат. Но сам принцип глубоко порочен - нельзя в общем случае копировать кота в мешке.

Можно написать эту процедуру на асме, тем самым гарантировав ее переносимость, и спокойно копировать в ОЗУ. Но нельзя переносить результат работы компилятора. Даже когда все кажется очевидным и безопасным.
Go to the top of the page
 
+Quote Post

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

 


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


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