W obronie krzyża
" />Kod:$pkg_info whowatch-1.4
Information for whowatch-1.4:
Comment:
Displays information in real time about users currently logged on
Description:
Whowatch is an interactive who-like program that displays information about the
users currently logged on to the machine. In addition to standard information
(login name, tty, host, user's process), the type of the connection (telnet or
ssh) is shown. You can toggle display between the users' commands or idle times.
You can watch the process tree, navigate in it, and send INT and KILL signals.
WWW: http://wizard.ae.krakow.pl/~mike/
Dobre bo polskie
Witam,
próbuje debuggować projekt z procesorem na rdzeniu Cortex-M3 (STM32F107) środowisku Eclipse (GALILEO) /OpenOCD (0.3.1) i nie bardzo mi to wychodzi (może ktoś z Kolegów ma jakieś doświadczenia).
1) W Eclipse dla zmiennej globalnej ustawiam watchpoint: Run->Toggle->Watchpoint, zaznaczam pole „Write” w okienku [Add Watchpoint] (co oznacza pole „Units:” ?) ,który pojawia się w oknie [Breakpoints]; w jego właściwościach w zakładce „Common” w polu „Condition” wpisuję wartość zmiennej, przy zapisie której chciałbym by program się zatrzymał; niestety po uruchomieniu programu zatrzymuje się on przy każdym odczycie z tej zmiennej (widać to w oknie [Disassembly]) bez względu na jej wartość; dlaczego się tak dzieje ?
2) Próbuję użyć komendę „wp<address><length><r|w|a>[value][mask]" OpenOCD łącząc się z nim poprzez telnet; aktualny adres zmiennej odczytuję z pliku *.map i wykonuję komendę:
„wp 0x20000e04 4 w 10 0xFFFFFFFF”; watchpoint jest ustawiony, co można odczytać za pomocą komendy „wp”;
po wystartowaniu (komendą „reset”) program nie zatrzymuje się na zapisie wartości 10 do zmiennej typu int na adresie 0x20000e04, jakby w ogóle nie widział watchpointa; gdy zatrzymam program komendą „halt” i odczytam watchpoint jest on nadal ustawiony; w czym tkwi problem ?
Jaką komendą OpenOCD można uruchomić program by szedł on dalej po zatrzymaniu komendą „halt” (komenda „step <address>” umożliwia tylko wykonanie pojedynczego kroku od bieżącego adresu lub podanego w parametrze address)
Serdecznie pozdrawiam
Postanowiłem bardziej dokładnie przeanalizować dokumentację rdzenia Cortex-M3 (na którym jest wykorzystywany przeze mnie uP STM32F107) – dokument „DDI0337G_cortex_m3_r2p0_trm.pdf” ze strony http://infocenter.arm.com/help/index.jsp Cortex-M3 TechnicalReference Manual. W dziale System Debug -> 11.5 DWT page 11-13 opisane są dokładnie wszystkie rejestry modułu odpowiedzialnego za sprzętowe watchpointy (jest ich max 4) i różne tryby ich konfiguracji (niektóre z nich niestety niezbyt rozumiem).
Ważne jest zdanie „The second comparator, DWT_COMP1, can also be used as a data comparator”.
Za pomocą bezpośredniego dostępu do rejestrów DWT procesora (adresy 0xE0001000 ...) odczytałem rejestr DWT_CTRL = 0x40000000, zgodnie z opisem wartość ta po resecie oznacza, że w tym uP „four comparators for watchpoints and triggers are prezent”. Sprawdziłem jak są ustawiane odpowiednie rejestry DWT po wykonaniu funkcji ustawienia watchpointa z GDB (Run->Toggle Watchpoint). Adres zatrzymania był ustawiony poprawnie w rejestrze DWT_COMP0 (0xE0001020) oraz maska w rejestrze DWT_MASK0 (0xE0001024) = 0x00000002 (co jak sądzę jest wartością poprawną dla odczytu zmiennej typu ‘word’). Rejestr DWT_COMP1 był równy zero i rejestr DWT_FUNCTION1 (0xE0001038) miał zapalony tylko bit LNK1ENA – DATAVADDR1 supported (enabled) - ustawienia watchpointa poprzez telnet dawało taki sam wynik.
Poprawiłem zatem wartości tych rejestrów za pomocą komend „mww <address><value>. W rejestrze DWT_COMP1 ustawiłem wartość danej przy odczycie, której chciałem by program się zatrzymał i w rejestrze DWT_FUNCTION1 ustawiłem dodatkowo bit DATAVMATCH („When DATAVMATCH is set, this komparator performs data value compare”) oraz bity FUNCTION = ‘0101’ („Watchpoint on read”) i bity DATAVSIZE -’10’=word.W sumie do rejestru DWT_FUNCTION1 wpisałem wartość 0x0000B05. Po wznowieniu programu, rzeczywiście zatrzymał się on gdy wartość zmiennej na określonym adresie osiągnęła zadaną wartość. Ustawiałem różne wartości rejestru DWT_COMP1 (z przedziału zmienności monitorowanej zmiennej) i zawsze program zatrzymywał się na określonej wartości watchpointa.
Znaczy to, jak mi się wydaje ,że procesor STM32F107 poprawnie obsługuje watchpointy a „openocd-0.4.0-rc2.exe” ma z tym jakiś problem.
Intryguje mnie jeszcze inny problem.
Czy można zatrzymać program gdy zmienna na określonym adresie osiągnie wartość z jakiegoś przedziału lub też „wyjdzie” poza taki przedział dopuszczalnych wartości ? Analizując rejestry DWT nie mogę niestety (jak na razie) nic ciekawego na ten temat znaleźć. Może ktoś coś wie więcej na ten temat ?