|
|
  |
Программная запись FLASH AT91SAM7S128 |
|
|
|
Apr 1 2009, 13:10
|
Гуру
     
Группа: Свой
Сообщений: 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, не разбираясь, надо ли так много
|
|
|
|
|
Apr 1 2009, 14:30
|

кекс
     
Группа: Свой
Сообщений: 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 (которого и так не много) навсегда; - мало того еще надо лезть и править скрипт линкера; - при переносе программы между компиляторами код работать не будет, т.к. надо еще и учитывать особенности компилятора. Насчет скопировали неразбираясь надо ли так много, а стоит ли оно того это разбирательство? По скорости никто не жмет, т.к. непосредственно запись страницы флеш длится на порядк и дольше чем это избыточное копирование.
|
|
|
|
|
Apr 1 2009, 15:11
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Apr 1 2009, 18:30)  Но это сугубо ваша проблема, а не проблема предложенного подхода. Нет, не моя. Выделять на стеке огромные объекты - это не лучший подход в любом случае. Цитата(defunct @ Apr 1 2009, 18:30)  С другой стороны не будет и такого маразма как в вашей реализации: - Откусили ~n-байт от RAM (которого и так не много) навсегда; - мало того еще надо лезть и править скрипт линкера; - при переносе программы между компиляторами код работать не будет, т.к. надо еще и учитывать особенности компилятора. n в районе <50, неужели в ваших проектах настолько плохо с RAM? Владение инструментарием - это норма, а не маразм.
|
|
|
|
|
Apr 1 2009, 15:34
|

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

|
Цитата(aaarrr @ Apr 1 2009, 18:11)  Нет, не моя. Выделять на стеке огромные объекты - это не лучший подход в любом случае. 128 байт это не огромный объем, это сравнимо с контекстом регистров процессора (16x4), поэтому не делайте из мухи слона на ровном месте. Цитата n в районе <50, неужели в ваших проектах настолько плохо с RAM? Как говорится, с мира по нитке, глядиш и набежит KB, а это уже существенно. Цитата Владение инструментарием - это норма, а не маразм. Выделили и скопировали - это тоже норма, а не маразм, при динамическом распределении памяти.
|
|
|
|
|
Apr 1 2009, 15:42
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Apr 1 2009, 19:34)  Как говорится, с мира по нитке, глядиш и набежит KB, а это уже существенно. И кто теперь делает из мухи слона? Цитата(defunct @ Apr 1 2009, 19:34)  Выделили и скопировали - это тоже норма, а не маразм, при динамическом распределении памяти. Только скопировали то, что: 1. Сгенерировано компилятором 2. Для вырезания и копирования не предназначено Т.е. теоретически имеет право не работать.
|
|
|
|
|
Apr 1 2009, 17:17
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Apr 1 2009, 21:00)  В отличие от вашего подхода, когда код жестко привязывается к конкретному компилятору, и при переносе однозначно становится нерабочим. Код у меня ни к чему не привязывается, а уж скрипт линкера в любом случае менять придется. И нерабочим такой код назвать нельзя, тут вы теплое с мягким путаете. Цитата(defunct @ Apr 1 2009, 21:00)  Ключевое слово "может" реализовать, и также слегкостью может и не реализовать. При переходе дороги на красный свет вас может сбить машина. Так что, будем ломиться на красный?
|
|
|
|
|
Apr 1 2009, 17:34
|

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

|
Цитата(aaarrr @ Apr 1 2009, 20:17)  а уж скрипт линкера в любом случае менять придется. Зачем его менять в любом случае? Кто мешает писать так, чтобы не надо было менять. Цитата И нерабочим такой код назвать нельзя, тут вы теплое с мягким путаете. некоторые компиляторы требуют атрибут __ram, и т.п. так, что ничего я не путаю. Цитата(aaarrr @ Apr 1 2009, 20:17)  При переходе дороги на красный свет вас может сбить машина. Так что, будем ломиться на красный? А почему бы и нет, если есть подземный переход. Конечно, для тех кто привык всегда по поверхности - подземка не подойдет.
|
|
|
|
|
Apr 1 2009, 17:44
|
Гуру
     
Группа: Свой
Сообщений: 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)  А почему бы и нет, если есть подземный переход. Конечно, для тех кто привык всегда по поверхности - подземка не подойдет. Это не подземный переход, а канализационный коллектор.
|
|
|
|
|
Apr 1 2009, 18:34
|

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

|
Цитата(aaarrr @ Apr 1 2009, 20:44)  Ваш пример противоречит. Вашим правилам он противоречит что ли? Ну так не делайте так, если он противоречит вашим правилам. Цитата Работоспособность кода и возможность собрать его компиляторами X и Y - абсолютно разные вещи. Невозможность собрать приводит к неработоспособности кода. очевидно.
|
|
|
|
|
Apr 1 2009, 18:58
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Apr 1 2009, 22:34)  Вашим правилам он противоречит что ли? Ну так не делайте так, если он противоречит вашим правилам. И моим в том числе. Делать не буду, и другим не советую. Цитата(defunct @ Apr 1 2009, 22:34)  Невозможность собрать приводит к неработоспособности кода. очевидно. Невозможность собрать приводит к отсутствию предмета как такового, ничуть не влияя на его потенциальную работоспособность.
|
|
|
|
|
Apr 1 2009, 20:26
|

кекс
     
Группа: Свой
Сообщений: 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() в примере) и все.
|
|
|
|
|
Apr 1 2009, 20:51
|
Гуру
     
Группа: Свой
Сообщений: 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 последний, все с максимальным уровнем оптимизации (т.е. один раз написав код, перенос между компиляторами не требует никаких правок). Для данного конкретного случая вполне очевидный результат. Но сам принцип глубоко порочен - нельзя в общем случае копировать кота в мешке. Можно написать эту процедуру на асме, тем самым гарантировав ее переносимость, и спокойно копировать в ОЗУ. Но нельзя переносить результат работы компилятора. Даже когда все кажется очевидным и безопасным.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|