LINUX.ORG.RU

Сообщения skvorli

 

Проблема при работе с top через expect

Добрый день,

столкнулся со следующей проблемой: крайне редко удается выйти из top нажатием клавиши q, когда посылаешь нажатие с помощью expect. Причем если в цикле посылать нажатие q и мониторить результат, выйти может, как на 3-ий цикл, так и на 40-ой. Откуда такое поведение, и как это можно обойти?

expect - 5.44 tcl - 8.5

Ниже представлен скрипт, демонстрирующий проблему. Если заменить top на htop, то проблема исчезает. Все в этом случае работает безотказно.

 
#!/usr/bin/expect -f

set timeout 10
log_user 1

spawn bash
send -- "clear\r\n"
sleep 0.3
expect  {
    -re "@.*:.*$" {
        send_user "INFO: Command line \r\n"
        send -- "top -d 1 \r\n"
        # send -- "htop -d 10 \r\n"
        sleep 1
    }
    timeout {
        send_user "Can't get command line\r\n"
        exit -1
    }
}

set timeout 3
expect { timeout {  } }
send -- "q"



set timeout 10
expect { 
    -re ".*@.*:.*$" {
        sleep 1
        send_user "INFO: Command line (2) \r\n"
    }
    timeout { 
        send_user "Can't get command line (2)\r\n"
        exit -1
    } 
}


send -- "clear\r\n"
send_user "Success\r\n"
skvorli
()

Использование kgdb для доступа к регистрам периферии Cortex-A8

Имеется ядро 2.6.32 на AM3517 (Cortex-A8). Все необходимые драйвера включены непосредственно в него. Пытаюсь разобраться с отладкой ядра с помощью встроенного отладчика kgdb. Ядро собрано с отладочной информацией и поддержкой отладчика KGDB. С компьютера по последовательному порту подключаюсь к плате с помощью gdb. В принципе, kgdb работает. Установка точек останова, просмотр глобальных переменных ядра не вызывают никаких проблем. Однако столнулся с тем, что никак не удается прочитать значения регистров периферии.

Допустим, пытаемся прочитать регистр MCR UART3. В ядре информация об UART3 находится в следующей структуре.

static struct plat_serial8250_port serial_platform_data2[] = {
    {
        .mapbase    = OMAP_UART3_BASE,
        .irq        = 74,
        .iotype        = UPIO_MEM,
        .regshift    = 2,

Поле mapbase - это физический адрес из Technical Reference Manual. Для UART3 он будет 0x49020000

Поле membase этой структуры содержит виртуальный базовый адрес, получаемый после вызова ioremap() при инициализации UART.

Через gdb можем проверить содержимое этой структуры:

(gdb) p/x serial_platform_data2.mapbase
$34 = 0x49020000
(gdb) p/x serial_platform_data2.membase
$35 = 0xfb020000

Теперь пробуем обратиться к регистру MCR, находящемся по смещению 0x10 относительно базового адреса регистров UART, согласно Technical Reference Manual.

(gdb) x serial_platform_data2.membase+0x10
0xfb020000:    Cannot access memory at address 0xfb020010
(gdb) x serial_platform_data2.mapbase+0x10
0x49020000:    Cannot access memory at address 0x49020010

Ни по физическому, ни по виртуальному адресу прочитать не удалось. Почему так? Подозреваю, что я что-то в корне неверно понимаю тут. Подскажите, куда копать дальше.

 , , , ,

skvorli
()

RSS подписка на новые темы