|
Программная запись FLASH AT91SAM7S128 |
|
|
|
 |
Ответов
|
Apr 1 2009, 11:35
|

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

|
Цитата(aaarrr @ Apr 1 2009, 14:26)  Способ потенциально небезопасный (iap_PageWrite не ROPI, размер его может и превысить 128 байт, стека может и не хватить и т.п.). Стоит ли ради экономии полутора сотен байт RAM так напрягаться? Стоит, т.к. лучше эту полусотню байт к стеку добавить. Напряжений особых я тоже не вижу, нехватит 128 байт - дайте больше, можно не в стеке выделять а из heap или из пакетного пула (который всегда толстый при использовании EMAC) т.д.. PS: iap_PageWrite в RAM не копируется, ибо незачем, копируется только iap_FlashCmdFunc. Пользователю предоставляется только iap_PageWrite(..) выполняемая из FLASH.
|
|
|
|
|
Apr 1 2009, 12:40
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Apr 1 2009, 15:35)  Стоит, т.к. лучше эту полусотню байт к стеку добавить. На стеке это все же просто мертвый груз. Цитата(defunct @ Apr 1 2009, 15:35)  PS: iap_PageWrite в RAM не копируется, ибо незачем, копируется только iap_FlashCmdFunc. Пользователю предоставляется только iap_PageWrite(..) выполняемая из FLASH. Да, не заметил как-то, пардон. Тогда тем более лучше воткнуть эту процедуру средствами линкера, т.к. это даже меньше полусотни байт.
|
|
|
|
|
Apr 1 2009, 12:55
|

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

|
Цитата(aaarrr @ Apr 1 2009, 15:40)  На стеке это все же просто мертвый груз. Кто мертвый груз? Освободившуюся память можете отдать под что угодно, как вариант - увеличить объем стека. А Вы о чем? Цитата Тогда тем более лучше воткнуть эту процедуру средствами линкера, т.к. это даже меньше полусотни байт. Не понимаю чем может быть статическое резервирование RAM, лучше динамического распределения. Не стоит хранить в RAM код, который применяется раз в пятилетку.
|
|
|
|
|
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 последний, все с максимальным уровнем оптимизации (т.е. один раз написав код, перенос между компиляторами не требует никаких правок). Для данного конкретного случая вполне очевидный результат. Но сам принцип глубоко порочен - нельзя в общем случае копировать кота в мешке. Можно написать эту процедуру на асме, тем самым гарантировав ее переносимость, и спокойно копировать в ОЗУ. Но нельзя переносить результат работы компилятора. Даже когда все кажется очевидным и безопасным.
|
|
|
|
|
Apr 1 2009, 21:29
|

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

|
Цитата(aaarrr @ Apr 1 2009, 23:51)  Можно написать эту процедуру на асме, тем самым гарантировав ее переносимость, и спокойно копировать в ОЗУ. Или наоборот непереносимость, т.к. ситаксис ассемблера может отличаться. Да и вы начинаете сами себе противоречить. то Цитата Для данного конкретного случая вполне очевидный результат. то Цитата Но нельзя переносить результат работы компилятора. Даже когда все кажется очевидным и безопасным. Проще надо быть. Когда пишешь безопасный код, то и компилятор сделает все безопасно на выходе. Поэтому нет нужды тратить свое время на рожание асм кода, компилятор - сгенерирует тоже самое быстрее и дешевле. Есть сомнения, загляните в листинг. Не работает - исправьте.
|
|
|
|
Сообщений в этой теме
MiklPolikov Программная запись FLASH AT91SAM7S128 Dec 26 2008, 07:23 aaarrr Цитата(MiklPolikov @ Dec 26 2008, 10:23) ... Dec 26 2008, 08:34 MiklPolikov Цитата(aaarrr @ Dec 26 2008, 12:34) Тольк... Mar 30 2009, 14:55 aaarrr Вам нужно при помощи линкера разместить в RAM проц... Mar 30 2009, 15:18 MiklPolikov Цитата(aaarrr @ Mar 30 2009, 19:18) Вам н... Mar 31 2009, 14:00 Artem_Petrik Цитата(MiklPolikov @ Dec 26 2008, 10:23) ... Mar 30 2009, 15:32 Шурила Цитата(MiklPolikov @ Dec 26 2008, 09:23) ... Mar 31 2009, 00:56 Сергей Борщ Цитата(Шурила @ Mar 31 2009, 03:56) после... Mar 31 2009, 07:16 Harbour неплохо бы еще запрещать прерывания на момент запи... Mar 31 2009, 05:44 aaarrr В Keil'е оформляете процедуру примерно так:
Ко... Mar 31 2009, 14:07 defunct Не надо функции хранить в RAM. Функцию можно скопи... Apr 1 2009, 11:01                    aaarrr Цитата(defunct @ Apr 2 2009, 01:29) Или н... Apr 1 2009, 21:44                     defunct Цитата(aaarrr @ Apr 2 2009, 00:44) Перено... Apr 1 2009, 22:08                      aaarrr Цитата(defunct @ Apr 2 2009, 02:08) Зачем... Apr 1 2009, 22:39                       defunct Цитата(aaarrr @ Apr 2 2009, 01:39) Можно ... Apr 1 2009, 22:55 aaarrr Получается нечто вроде:
Кодvoid fcmd(U32 fcr... Apr 1 2009, 23:35
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|