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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Запись данных во Flash Sam7s256
Sanya_kv
сообщение Jun 25 2009, 08:09
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 25-02-09
Из: Россия
Пользователь №: 45 369



Цитата(aaarrr @ Jun 24 2009, 22:14) *
Да-да, и думать тоже не надо sad.gif

Не разделяю, да ты и сам это понимаешь.

Цитата(Сергей Борщ @ Jun 24 2009, 22:46) *
krapula.gif А самому сравнить, сколько этот "писанный левой ногой" код отъедает ОЗУ по сравнению с кодом, приведенном aaarrr в сообщении №9? Тут не мучаться, тут прослезиться нужно.

Внимательней посмотри. Было бы пользы больше, если б ошибки искал в исподниках а не комментариях.

Цитата(Spoofing @ Jun 25 2009, 00:04) *
А смысл от этого монумента если большая часть не нужна?) Лучше сделать подпрограмму записи команды и ожидания флага и вызывать его из функции записи.

Конечно не нужна, каждый использует по потребностям. Если тебе нужно только писать, то скопируй 2-3 функции:
Код
AT91F_Flash_Init;
AT91F_Flash_Ready;
AT91F_Flash_Write;

И поменяй константы в соответствии со своим АРМом.
А то что визуальный объем большой, так это из-за комментариев, для Вашего же удобства.
Использую от сюда функции. Вполне доволен. Врятли кому-либо удастся написать компактней, а если учитывать, что это все от производителя, думаю не скривлю, если добавлю что лучше.
Цитата
Причина редактирования: Нарушение п.3.4 Правил форума.
Спасибо, учту в будущем.

Сообщение отредактировал Sanya_kv - Jun 25 2009, 08:22
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 25 2009, 09:57
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Sanya_kv @ Jun 25 2009, 11:09) *
Внимательней посмотри. Было бы пользы больше, если б ошибки искал в исподниках а не комментариях.
Смотрел. Каждая функция этого кода размещается в ОЗУ. Прибита туда гвоздями ключевым словом __ramfunc. В то время как небходимо и достатночно иметь в ОЗУ один-единственный кусочек кода из сообщения №9. Один на все функции. Это 7 ARM-команд. Является такое вольное расходование ОЗУ ошибкой или "писанием левой ногой" - не берусь судить, скорее всего первое вытекающее из второго.
Цитата(Sanya_kv @ Jun 25 2009, 11:09) *
Конечно не нужна, каждый использует по потребностям. Если тебе нужно только писать, то скопируй 2-3 функции:
Вообще-то это забота линкера - подцепить к выходному файлу только используемые функции.
Цитата(Sanya_kv @ Jun 25 2009, 11:09) *
Врятли кому-либо удастся написать компактней, а если учитывать, что это все от производителя, думаю не скривлю, если добавлю что лучше.
Это классический пример "индийского" кода. Написано по принципу "работает - и ладно". Авторитет производителя скорее страдает от таких примеров.
Код
at91_flash.h:
#ifndef AT91_FLASH_H__
#define AT91_FLASH_H__
#include    <stdint.h>
#include    <ioAT91SAM77S64.h>

#define MCK_CYCLES          ((15ULL * MCK + 5000000) / 10000000)
#define FLASH_WAITSTATES    MCK_CYCLES < 30000000ULL ? AT91C_MC_FWS_0FWS : AT91C_MC_FWS_1FWS

inline void ErasePage(uint32_t const *addr)
{
    FlashCommand( (0x5AULL *  AT91C_MC_KEY / 0xFF) | (((uint32_t)addr >> 7) << 8) | AT91C_MC_FCMD_START_PROG, \
                  (0 * AT91C_MC_FRDY) | (0 * AT91C_MC_LOCKE) | ( 0 * AT91C_MC_PROGE) \
                  | (0 * AT91C_MC_NEBP) | (FLASH_WAITSTATES) | (MCK_CYCLES * AT91C_MC_FMCN / 0xFF));
}

inline void ProgramPage(uint32_t const *addr)
{
    FlashCommand( (0x5AULL *  AT91C_MC_KEY / 0xFF) | (((uint32_t)addr >> 7) << 8) | AT91C_MC_FCMD_START_PROG, \
                  (0 * AT91C_MC_FRDY) | (0 * AT91C_MC_LOCKE) | ( 0 * AT91C_MC_PROGE) \
                  | (1 * AT91C_MC_NEBP) | (FLASH_WAITSTATES) | (MCK_CYCLES * AT91C_MC_FMCN / 0xFF));
}

inline void RewritePage(uint32_t const *addr)
{
    FlashCommand( (0x5AULL *  AT91C_MC_KEY / 0xFF) | (((uint32_t)addr >> 7) << 8) | AT91C_MC_FCMD_START_PROG, \
                (0 * AT91C_MC_FRDY) | (0 * AT91C_MC_LOCKE) | ( 0 * AT91C_MC_PROGE) \
                | (0 * AT91C_MC_NEBP) | (FLASH_WAITSTATES) | (MCK_CYCLES * AT91C_MC_FMCN / 0xFF));
}
#endif  // AT91_FLASH_H__

at91_flash.c:
__ramfunc __arm void FlashCommand_RAM(uint32_t command)
{
    AT91C_BASE_MC->MC_FCR = command;
    while(!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
}

__arm void FlashCommand(uint32_t command, uint32_t mode)
{
    uint32_t Status = __get_CPSR();
    do
    {
        __set_CPSR(Status | (1 << CPSR_IRQ_EN));    // disable IRQ
    }
    while(! (__get_CPSR() & (1 << CPSR_IRQ_EN)));
    
    AT91C_BASE_MC->MC_FMR = mode;
    FlashCommand_RAM(command);
    __set_CPSR(Status);             // restore IRQ
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Sanya_kv
сообщение Jun 25 2009, 10:32
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 25-02-09
Из: Россия
Пользователь №: 45 369



Вы абсолютно правы, хочу лишь немного Вас поправить.
Цитата(Сергей Борщ)
Смотрел. Каждая функция этого кода размещается в ОЗУ. Прибита туда гвоздями ключевым словом __ramfunc. В то время как небходимо и достатночно иметь в ОЗУ один-единственный кусочек кода из сообщения №9. Один на все функции. Это 7 ARM-команд. Является такое вольное расходование ОЗУ ошибкой или "писанием левой ногой" - не берусь судить, скорее всего первое вытекающее из второго.
Привильно. Но я с помощью этих функций обновляю прошивку. Ваш вариант для этого не подходит.
Цитата
Вообще-то это забота линкера - подцепить к выходному файлу только используемые функции.
"Захламление" кода делает его менее читаемым. Хотя это на любителя, о вкусах не спорят.

Спасибо за тептые слова блогодарности smile.gif .
Цитата(Сергей Борщ)
"писанный левой ногой"

Цитата(Сергей Борщ)
"Это классический пример "индийского" кода. Написано по принципу "работает - и ладно". Авторитет производителя скорее страдает от таких примеров."


Обидно лишь то, что свой вариант Вы не показали ранее sad.gif , в этом случае я со своим примером даже и не высовывался.

Сообщение отредактировал Sanya_kv - Jun 25 2009, 10:56
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 25 2009, 12:42
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Sanya_kv @ Jun 25 2009, 13:32) *
Но я с помощью этих функций обновляю прошивку. Ваш вариант для этого не подходит.
Хм. А как же мне это удается? Что, по-вашему, мешает ему обновлять прошивку?
Цитата(Sanya_kv @ Jun 25 2009, 13:32) *
"Захламление" кода делает его менее читаемым.
Частично согласен. Но в этом случае мы можем считать этот файл "библиотекой".
Цитата(Sanya_kv @ Jun 25 2009, 13:32) *
Обидно лишь то, что свой вариант Вы не показали ранее sad.gif
Я уже выкладывал его здесь в разных вариациях: 1, 2, 3.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Sanya_kv
сообщение Jun 25 2009, 12:59
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 25-02-09
Из: Россия
Пользователь №: 45 369



Цитата(Сергей Борщ @ Jun 25 2009, 16:42) *
Хм. А как же мне это удается? Что, по-вашему, мешает ему обновлять прошивку?

Имел в виду обновление всей Flash памяти. Скорей всего моя вина, нужно было попроще объяснить.
Цитата(Сергей Борщ)
Я уже выкладывал его здесь в разных вариациях: 1, 2, 3.

Считал, что наши рассуждения актуальны в данной ветви, ссылки на исходники в ней ранее я не нашел.
Но, во сём есть плюсы. Думаю Spoofing получил исчерпывающие ответы.

Сообщение отредактировал Sanya_kv - Jun 25 2009, 13:03
Go to the top of the page
 
+Quote Post
Spoofing
сообщение Jun 25 2009, 15:08
Сообщение #21





Группа: Участник
Сообщений: 11
Регистрация: 21-06-09
Пользователь №: 50 508



Спасибо всем за развернутые листинги. Использую Keil 3.72 - иаровскому __ramfunc соотвествует __ram. Но при попытке использования транслятор начал либо ругаться на тип функции (int) как на no storadge если ставить перед функцией, либо не находил ее тело если после. В итоге пришлось прибегать к Scatter
Код
  FLASH_LOAD 0x100000
  {
  EXE +0 0x40000
    {
    *.o (RESET, +FIRST)
    * (+RO)
    }
  DATA 0x200000 0x7fff
    {
    * (+RW +ZI)
    }
  ISR_EXE 0x208000 0x2000
    {
    flash.o (+RO)
    }
  }
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2009, 15:13
Сообщение #22


Гуру
******

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



ИМХО, лучше функцию записи обрамить:
Код
#pragma arm section CODE = "CODE_RAM"
...
#pragma arm section CODE

А в scatter'е написать:
Код
FLASH_LOAD 0x100000
  {
  EXE +0 0x40000
    {
    *.o (RESET, +FIRST)
    * (+RO)
    }
  DATA 0x200000 0x8000
    {
    * (+RW +ZI)
    }
  ISR_EXE 0x208000 0x2000
    {
    * (CODE_RAM)
    }
  }
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 11:46
Рейтинг@Mail.ru


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