Цитата(Real_Bastard @ Nov 9 2012, 13:17)

Необходимо:
1. Разместить функцию write_flash() в ОЗУ.
2. В конец FLASH по заданному адресу вставить массив.
...
Мне, как и
aaarrr, хотелось бы увидеть map безобразия. Правда, прежде, чем понимать ее и исправлять Ваш скаттер, я бы предложил свое безобразие

: мной было замечено, что 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