Цитата
Вынужден обратиться к вам через лично письмо так как очень нужно зделать прирывание .
Не моглши бы вы прислать как именно нужно написать копирование векторов.
Если нужно могу выслать совй 71x_init.s.
Должен признать что не евляюсь знатаком асеблера ARM ядра.
Вот 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