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

 
 
> Программная запись FLASH AT91SAM7S128
MiklPolikov
сообщение Dec 26 2008, 07:23
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



at89sam7s128

Нужно сохранять данные при отключении питания.

Через указатель на Internal Flash (адреса с с 0x00100000 по 0x0020000) получается только читать.

сhar *pnr;
pnr= (char*) 0x00100001;
*pnr=0x33;

Этот код выполняется но во FLASH ничего не записывается.

Как записать во FLASH ?


Спасибо !

Сообщение отредактировал MiklPolikov - Dec 26 2008, 07:24


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Apr 1 2009, 11:26
Сообщение #2


Гуру
******

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



Способ потенциально небезопасный (iap_PageWrite не ROPI, размер его может и превысить 128 байт, стека может и не хватить и т.п.).
Стоит ли ради экономии полутора сотен байт RAM так напрягаться?
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 11:35
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 12:40
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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.

Да, не заметил как-то, пардон. Тогда тем более лучше воткнуть эту процедуру средствами линкера, т.к. это даже меньше полусотни байт.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2009, 12:55
Сообщение #5


кекс
******

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



Цитата(aaarrr @ Apr 1 2009, 15:40) *
На стеке это все же просто мертвый груз.

Кто мертвый груз?
Освободившуюся память можете отдать под что угодно, как вариант - увеличить объем стека.
А Вы о чем?

Цитата
Тогда тем более лучше воткнуть эту процедуру средствами линкера, т.к. это даже меньше полусотни байт.

Не понимаю чем может быть статическое резервирование RAM, лучше динамического распределения.
Не стоит хранить в RAM код, который применяется раз в пятилетку.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 1 2009, 13:10
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- 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


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

 


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


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