|
Переключить режим работы ARM, текущее состояние ядра Abort, надо переключить в Supervisor |
|
|
|
Mar 18 2010, 11:55
|
Ортодокс
  
Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775

|
Вот фрагмент кода на ассемблере, который позволит переключиться в режим супервизора Код mrs r0, cpsr bic r0, r0, #0x1F orr r1, r0, #0x13 msr cpsr_cxsf, r1
|
|
|
|
|
Mar 19 2010, 03:05
|
Частый гость
 
Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088

|
Цитата(Aurochs @ Mar 18 2010, 16:55)  Вот фрагмент кода на ассемблере, который позволит переключиться в режим супервизора Вольшое спасибо, похоже на то, что требуется
|
|
|
|
|
Mar 19 2010, 13:37
|
Частый гость
 
Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088

|
Цитата(sergeeff @ Mar 19 2010, 17:57)  Если не секрет. Откуда возникла такая потребность? Оба режима Abort или Undefined Instruction - это "аварийные режимы" процессора. Если вы в них попали, надо выяснять почему и исправлять программу. А вываливаться из них какой смысл? Не секрет, конечно: после сброса и до ввода в режим отладки, процессор успевает исполнять какой-то мусор с флэшки. Мне же его надо иметь в нормальном состоянии. Собственно, вот  Вообще, я пока приведённым рецептом не воспользовался - нашёл способ сделать инче, но это частный случай, а так-то рецептик себе на манжету запишу
|
|
|
|
|
Mar 21 2010, 02:10
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Mar 21 2010, 04:58)  SoC на двух 1136 ARM'ах, чей там SDRAM контроллер, - не знаю... Дает аборт при доступе к несуществующей памяти, даже если в MMU ARM'ов помечено, что память там есть. Хорошо, а как инициализируется этот контроллер - знаете? Просто ведь неоткуда знать ему, что там и в каком количестве снаружи прикручено, если только кто-то (сам процессор, точнее) не подскажет. А вот генерить abort там, где ему было сказано, что памяти нет - это пожалуйста.
|
|
|
|
|
Mar 21 2010, 15:36
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sergeeff @ Mar 21 2010, 15:27)  Существуют более интеллигентные способы узнать объем памяти без вваливания в Abort. Я таким пользуюсь года три. Интеллигентных способа, как я понимаю, здесь два: 1. Получить значение объема от bootloader'а 2. Прочитать конфигурацию контроллера памяти Попытка выяснить объем самостоятельно неминуемо приведет к abort'у.
|
|
|
|
|
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. Верно понимаю ? Спасибо.
|
|
|
|
|
Mar 24 2010, 12:37
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(impatt @ Mar 24 2010, 13:55)  Привет всем. Moderator: 1.Мигающий Аватар убрал, раз на просьбы Вы не реагируете. 2.Темы захламляющие основные ветки форума объединил и перенес к начинающим. Настоятельно прошу не плодить темы с детскими вопросами.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|