Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: отладка из RAM в кейл
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
SpiritDance
Случилась предышка в работе над проектом. Наконец дошли руки до прикручивания MT-link5 к кейл, со всем разобрался. Пишется флеш, отладчик ходит по шагам, брекпоинты работают - сказка вобщем. Остался только один вопрос как отлаживатся из RAM? Хоть намекните, а?
aaarrr
Собрать проект для работы из RAM и отлаживаться. Или я что-то не так понял?
SpiritDance
Цитата
Собрать проект для работы из RAM и отлаживаться

Я не понял. Как это сделать? С помощью скаттер файла? Если да то киньте пример для работы в ОЗУ.
Второй вопрос достаточно ли отладчику поставить галочку load application at startup чтобы загрузилось именно ОЗУ.
aaarrr
Скаттер для работы из ОЗУ в SAM64:

Код
FLASH 0x00000000 0x00010000
{
    RAM 0x00200000 0x00004000
    {
        * (+RO, +RW, +ZI)
    }
}


Места там только маловато.
SpiritDance
Я уже устал говорить Вам спасибо smile.gif С меня пиво... ну или что-нибудь полезное. smile.gif
SpiritDance
Все-таки я чего-то не понимаю. Скаттер-файл
Цитата
LR_IROM1 0x00000000 0x00004000
{ ; load region
RW_IRAM1 0x00200000 0x00004000
{ ; RW data
*.o (RESET, +First)
* (+RO +RW +ZI)
}
}

Вижу ругань
Цитата
usarttest.axf: Error: L6202E: __main.o(!!!main) cannot be assigned to non-root region 'RW_IRAM1'
usarttest.axf: Error: L6202E: anon$$obj.o(Region$$Table) cannot be assigned to non-root region 'RW_IRAM1'


Я правильно понимаю что
RO - код
RW - данные
ZI - стек?

Что означает строчка
*.o (RESET, +First)?

Ну и самый главный вопрс что не так? Почему не нравится load-регион с нулевым начальным адресом?Размер пробовал изменять до 0x00204000 результат тот же.
vet
RO - Read-only
RW - Read & Write
ZI - Zero-initialized
SpiritDance
А дальше? smile.gif
aaarrr
Цитата(SpiritDance @ Aug 22 2006, 15:17) *
Все-таки я чего-то не понимаю. Скаттер-файл


Наверное, нужно написать что-то вроде:
Код
LR_IROM1 0x00000000 0x00004000
{ ; load region
    RO_IROM1 0x00000000 0x00004000
    {
        *.o (RESET, +First)
        __main.o (*)
        * (Region$$Table)
        * (ZISection$$Table)
    }
    RW_IRAM1 0x00200000 0x00004000  
    { ; RW data
        * (+RO +RW +ZI)
    }
}


Цитата(SpiritDance @ Aug 22 2006, 15:17) *
Что означает строчка
*.o (RESET, +First)?

Это значит, что секция RESET будет расположена в начале адресного пространства.
SpiritDance
Не-а. Не угадали.
Цитата
usarttest.axf: Error: L6202E: __scatter.o(!!!scatter) cannot be assigned to non-root region 'RW_IRAM1'
usarttest.axf: Error: L6202E: __scatter_copy.o(!!handler_copy) cannot be assigned to non-root region 'RW_IRAM1'
usarttest.axf: Error: L6202E: __scatter_zi.o(!!handler_zi) cannot be assigned to non-root region 'RW_IRAM1'

Объясните что значит это шаманство если нетрудно.

Насколько я понял часть кода, включая то что находится в main грузится во флеш, которая в начале адресного пространства до ремапа? если так то почему так криво?
aaarrr
Цитата(SpiritDance @ Aug 23 2006, 10:17) *
Не-а. Не угадали.

Бывает smile.gif

Цитата(SpiritDance @ Aug 23 2006, 10:17) *
Объясните что значит это шаманство если нетрудно.

Это отнюдь не шаманство. Просто нужно указать линкеру, что загрузчик (scatter) нужно оставить во флеш, для ADS было достаточно указать __main.o (*). Попробуйте добавить в RO_IROM1 строку __scatter* (*) - должно помочь, по-идее.

Цитата(SpiritDance @ Aug 23 2006, 10:17) *
Насколько я понял часть кода, включая то что находится в main грузится во флеш, которая в начале адресного пространства до ремапа? если так то почему так криво?

Во-первых, это не тот main, что int main(void), это __main из стартапа.
Во-вторых забудьте слово "remap" применительно к процессору AT91SAM7S64. Не нужен он.
SpiritDance
Ясно я попробую так упаковать все файлы которые линкер попросит, главное чтобы это не вся программа была. smile.gif попозжее...
SpiritDance
Уряяя! Получилось!
Код
LR_IROM1 0x00000000 0x00004000
{; load region
    RO_IROM1 0x00000000 0x00004000
    {
        *.o (RESET, +First)
        __main.o (*)
        __scatter*.o (*)
        * (Region$$Table)
        * (ZISection$$Table)
    }
    RW_IRAM1 0x00200000 0x00004000  
    {; RW data
        * (+RO +RW +ZI)
    }
}
aaarrr
Ну вот и славно. Пора и мне на RealView переползать, наверное.
zorromen
Ну с отладкой в рам, это понятно. (После того что здесь написано). Так вот, неочень ясно, это что хоть я и отлаживаю программу с Рам. Тока всеравно придется писать заголовки в ром. А ром ведь не бесконечный цикл перезаписи имет. Так я невижу особой пользы отладки программы в рам, если всеравно портиться ром. И еще имею Ulink и lpc2148 Keil. Вот ворос, я мож непонял чего, но перед тем sкак начать отладку, требуется программу сперва туда записать, Flash->Download, А потом начинать отладкую. Верно? Просто после АВР, когда заливаласьпрошивка вседа при одкладке, это неного приятно удивтло. А чего я спрашиваю, казалось уже ответив. Просто когда я запускаю отладку с параметрами Download to Flash, то он неможет залить прошивку, пишет
/----------------------/
Ulink ARM Error |X|
/----------------------/
Memory Missmatch!
Adress: 0x00000000
Value =0xFF
Expected = 0x18

Это как понимать? А через Flash->Download шьется.
romashko
Цитата(zorromen @ Oct 5 2007, 05:29) *
Тока всеравно придется писать заголовки в ром. А ром ведь не бесконечный цикл перезаписи имет. Так я невижу особой пользы отладки программы в рам, если всеравно портиться ром.


ничего там не надо писать! и скатер править тоже не надо!
далее для примера с AT91SAM7****:

в Project/Options for Target/Target заполняем поля:
Read/Only memory areas фишка на IROM1 указываем start: 0x202000 size:0x2000
Read/Write memory areas фишка на IRAM1 указываем start: 0x204000 size:0x2000

в Project/Options for Target/Linker ставим галку use memory layout from Target Dialog
(чтоб со всякими катерами не трахаца)

в стартапе коментим директивы условной компиляции (remap/copy vectors):
Код
; Copy Exception Vectors to Internal RAM
ADR     R8, Vectors        ; Source
LDR     R9, =RAM_BASE      ; Destination
LDMIA   R8!, {R0-R7}       ; Load Vectors
STMIA   R9!, {R0-R7}       ; Store Vectors
; Remap on-chip RAM to address 0
MC_BASE EQU     0xFFFFFF00     ; MC Base Address
MC_RCR  EQU     0x00           ; MC_RCR Offset
LDR     R0, =MC_BASE
MOV     R1, #1
STR     R1, [R0, #MC_RCR]  ; Remap


далее получаем бинарник и пишем его самбой в SRAM по адресу 0x202000
и делаем Go 0x202000

для приличия снести в сатртапе асм-инструкции, переводящие арм в режим юзера
а супервизору разрешить irq,fiq (убрать биты в CPSR I_bit, F_bit)

и плеш для дебуга в срам не нужна! wink.gif
Leen
Это мой стандартный скаттер для отладки.
Код
RAM_LOAD 0x200000// начало озу в SAM7S
  {
  EXE +0 0x6000// длина для исполняемого кода и констант
    {
    *.o (RESET, +FIRST)// первым в эту область линкуем модуль RESET
    * (+RO)// затем все остальные readonly объекты
    }
  DATA 0x206000 0x2000// регион для данных (см. выше)
    {
    * (+RW +ZI)// кладем все изменяемые данные сюда
    }
  ISR_EXE 0x208000 0x2000// и отдельный регион для функций из объектного файла interrupt.o
// в этот регион попадут все функции, определенные в файле interrupt.c.
    {
    interrupt.o (+RO)
    }
  }

Для отладки из озу в кейле надо прогрузить полученный файл в память контроллера и не забыть сделать ему РЕМАП:
Код
// грузим файл в контроллер
Load obj\vm_ram.axf INCREMENTAL
//делаем ремап
_WDWORD(0xFFFFFF00,0x00000001);//*   Toggle RESET The remap - содрано в ините
// кейловского примера

Этот файл надо скормить кейлу под соусом "ини-файл для отладчика" на вкладке настройки последнего в свойствах проекта.
zorromen
Спасибо. Вах. wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.