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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> IAR + SAM7S, Как узнать размер свободной SRAM?
KAlex
сообщение Nov 12 2007, 12:07
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Есть проект, в котором надо динамически выделять под массив данных область в памяти. Желательно как можно большего размера.
Как на стадии компиляции узнать размер свободной SRAM?
Возможно ли определить это в уже работающей программе?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 12 2007, 12:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(KAlex @ Nov 12 2007, 14:07) *
Возможно ли определить это в уже работающей программе?

А в чем проблемы - начальный адрес Вашего массива Вам известен. Размер RAM у контроллера тоже.
Вычесть из второго первое smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
KAlex
сообщение Nov 12 2007, 12:33
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(zltigo @ Nov 12 2007, 15:22) *
А в чем проблемы - начальный адрес Вашего массива Вам известен.

Неизвестен, в этом то и вопрос.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 12 2007, 13:18
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(KAlex @ Nov 12 2007, 14:33) *
Неизвестен, в этом то и вопрос.

Ерунду какую-то сказали sad.gif если есть обьект, то естественно во время исполнения у него есть адрес.
Для Вашего случая заводите сегмент (можете в нем и какой-нибудь минимальный массивчик завести), линкуете его в конец. Адрес сегмента (или массива известен) размер RAM тоже. Все.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
KAlex
сообщение Nov 12 2007, 13:27
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(zltigo @ Nov 12 2007, 16:18) *
Для Вашего случая заводите сегмент (можете в нем и какой-нибудь минимальный массивчик завести), линкуете его в конец.

А как сказать IAR-у, что этот массив надо линковать последним. Я с этим ни разу не сталкивался.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 12 2007, 13:36
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(KAlex @ Nov 12 2007, 15:27) *
А как сказать IAR-у, что этот массив надо линковать последним.

Явно указав его имя в списке для линкера последним. Конкретика зависит от версии IAR - у 4.x и 5.x линкеры разные.
Если 4.x то например в XCL файле добавляем:
Код
-D_HEAP_RTOS_SIZE=1000  // 4Kb - Dummy minimal space for My Memory Manager
-Z(DATA)HEAP_RTOS+_HEAP_RTOS_SIZE=RAMSTART-RAMEND     // For My memory manager

Ну а дальше:
Код
extern ulong RAMEND;
extern ulong RAMSTART;
#pragma segment="HEAP_RTOS"

    printf( "\tRAM use:%lu Heap:%8X Size:%lu\r",
                                 (ulong)(__segment_begin( "HEAP_RTOS" ))-(ulong)&RAMSTART,
                                 __segment_begin( "HEAP_RTOS" ),
                                (ulong)&RAMEND - (ulong)(__segment_begin( "HEAP_RTOS" )) + 1 );


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
KAlex
сообщение Nov 13 2007, 08:31
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Спасибо. То что надо.
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Nov 18 2007, 08:16
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



zltigo

А вот немного не в тему.

Есть девайс на SAM7, общающийся через USB с хостом, и хочется сделать через тот-же интерфейс сделать обновление прошивки.

Приложение работает под FreeRTOS.
Так вот идея такая:
Получаем по USB команду на апгрейд прошивки, получаем собственно прошивку, запрещаем наглухо прерывания, копируем прошивку в heap, в heap-же копируем функцию записи во флеш, делаем необходимые проверки и передаем управление на эту функцию.

Криво или можно так сделать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 18 2007, 12:34
Сообщение #9


Гуру
******

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



Цитата(Kitsok @ Nov 18 2007, 10:16) *
копируем прошивку в heap, в heap-же копируем функцию записи во флеш, делаем необходимые проверки и передаем управление на эту функцию.
И незадолго до конца работы этой функции пропадает питание. Устройство можно возвращать изготовителю. Было несколько обсуждений на эту тему. Вкратце - загрузчик должен находиться в том же сегменте, что и вектора и получать управление при включении питания. А дальше решать - передавать управление основной программе или делать апгрейд.


--------------------
На любой вопрос даю любой ответ
"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
Kitsok
сообщение Nov 18 2007, 19:32
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(Сергей Борщ @ Nov 18 2007, 15:34) *
И незадолго до конца работы этой функции пропадает питание. Устройство можно возвращать изготовителю. Было несколько обсуждений на эту тему. Вкратце - загрузчик должен находиться в том же сегменте, что и вектора и получать управление при включении питания. А дальше решать - передавать управление основной программе или делать апгрейд.


Спасибо за ссылку, почитаю.

С опасением полностью согласен.
Причина, по которой я не горю желанием писать полноценный бутлоадер (для поиска: загрузчик, bootloader, бутлодырь wink.gif) - необходимо реализовать весь стек USB - других интерфейсов у устройства попросту нет...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2007, 13:13
Сообщение #11


Гуру
******

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



Цитата(Kitsok @ Nov 18 2007, 21:32) *
необходимо реализовать весь стек USB - других интерфейсов у устройства попросту нет...
А ОЗУ внешнее? Внутреннего-то не хватит, чтобы всю прошивку в heap поместить. Для прошивки достаточно держать в ОЗУ функцию из нескольких команд
Код
__ramfunc __arm void FlashCommand_RAM(uint32_t command)
{
    AT91C_BASE_MC->MC_FCR = command;
    while(!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
}
Возможно имеет смысл ее держать в ОЗУ постоянно. Все остальное может жить в защищенном от стирания секторе флеш. Может имеет смысл при приеме прошивки складывать ее в свободную область флеш, а загрузчик будет копировать из этой области в рабочие адреса? Тогда сбои питания не страшны - одна из копий прошивки всегда будет целой, а сам копировщик вообще нестираемым.


--------------------
На любой вопрос даю любой ответ
"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
Kitsok
сообщение Nov 20 2007, 10:52
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(Сергей Борщ @ Nov 19 2007, 16:13) *
А ОЗУ внешнее? Внутреннего-то не хватит, чтобы всю прошивку в heap поместить. Для прошивки достаточно держать в ОЗУ функцию из нескольких команд
Код
__ramfunc __arm void FlashCommand_RAM(uint32_t command)
{
    AT91C_BASE_MC->MC_FCR = command;
    while(!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
}
Возможно имеет смысл ее держать в ОЗУ постоянно. Все остальное может жить в защищенном от стирания секторе флеш. Может имеет смысл при приеме прошивки складывать ее в свободную область флеш, а загрузчик будет копировать из этой области в рабочие адреса? Тогда сбои питания не страшны - одна из копий прошивки всегда будет целой, а сам копировщик вообще нестираемым.


ОЗУ встроенное, SAM7S256, но прошивка ограничивается размером в 16 кб, больше мне и не надо.

Рассматриваю возможность дописывания аппликухи и организации dual firmware.

А вот глупый вопрос - можно ли работая из флеша писать другие сектора этого флеша, или обязательно копировать себя в RAM и запускаться оттуда?

Потому как если можно, то изменения будут касаться исключительно проверки версии и CRC с дальнейшей передачей управления.

Хотя криво это все, по-хорошему, надо бутлоадер писать а-ля SAM-BA и не выпендриваться.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2007, 12:30
Сообщение #13


Гуру
******

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



Цитата(Kitsok @ Nov 20 2007, 12:52) *
А вот глупый вопрос - можно ли работая из флеша писать другие сектора этого флеша, или обязательно копировать себя в RAM и запускаться оттуда?
Все, кроме приведенной мной выше функции может работать из флеша. На время выполнения этой функции флеш блокируется (поэтому либо запрещайте прерывания, либо переносите обработчики и вектора в ОЗУ).
Цитата(Kitsok @ Nov 20 2007, 12:52) *
Хотя криво это все, по-хорошему, надо бутлоадер писать а-ля SAM-BA и не выпендриваться.
Тем более что в USB есть (специальный класс?) возможность загрузки firmware. У атмела в апликухах кажется что-то было. Может и не так страшно?


--------------------
На любой вопрос даю любой ответ
"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
Kitsok
сообщение Nov 20 2007, 13:52
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(Сергей Борщ @ Nov 20 2007, 15:30) *
Тем более что в USB есть (специальный класс?) возможность загрузки firmware. У атмела в апликухах кажется что-то было. Может и не так страшно?


Да в общем-то, наверное я склонюсь к этому варианту wink.gif
Go to the top of the page
 
+Quote Post
_dem
сообщение Nov 20 2007, 21:21
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



имхо, имелось в виду немного не то :

Так как флеш пишется постранично, и у флеш контроллера есть внутренний буфер на одну страницу, то на время подготовки этой страницы (записи значений в буфер) можно работать из флеша

а вот во время выполнения команды записи (предложенная Сергеем функция) все должно быть остановлено и сама функция должна работать из RAM

Учитывая небольшой размер вашей прошивки, я бы вообще порекомендовал вам после запуска копировать прошивку в RAM и делать REMAP - и работайте с флешем когда и как вам хочется. Естественно, прошивка должна быть слинкована с правильными адресами (работа из RAM). А копирование можно сделать в cstartup на ассемблере.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 16:02
Рейтинг@Mail.ru


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