Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: А возможно ли считать из внутренней Flash LPC21xx?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ASergej_R19
Понятно, что во внутреннюю flash память можно писать с помощью IAP. А можно ли как-то считать оттуда данные из выполняющейся программы? IAP этого не позволяет сделать - только сравнить, а считать возможно ли?

p.s.: lpc2103.
meister
Цитата(ASergej_R19 @ May 8 2008, 22:33) *
Понятно, что во внутреннюю flash память можно писать с помощью IAP. А можно ли как-то считать оттуда данные из выполняющейся программы? IAP этого не позволяет сделать - только сравнить, а считать возможно ли?

p.s.: lpc2103.


Если CRP не стоит, с помощью JFlash вся флэш запросто считывается по JTAG. Это если снаружи, а изнутри - там вообще проблем нет.
ASergej_R19
Цитата(meister @ May 8 2008, 22:42) *
Если CRP не стоит, с помощью JFlash вся флэш запросто считывается по JTAG. Это если снаружи, а изнутри - там вообще проблем нет.


Спасибо за ответ! НО...

Нет, я имею ввиду изнутри - то есть работает моя прога внутри lpc. Пишет какие-то данные через IAP во внутренний флэш АРМа, а потом сама же хочет считать оттуда данные - как?
meister
Цитата(ASergej_R19 @ May 8 2008, 23:04) *
Спасибо за ответ! НО...

Нет, я имею ввиду изнутри - то есть работает моя прога внутри lpc. Пишет какие-то данные через IAP во внутренний флэш АРМа, а потом сама же хочет считать оттуда данные - как?


Наверное, для вас это будет откровением, но это можно с помощью memcpy или даже так:

Код
unsigned char const * const der_base = 0;
unsigned char q = der_base[0x12345];


прочитает байт по адресу 0x12345.
ASergej_R19
Цитата(meister @ May 8 2008, 23:15) *
Наверное, для вас это будет откровением, но это можно с помощью memcpy или даже так:


Вот спасибо! :-)
И тогда последний глупый вопрос - а можно ли забить область flash константами, на этапе компиляции проекта?
aaarrr
Цитата(ASergej_R19 @ May 9 2008, 01:28) *
И тогда последний глупый вопрос - а можно ли забить область flash константами, на этапе компиляции проекта?

Можно, конечно.
Код
const char data[] = {...};

Только проверьте, что линкер действительно положил rodata в область flash.
GetSmart
Скорее всего в вопросе про константы во флэш имелся ввиду отдельный сегмент флэша с конкретным адресом, который будет потом переписываться независимо от программы.

Код
#pragma location=0x1000
const char data[4096] = {...};

или другой вариант:

const char data[4096] @ 0x1000 = {...};

если же не нужна начальная инициализация, то так:

const __no_init char data[4096] @ 0x1000;

Только приходится выделять под такую константу весь сегмент, например 4096 байт. Это вобщем проще, чем лезть в XCL файл и там выделять независимый от CODE сегмент для констант и обзывать его своим уникальным именем.
ASergej_R19
Цитата(GetSmart @ May 9 2008, 04:15) *
Скорее всего в вопросе про константы во флэш имелся ввиду отдельный сегмент флэша с конкретным адресом, который будет потом переписываться независимо от программы.


Да! Спасибо! Именно то, что нужно.
То есть есть массив, который забивается константами, сам массив находится в отдельном сегменте флэша. Этот массив можно будет править через IAP и читать, если нужно.
Всем огромное спасибо!
ASergej_R19
Цитата(GetSmart @ May 9 2008, 04:15) *
const char data[4096] @ 0x1000 = {...};


Щас добрался до компа и попробовал данную конструкцию - не работает. Ругается:
"error: #7: enrecognized token". :-( и прагму такую не знает...

Keil 3.15 для arm

Для переменных и констант нашел, что можно __attribute__ ((section ("секция"))) - так указывать, а вот чтобы впрямую адрес - что-то не нашел. Может кто подскажет еще?
zltigo
Цитата(ASergej_R19 @ May 11 2008, 09:20) *
Щас добрался до компа и попробовал данную конструкцию - не работает. Ругается:
"error: #7: enrecognized token". :-( и прагму такую не знает...

Правильно делает - то, что приводилось в примере - это непереносимая приблуда для старого IARовского компилятора. В общем случае этим линкер занимается - описываете свой сегмент и указваете линкеру куда его линковать.



Цитата(GetSmart @ May 9 2008, 02:15) *
Это вобщем проще, чем лезть в XCL файл и там выделять независимый от CODE сегмент для констант и обзывать его своим уникальным именем.

Проще один раз понять, что это дело линкера и сделать независимо от IAR-овских приблуд, чем полагаться на непереносимые и уже справедливо похеренные фичи компилятора.
aaarrr
Для RVCT:
Код
В "C" файле:

#pragma arm section rodata = "mydata"
const char data[4096];
#pragma arm section rodata

В скрипте линкера:

FLASH 0x00 0x10000
{
    FLASH0 0x0000 0xf000
    {
        * (+RO)
    }
    FLASH1 0xf000 0x1000
    {
        * (mydata)
    }
    RAM 0x10000000 0x400000
    {
        * (+RW, +ZI)
    }
}

Секция mydata с массивом data будет размещена по адресу 0xf000 flash. Цифры в скрипте взяты с потолка.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.