|
Программная запись 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 (которого и так не много) навсегда; - мало того еще надо лезть и править скрипт линкера; - при переносе программы между компиляторами код работать не будет, т.к. надо еще и учитывать особенности компилятора. Насчет скопировали неразбираясь надо ли так много, а стоит ли оно того это разбирательство? По скорости никто не жмет, т.к. непосредственно запись страницы флеш длится на порядк и дольше чем это избыточное копирование.
|
|
|
|
Сообщений в этой теме
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 1 2009, 18:30) Но эт... Apr 1 2009, 15:11       defunct Цитата(aaarrr @ Apr 1 2009, 18:11) Нет, н... Apr 1 2009, 15:34        aaarrr Цитата(defunct @ Apr 1 2009, 19:34) Как г... Apr 1 2009, 15:42         defunct ЦитатаТолько скопировали то, что:
1. Сгенерировано... Apr 1 2009, 15:51          aaarrr Цитата(defunct @ Apr 1 2009, 19:51) Если ... Apr 1 2009, 15:55           defunct Цитата(aaarrr @ Apr 1 2009, 18:55) Этот ... Apr 1 2009, 17:00            aaarrr Цитата(defunct @ Apr 1 2009, 21:00) В отл... Apr 1 2009, 17:17             defunct Цитата(aaarrr @ Apr 1 2009, 20:17) а уж с... Apr 1 2009, 17:34              aaarrr Цитата(defunct @ Apr 1 2009, 21:34) Зачем... Apr 1 2009, 17:44               defunct Цитата(aaarrr @ Apr 1 2009, 20:44) Ваш пр... Apr 1 2009, 18:34                aaarrr Цитата(defunct @ Apr 1 2009, 22:34) Вашим... Apr 1 2009, 18:58                 defunct Цитата(aaarrr @ Apr 1 2009, 21:58) Делать... Apr 1 2009, 20:26                  aaarrr Цитата(defunct @ Apr 2 2009, 00:26) 1. На... Apr 1 2009, 20:51                   defunct Цитата(aaarrr @ Apr 1 2009, 23:51) Можно ... Apr 1 2009, 21:29                    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
|
|
|