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

 
 
> KEIL и размещение функции в RAM.
Real_Bastard
сообщение Nov 9 2012, 11:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 7-11-06
Из: Санкт-Петербург
Пользователь №: 22 041



Добрый день.
Необходимо:
1. Разместить функцию write_flash() в ОЗУ.
2. В конец FLASH по заданному адресу вставить массив.

Делаю два файла flash_write.c и flash_data.c пихаю в один функцию записи, в другой данные

Пишу скаттер.
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000-0x1000 { ; load address = execution address
*.o (RESET, +First)
* (+RO)
.ANY (*)
}
FLASH_DATA 0x0801F000 FIXED 0x1000 {
flash_data.o (*)
}

RW_IRAM1 0x20000000 0x00008000 { ; RW data
.ANY (+RW +ZI)
flash_write.o (+RO)
}
}


Все отлично. Данные в нужном месте. Функция записи-в ОЗУ.

НО!!!! Копия write_flash() кладется в конец FLASH и в начале программы копируется из нее в ОЗУ.
И естественно занимает память моих данных, которые я тоже хочу класть в конец FLASH

Как заставить компилятор класть копию функции в другое место???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Nov 9 2012, 22:31
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Real_Bastard @ Nov 9 2012, 13:17) *
Необходимо:
1. Разместить функцию write_flash() в ОЗУ.
2. В конец FLASH по заданному адресу вставить массив.
...

Мне, как и aaarrr, хотелось бы увидеть map безобразия. Правда, прежде, чем понимать ее и исправлять Ваш скаттер, я бы предложил свое безобразие wink.gif: мной было замечено, что KEIL странно размещает, если куски находятся в рамках одного LOAD REGIONS. Поэтому я взял за правило создавать свой регион под каждый кусок. Думаю, именно это поможет.

Для иллюстрации же приведу скаттер для проекта на EFM32G210F128. EFM32 имеют таковую особенность, что функции записи во Flash ОБЯЗАНЫ быть размещены в RAM (в STM32 подобные функции работают и из Flash, если, конечно, пишут в другие страницы). Похоже на Вашу задачу. Так вот, в библиотеке к EFM32 по работе с Flash ОЗУ-шные функции предварены #pragma:
Код
#pragma arm section code="ram_code"
msc_Return_TypeDef MSC_WriteWord(uint32_t *address, void const *data, int numBytes)
{
...
}

А в помощи написано:
Цитата
This function MUST be executed from RAM. For Keil uVision 4 you must define a section called "ram_code" and place this manually in your project's scatter file.

В проекте у меня также есть область данных, помещенная в конец Flash. Правда, в эту область сведены различные константы из разных файлов проекта применением именованной секции. Думаю, такой метод подойдет и Вам:

Код
// где-то в file1.c
volatile const unsigned long
    the_address __attribute__((section ("SETTINGS"), used)) = NODE_ADDRESS;

// а еще в file2.c
volatile const unsigned char
    the_flags __attribute__((section ("SETTINGS"), used)) = 0x10;

А теперь собственно скаттер:

Код
LR_IROM1 0x00000000 0x00000800  {; load region size_region
  ER_IROM1 0x00000000 0x00000800  {; load address = execution address
   *.o (BOOT, +First)
  }
}

LR_IROM2 0x00000800 (0x00020000-0x800)  {; load region size_region
  ER_IROM2 0x00000800 (0x00020000-0x800)  {; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00004000  {; RW data
   *(ram_code)                ; flash erase/write functions
   .ANY (+RW +ZI)
  }
}

LR_IROM3 (0x00020000-512) 512  {    
  ER_IROM3 (0x00020000-512) 512  {  
   *(SETTINGS)
  }
}

На LR_IROM1 внимание не обращайте (заморочки с bootloader в EFM32G).
В LR_IROM2 раздел ER_IROM2 собирает весь код и RO, а в раздел RW_IRAM1 помещена та самая секция ram_code. Установочные константы собраны в LR_IROM3/ER_IROM3, которая "отгрызает" 512 байт сверху Flash.

Проверено, работает (функции, копируемые в ОЗУ, реально находятся где-то внутри основного кода в ER_IROM2).

Надеюсь, мое безобразие поможет.

Сообщение отредактировал KnightIgor - Nov 9 2012, 22:36
Go to the top of the page
 
+Quote Post



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

 


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


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