Добрый день. Дело в том, что я собираюсь разогнать процессор PXA 270. Многочасовые ковыряния в линуксе дали свои плоды. Все уперлось в процедуру int pm_do_standby() { unsigned long unused; cli(); clf(); leds_event(led_stop); printk(KERN_INFO "In function %s.\n", __FUNCTION__); /* This also works fine by useing SW12 to wake it up.*/ /* Set PSTR. */ PSTR = 0x4; /* Copied from PalmOS Group. */ PWER = 0x80000002; PRER = 0x2; PFER = 0x2; PKWR = 0x000E0000; /* Copied from PalmOS Group end.*/ /* Standby the CPU. */ __asm__ __volatile__("\n\ \n\ \n\ ldr r0, [%1] \n\ mov r1, #0x18 \n\ @ orr r1, r0, #0x08 \n\ mov r2, #2 \n\ b 1f \n\ \n\ .align 5 \n\ 1: \n\ @ All needed values are now in registers. \n\ @ These last instructions should be in cache \n\ @ enter standby mode \n\ \n\ mcr p14, 0, r2, c7, c0, 0 \n\ \n\ @ CPU will stop exec until be waked up. \n\ @ After be waken, just return. \n\ str r1, [%1] \n\ .rept 11 \n\ nop \n\ .endr" : "=&r" (unused) : "r" (&PSSR) : "r0", "r1", "r2"); printk(KERN_INFO "Return from standby mode.\n"); leds_event(led_start); sti(); return 0; } Я ничего непонимаю в ассемблере, но насколько я понял ldr - это регистр процессора, nop (no operation) - ждем один тик процессора, mov - что то куда то перемещаем. Вобщем это все мои познания в asm. Если вам не трудно разьясните что тут делается на С. Буду очень благодарен.
Насколько я помню ARM-архитектуру, то: ldr - загрузка в регистр значения. Rx = [Imm] orr - оператор или, Rx = Ry | Imm. b - условный/безусловный переход по адресу. mcr - загрузить в сопроцессор значение ARM-регистра str - сохранение в память значения регистра. [Imm] = Rx. Оператора nop не помню такого :\
то есть сначала мы загружаем в регистр ldr r0, [%1]. Но что такое [%1]? Это какое-то значение? Если да, то какое? mov r1, #0x18 \n\. mov перемещает r1? Что означает #0x18. Это случайно не значение 1F, то есть 17? @ orr r1, r0, #0x08 \n\. То есть в r1 мы пишем либо r0, либо 0х08? Я не вижу условия по которому осуществляется выбор между двумя значениями. Ткните носом пжлст. Что такое .align 5 ??? и что это такое : "=&r" (unused) : "r" (&PSSR) : "r0", "r1", "r2"); ???
Я же написал r1 = r0 | 0x08. Не ||, а |. Это 0x18. хз, читай справку по компилятору. Скорее всего это [PSSR] Выравнивание на пяти-байтовую границу.
Простите за мое непонимание, но мне не совсем понятны некоторые вещи. "r1 = r0 | 0x08" а что означает |? "Это 0x18". Какое значение будет в десятиричной системе исчисления. Правильно ли я понял что в двоичной это будет означать 00011000? "хз, читай справку по компилятору. Скорее всего это [PSSR]" Если вы помните что скорее всего это PSSR, может вы помните что это такое? что означает выравнивание на 5 байтовую таблицу? дайте ссылочку пжлст
побитовое или. calc.exe, 0x18 == 16 * 1 + 8 == 24. Да, в двоичном виде это так. С ARM-процессорами я работал, но не конкретно с xScale. Какой-то внутренний регистр. границу Перенос строки, без этого было бы одной строкой, что ассемблер бы не понял.