Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Muxamor
Понадобилось прерывание от UART0 и всплыла следующая проблема, так как у меня программа записывается не с начало внутренней флэшки а с адреса 40002000 из за этого не правильно обрабатывается прерывание. Если писать прогу с начало тоесть с адреса 40000000 то все отлично работает.
Подскажите где нужно подправить . help.gif
Камень STR711FR2
DASM
видимо туда, где все отлично работает. В чем вопрос то ? А то "у меня все хорошо, подскажите, я что-то делаю не так ?"
Muxamor
Дак я и спрашиваю что нужно подправить чтобы прерывание работало когда прошивку я заливаю с адреса 40002000?
Ivan_Kov
Не забывайте, что по адресу 0000000 у арма должны храниться вектора прерываний. А микроконтроллер должен проецировать флеш-память на нулевой адрес. Таким образом адрес 40000000(начало флеш) должен содержать вектора прерываний. если вы грузите программу с адреса 40002000, то может случиться, что вектора оказываются не там где надо.


Если с векторами все в порядке, то я так понимаю что нужно просто правильно настроить линковщик. т.е нужно указать ему, что остальная программа должна находиться по адресу 40002000 (я правда не понимаю зачем так ее грузить). Как это сделать, зависит уже от того каким компилятором и средой вы пользуетесь.
Muxamor
Цитата(Ivan_Kov @ Feb 21 2007, 13:11) *
Не забывайте, что по адресу 0000000 у арма должны храниться вектора прерываний. А микроконтроллер должен проецировать флеш-память на нулевой адрес. Таким образом адрес 40000000(начало флеш) должен содержать вектора прерываний. если вы грузите программу с адреса 40002000, то может случиться, что вектора оказываются не там где надо.


Если с векторами все в порядке, то я так понимаю что нужно просто правильно настроить линковщик. т.е нужно указать ему, что остальная программа должна находиться по адресу 40002000 (я правда не понимаю зачем так ее грузить). Как это сделать, зависит уже от того каким компилятором и средой вы пользуетесь.

Грузить ее приходиться так потомучто с а дреса 40000000 и по 40002000 уменя лежит бутлоудер!

Соответвенно в lnkarm_flash.xcl я урезаю флешку для проги котрую буду лить на адрес 40002000.
Как посмотреть что вектора находться там где надо?
Ivan_Kov
Цитата(Muxamor @ Feb 21 2007, 10:25) *
Как посмотреть что вектора находться там где надо?


1) Посмотреть что находится по адресу 0.
2) Убедится, что на адрес 0 проецируется то, что вы хотите.

Рекомедую прочитать в мануал "Memory Organization"
Сергей Борщ
Цитата(Muxamor @ Feb 21 2007, 09:03) *
Дак я и спрашиваю что нужно подправить чтобы прерывание работало когда прошивку я заливаю с адреса 40002000?
ручками копировать ваши вектора в ОЗУ и делать ремап, чтобы они оказались начиная с адреса 0.
Muxamor
Цитата(Сергей Борщ @ Feb 21 2007, 13:38) *
Цитата(Muxamor @ Feb 21 2007, 09:03) *

Дак я и спрашиваю что нужно подправить чтобы прерывание работало когда прошивку я заливаю с адреса 40002000?
ручками копировать ваши вектора в ОЗУ и делать ремап, чтобы они оказались начиная с адреса 0.


Ремап понятно. А вот как пернести вектора в 0 адрес по подробней плиз пожно и примечик если у кого есть ?
Ivan_Kov
Цитата(Muxamor @ Feb 22 2007, 08:16) *
Ремап понятно. А вот как пернести вектора в 0 адрес по подробней плиз пожно и примечик если у кого есть ?


В начало RAM (адрес 0x20000000) скопировать вектора прерываний (осмелюсь предположить, что это 64 байта из 0x40002000). Для проецирования RAM на адрес 0, в регистре PCU_BOOTCR (BOOTCONF) установить 2 младших бита = 01b.

В качестве примера могу дать загрузчик ucLinux для str71x, смотрите файл "71x_init.s".Нажмите для просмотра прикрепленного файла
Сергей Борщ
Цитата(Muxamor @ Feb 22 2007, 07:16) *
Ремап понятно. А вот как пернести вектора в 0 адрес по подробней плиз пожно и примечик если у кого есть ?
Ну... эта... аж слов нет.
memcpy(VECTORS_IN_RAM, VECTORS_IN_FLASH, 0x40); - примерно так.
Ivan_Kov
Цитата
Вынужден обратиться к вам через лично письмо так как очень нужно зделать прирывание .
Не моглши бы вы прислать как именно нужно написать копирование векторов.
Если нужно могу выслать совй 71x_init.s.
Должен признать что не евляюсь знатаком асеблера ARM ядра. sad.gif
Вот 51 асемблер другое дело на арм перлез совсем недавно и еще не знаю всех тонкостей!
Зарание спасибо .

К сожалению, не могу оказать вам помощь в полной мере. Во первых, потому как и сам я новичок в этой области. Я начал заниматься embeded буквально пару-тройку месецев назад, т.к. сменил работу. До этого имел дело только с Win. Во-вторых, сами понимаете, что первые месяцы на новом месте - самые сложные, поэтому писать и отлаживать эту процедуру просто нет времени. Честно говоря, не вижу ничего супер сложного в том, чтобы скопировать из одной области памяти - в другую. И совсем не обязательно делать это на ассемблере, C - вполне справиться с этой задачей.
Из того что копирование вызывает у вас затруднения, я делаю вывод, что у вас есть пробелы в знании структуры микроконтроллера, очень рекомендую почитать мануал к нему, без базисных понятий вы все равно далеко не уедите.
В высланом примере в строках 125-133 производится копирование всей программы из флеша в озу, а в строках 136-142 в регистре BOOTCONF 2-м младшим битам присваивается значение 10b:
Код
;copying whole image into RAM
        LDR     r0, =0         ;r0 = start address from which to copy
        LDR     r3, =|Image$$ZI$$Base|;r3 = number of bytes to copy
        LDR     r1, =RAM_Base    ;r1 = start address where to copy
copy_ram
        LDR     r2, [r0], #4        ;Read a word from the source
        STR     r2, [r1], #4        ;copy the word to destination
        SUBS    r3, r3, #4    ;Decrement number of words to copy
        BNE     copy_ram
        

        MOV     r0, #RAM_mask
;now do mapping
        LDR     r1, =CPM_Base_addr
        LDRH    r2, [r1, #BOOTCONF_off_addr];Read BOOTCONF Register
        BIC     r2, r2, #0x03    ;Reset the two LSB bits of BOOTCONF Register
        ORR     r2, r2, r0    ;change the two LSB bits of BOOTCONF Register
        STRH    r2, [r1, #BOOTCONF_off_addr];Write BOOTCONF Register

на С это будет выглядеть примерно так(не проверял):
Код
#define VECTORS_IN_RAM ((void*)0x20000000)
#define VECTORS_IN_FLASH ((void*)0x40002000)  /* ??? */
#define BOOTCONF (*((int*)<адрес регистра(см. мануал)>))

memcpy(VECTORS_IN_RAM, VECTORS_IN_FLASH, 0x40); /* как заметил тов. Сергей Борщ*/
BOOTCONF = (BOOTCONF & (~3)) | 2; /* мапим на адр 0*/


PS Ошибся: в регистр BOOTCONF надо писать 10b а не 01b. Не точность исправил 23.02
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.