Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите по АРМ7 - Keil
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ivevg
Как в Keile записать таблицу во Flash?

пишу
volatile char const massiv[512] __at(0x30000)={.....};

При программировании не шьется.
Видимо как-то надо настраивать параметры линкера.
Как сделать?
VAI
как-то не вяжется volatile и const в применении к одной переменной...
а если так

Код
const massiv[512] = {.....};
GetSmart
Получится массив INTов.
VAI
я char пропустил....


const char massiv[512] = {.....};
ivevg
Цитата(VAI @ Jul 4 2007, 11:10) *
я char пропустил....
const char massiv[512] = {.....};


Дело не в этом. Все компилируется и под симулятором работает, а при отладке U-Link'om массив не ложится во flash. В IARе ,кстати, все работает.
Надо, видимо, правильно написать Scatter-файл.

В Хелпе по этому поводу написано:

// Locate Variables to Specific Addresses
//Using the __at macro that is defined in the header file absacc.h allows you to locate variables to absolute //addresses as shown below:

C Example:
#include <absacc.h>

const char MyText[] __at (0x1F00) = "TEXT AT ADDRESS 0x1F00";
int x __at (0x40003000); // variable at address 0x40003000

и ничего больше.
SpiritDance
Хм. а может нужно 0x00130000 или где там у вашего камня флеш. Вобщем абсолютный адрес.
VAI
А зачем для массива абсолютный адрес?
В map-файле посмотрите, где массив располагается..
GetSmart
ivevg, укажите какой камень шьёте.

И ещё прикрепите XCL-файл сюда
Сергей Борщ
Цитата(GetSmart @ Jul 4 2007, 15:07) *
И ещё прикрепите XCL-файл сюда
А смысл?
Цитата(ivevg @ Jul 4 2007, 12:57) *
В IARе ,кстати, все работает.
Надо растить местных спецов по кейлу.
GetSmart
Цитата(Сергей Борщ)
А смысл?
Смысл в том, что отладчику по барабану где находится флэш и сколько её там. А есть ли по тому адресу флэш узнает только программатор когда будет шить. Мне что-то очень кажется что ситуация именно такая. Короче, можно скомпилить прогу для LPC2138 (512KB flash) и в отладчике будет работать идеально. А когда попытаться её прошить в LPC2132, у программатора желание куда-то улетучится.
ivevg
Цитата(VAI @ Jul 4 2007, 15:33) *
А зачем для массива абсолютный адрес?
В map-файле посмотрите, где массив располагается..


Адрес затем, чтобы потом IAPом переписать таблицу, если понадобится. Кроме того, если не указывать абсолютный адрес, то const все равно располагается в ОЗУ.

Цитата(GetSmart @ Jul 4 2007, 16:07) *
ivevg, укажите какой камень шьёте.

И ещё прикрепите XCL-файл сюда


Камень LPC2138
XCL-фаил в ИАРЕ, а я про KEIL говорю!
defunct
Цитата(ivevg @ Jul 4 2007, 19:29) *
Адрес затем, чтобы потом IAPом переписать таблицу, если понадобится. Кроме того, если не указывать абсолютный адрес, то const все равно располагается в ОЗУ.

Совсем не понятно что вы имеете в виду.
для доступа из-вне можно посмотреть расположение массива в map файле.
Для доступа внутри достаточно просто обратиться к массиву.

Так в чем же заключается глубокий смысл фразы "чтобы потом IAPом переписать таблицу".
Ну не понимаю я каким боком тут IAR если программа пишется под keil.

Цитата
Цитата

const char massiv[512] =...

Дело не в этом. Все компилируется и под симулятором работает, а при отладке U-Link'om массив не ложится во flash.

А почему у меня ложится во флеш и ULink'ом и через RDI и в симуляторе?
iit
Цитата(ivevg @ Jul 3 2007, 21:19) *
Как в Keile записать таблицу во Flash?

пишу
volatile char const massiv[512] __at(0x30000)={.....};

При программировании не шьется.
Видимо как-то надо настраивать параметры линкера.
Как сделать?


Послушайте, то что вам говорят.
const char massiv[512]; и без указания абсолютного адреса ляжет во флэш.
Scatter файл надо писать, если вы в options for target на закладке Linker укажите путь до Scatter file.
Хотя в большинстве случаев этого делать не надо, достаточно правильно выставить галочки на закладке таргет.
Проверьте идентичность процессоров на закладке Device, у отладчика и у флэш лоадера. Желательно чтобы они совпадали.
Не плохо было-бы дать выдержку из мап файла.
SpiritDance
стоп. Погодите-ка а компилер вы какой используете? Если реалвью, то ключевого слова __at там нет просто. Это относится к компилеру CARM.
А скаттеры - это как раз rv. Только там нельзя задавать адреса переменным, а можно только распихивать их по сегментам с помощью прагм, а уже сегментами управлять в скаттер-файле

Вполне возможно что ваш массив удален как unused variable, если вы к нему напрямую нигде не обращаетесь.

Да и еще. Вы абсолютно уверены, что массив не шьется? Что-то уж очень странно... массив-отдельно, прошивка -отдельно.

И еще вопрос.. а вы ремап не делаете случаем?
ivevg
Цитата(defunct @ Jul 5 2007, 01:54) *
Совсем не понятно что вы имеете в виду.
для доступа из-вне можно посмотреть расположение массива в map файле.
Для доступа внутри достаточно просто обратиться к массиву.

Так в чем же заключается глубокий смысл фразы "чтобы потом IAPом переписать таблицу".
Ну не понимаю я каким боком тут IAR если программа пишется под keil.
Дело не в этом. Все компилируется и под симулятором работает, а при отладке U-Link'om массив не ложится во flash.
А почему у меня ложится во флеш и ULink'ом и через RDI и в симуляторе?


Вы путаете IAR и IAP. Таблицу во Flash нужно изменять. IAP- ин аппликешн программинг


Цитата(SpiritDance @ Jul 5 2007, 09:44) *
стоп. Погодите-ка а компилер вы какой используете? Если реалвью, то ключевого слова __at там нет просто. Это относится к компилеру CARM.
А скаттеры - это как раз rv. Только там нельзя задавать адреса переменным, а можно только распихивать их по сегментам с помощью прагм, а уже сегментами управлять в скаттер-файле

Вполне возможно что ваш массив удален как unused variable, если вы к нему напрямую нигде не обращаетесь.

Да и еще. Вы абсолютно уверены, что массив не шьется? Что-то уж очень странно... массив-отдельно, прошивка -отдельно.

И еще вопрос.. а вы ремап не делаете случаем?


__at это не ключевое слово, а макрос в rv. Описан в <absacc.h>
Масиив в мап-файле присутствует
Leen
Цитата(ivevg @ Jul 5 2007, 17:07) *
Масиив в мап-файле присутствует

А в hex, значит, не присутствует?.. Странно... Создал проект для SAM7 с компилером RVCC, объявил массив как const char array[512] = {0,1,2,3,4,5,6/*и так далее до 0x0F и по новой*/};
Все 0x200 инициализировал на месте, ессно.
Скомпилил, перелил из эльфа в хекс...
Смотрю мапу:
__fplib_config_pureend_doubles 0x001004c0 ARM Code 0 fpinit.o(x$fpl$fpinit)
array 0x001004c8 Data 512 main.o(.constdata)
Region$$Table$$Base 0x001006c8 Number 0 anon$$obj.o(Region$$Table)
Смотрю хекс:
:1004B00010402DE9F3FFFFEB0010A0E3001080E5F2
:1004C0001040BDE81EFF2FE10001020304050607EE
:1004D00008090A0B0C0D0E0F0001020304050607A4
:1004E00008090A0B0C0D0E0F000102030405060794
:1004F00008090A0B0C0D0E0F000102030405060784
|
|тут такая же лабуда по всем вырезанным адресам...
|
:1006A00008090A0B0C0D0E0F0001020304050607D2
:1006B00008090A0B0C0D0E0F0001020304050607C2
:1006C00008090A0B0C0D0E0FD806100000002000C0
:0806D000E804000068011000BD

Для подтверждения прикладываю полностью скомпиленный проект, со всем объектным филе.

ИМХО, единственное, для чего надо абсолютное расположение - это хранение данных на флэше вместо еепрома - чтоб по старице уравнять. Но мне проще еепром прикрутить, если, конечно, тока на него не жалкоsmile.gif А бывало и такоеsmile.gif
ivevg
В общем вот чем закончились мои опыты:
В программе пишу const char ttt[...] __at(0x...)={...}

Эта хрень должна писаться по указанному адресу, но не пишется ни в какую.
Решил попробовать на другом процессоре.
Беру плату с LPC2103 включаю - все работает прекрасно, пишется на раз.
Беру другую плату с 2103 - то же самое что и раньше - не пишется.

Разница между платами: первая от Keila (синяя маска, золоченые контакты).
вторая от microem.

Плата с которой начинал - LPC2138 от Olimex.(то же не работает)

В чем фишка - непонятно. Буду разбираться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.