|
|
  |
Переключить режим работы ARM, текущее состояние ядра Abort, надо переключить в Supervisor |
|
|
|
Mar 22 2010, 07:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
В u-boot есть такая функция ram_size: Код static long ram_size(ulong *base, long maxsize) { volatile long *test_addr; volatile ulong *base_addr = base; ulong ofs; /* byte offset from base_addr */ ulong save; /* to make test non-destructive */ ulong save2; /* to make test non-destructive */ long ramsize = -1; /* size not determined yet */
save = *base_addr; /* save value at 0 so can restore */ save2 = *(base_addr+1); /* save value at 4 so can restore */
/* is any SRAM present? */ *base_addr = 0x5555aaaa;
/* It is important to drive the data bus with different data so * it doesn't remember the value and look like RAM that isn't there. */ *(base_addr + 1) = 0xaaaa5555; /* use write to modify data bus */
if (*base_addr != 0x5555aaaa) ramsize = 0; /* no RAM present, or defective */ else { *base_addr = 0xaaaa5555; *(base_addr + 1) = 0x5555aaaa; /* use write to modify data bus */ if (*base_addr != 0xaaaa5555) ramsize = 0; /* no RAM present, or defective */ }
/* now size it if any is present */ for (ofs = 4; ofs < maxsize && ramsize < 0; ofs <<= 1) { test_addr = (long*)((long)base_addr + ofs); /* location to test */
*base_addr = ~*test_addr; if (*base_addr == *test_addr) ramsize = ofs; /* wrapped back to 0, so this is the size */ }
*base_addr = save; /* restore value at 0 */ *(base_addr+1) = save2; /* restore value at 4 */ return (ramsize); } Вызываю ее при запрещенных прерываниях, соответственно нет и Abort
|
|
|
|
|
Mar 22 2010, 08:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(zltigo @ Mar 22 2010, 10:59)  Зачем тогда копипастите, то что не понимете, да и еще и добавляете отсебятину  ? Уважаемый гуру! Наверное у меня с утра приступ мозговой слабости. Буду признателен, если вы уделите некоторую толику своего времени для пояснения мне: 1. Чего я не понимаю. 2. В чем состоит отсебятина. P.S. Безо всякого ехидства спрашиваю. Действительно не понял.
|
|
|
|
|
Mar 22 2010, 12:16
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(sergeeff @ Mar 22 2010, 09:03)  В u-boot есть такая функция ram_size: Код static long ram_size(ulong *base, long maxsize) { .... } Не знаю как насчет интеллигентности, но такой код выглядит куда более яснее и понятнее того, что вы привели: Код { V8 *p = 0x00; HANDLE h;
GetExceptionVector( EXPVECT_DABT, &h); SetExceptionVector( EXPVECT_DABT, DabtDetHandler);
while ( !DabtHappened ) { p += 1*M; *p; }
SetExceptionVector( EXPVECT_DABT, h); return (U32)p - 1; } Другое дело, что он работоспособен только после настройки EMC как выяснилось.
|
|
|
|
|
Mar 24 2010, 10:55
|
Частый гость
 
Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088

|
Привет всем. Есть кусок кода: CODE ; ; Disable L2 cache ; ldr r1, =CSP_BASE_REG_PA_L2CC ldr r0, =0x0 str r0, [r1, #L2CC_CR_OFFSET] Как я разумею: 1. "ldr r1, =CSP_BASE_REG_PA_L2CC" - загружает в r1 то, что содержится (а именно константа CSP_BASE_REG_PA_L2CC) в некоем адресе, заданном как смещение относительно PC. Так ? 2. "ldr r0, =0x0" - по аналогии, запись в r0 числа 0. Хотя, путь странноват. Неправильно понимаю ? 3. "str r0, [r1, #L2CC_CR_OFFSET]" - созранить значение из r0 в адрес, заданный как r1+ L2CC_CR_OFFSET. Верно понимаю ? Спасибо.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|