Я видимо в Linker-script не описал область для ram_func.
Нашел на заморском сайте:
Цитата
Also, in your linker map you need to indicate where .ramsection resides:
.data : AT (_etext)
{
_data =3D . ;
KEEP(*(.vectram)) /* added by mthomas */=09
*(.data)
SORT(CONSTRUCTORS)
. =3D ALIGN(4);
*(.ramsection) /* here your ramsection will be located */
} >DATA
. =3D ALIGN(4);
Компилятор, как водится, сначала ругался на 3D ALIGN(4). Убрал слово 3D и компилятор стал выдавать "cannot find _data". В общем, я не понял что они имели ввиду.
Прописал следующим образом:
Код
MEMORY
{
FLASH (r) : ORIGIN = 0x00100000, LENGTH = 0x00040000
DATA (rw) : ORIGIN = 0x00200000, LENGTH = 0x00010000
STACK (rw) : ORIGIN = 0x00210000, LENGTH = 0x00000000
}
...
.data : AT (_etext)
{
_data = .;
*(.data)
SORT(CONSTRUCTORS)
*(.ramfunc)
} >DATA
. = ALIGN(4);
_edata = .;
PROVIDE (edata = .);
main.map мне сообщает:
Код
*(.ramfunc)
.ramfunc 0x00200008 0x14 main.o
0x00200008 EFC_WritePage
Т.е. вроде бы функция находится в ram, но программа все-равно зависает после записи. Но если переподключить устройство, то окажется что во флеш все успешно записалось.
Меня смущает тег FLASH ( r ) (т.е. только чтение) в блоке MEMORY. Но если поставить rw, то компилятор пишет про какой-то overlap между секциями...
Поможите с советом!
Сообщение отредактировал mr.smart - Feb 10 2011, 22:22