<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Truly Integrated &#187; ARM</title>
	<atom:link href="http://truly-integrated.net/category/arm/feed/" rel="self" type="application/rss+xml" />
	<link>http://truly-integrated.net</link>
	<description>electronics microcontrollers fpga vhdl</description>
	<lastBuildDate>Fri, 19 Feb 2010 21:22:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>GPS Tracker</title>
		<link>http://truly-integrated.net/2009/07/gps-tracker/</link>
		<comments>http://truly-integrated.net/2009/07/gps-tracker/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 08:47:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ARM]]></category>
		<category><![CDATA[Projekty]]></category>

		<guid isPermaLink="false">http://truly-integrated.net/?p=119</guid>
		<description><![CDATA[Niedawno zakończyłem prace nad urządzeniem, które nazwałem GPS Tracker. Urządzenie to służy do raportowania pozycji samochodów ciężarowych lub osobowych, z wykorzystaniem pozycji z GPS, przesyłanej przez sieć GSM. Wykonanie zostało zlecone przez indywidualnego klienta.
Urządzenie wykorzystuje moduł SIM300D do wysyłania danych przez GPRS. Sam moduł jest rozwiązaniem dedykowanym zarówno do transmisji danych z wykorzystaniem wspomnianego GPRS [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Niedawno zakończyłem prace nad urządzeniem, które nazwałem GPS Tracker. Urządzenie to służy do raportowania pozycji samochodów ciężarowych lub osobowych, z wykorzystaniem pozycji z GPS, przesyłanej przez sieć GSM. Wykonanie zostało zlecone przez indywidualnego klienta.</p>
<p style="text-align: justify;">Urządzenie wykorzystuje moduł <a href="www.fleximatrix.fr/docs/sim300D_HD_V2.01.pdf">SIM300D</a> do wysyłania danych przez GPRS. Sam moduł jest rozwiązaniem dedykowanym zarówno do transmisji danych z wykorzystaniem wspomnianego GPRS jak również do transmisji głosu. Komunikacja z modułem odbywa się przy wykorzystaniu RS232 w pełnej 9-sygnałowej wersji. Umożliwia to sprawowanie kontroli nad szybkością transmisji. Do modułu podłączono złącze karty SIM z wyrzutnikiem. Antena jest przyłączona za pomocą gniazda SMA. Moduł został zakupiony w <a href="http://www.tme.pl">TME</a>.</p>
<p style="text-align: justify;">W roli uC zastosowałem AT91SAM7S64, gdyż takowy zalegał u mnie w warsztacie. Firmware został napisany z wykorzystaniem przerwań i timerów (i innych fajnych rzeczy..), tak aby uniknąć stosowania wielu procedur blokujących. Taka metoda pisana firmware w ostateczności przyczynia się do zmniejszenia awaryjności całego urządzenia, co jest szczególnie istotne w przypadku urządzenia do którego dostęp będzie później utrudniony.</p>
<p style="text-align: justify;">Wykorzystany moduł GPS to FGPMMOSL1 zakupiony z <a href="http://www.maritex.com.pl/pl/shop/products/ggid/10521">Maritexu</a>. Wybór został podyktowany tylko i wyłącznie ceną (: jednak zapewniam, iż moduł spisuje się bardzo dobrze, wraz z aktywną anteną można obierać sygnał z satelity w kamienicy (5m od okna), w której mieszkam. Moduł jest gotowy do pracy po ok. 30 sekundach od włączenia zasilania. Prędkość transmisji wynosi 9800 baud, jest więc dwukrotnie większa od standardowej prędkości protokołu <a href="http://en.wikipedia.org/wiki/NMEA_0183">NMEA</a>. Z racji tego, że zastosowany AT91SAM7 dysponuje tylko dwoma USARTami, z czego jeden (USART1) jest podłączony do modułu GSM to linia TXD została wykorzystana do wysyłania komunikatów debugujących podczas gdy RXD jest podłączona do GPS. Takie współdzielenie linii jednego USART powoduje to, że debug pracuje z taką samą prędkością co GPS, zatem większa prędkość GPS oznacza w ostateczności przyspieszenie transmisji debugu.</p>
<p style="text-align: justify;">Urządzenie zostało również wyposażone w złącze USB, które umożliwia konfigurację parametrów pracy całości. Firmware zapewnia obsługę urządzenia klasy CDC będącego, tym przypadku, zwykłym portem szeregowym. Warto zaznaczyć, że nie posiłkowałem się biblioteką <a href="http://www.atmel.com">Atmela</a> dla USB, lecz klasę CDC napisałem całkowicie samodzielnie. (Nie jest to jedyna rzecz jaką implementowałem samodzielnie, nawet <em>printf</em> do debugu jest mój, co prawda nieco zubożony, ale taki właśnie miał być (: ).</p>
<p style="text-align: justify;">Krótka specyfikacja:</p>
<ul>
<li>Wymiary płytki: 64&#215;50 [mm]</li>
<li>Wysokość najwyższego elementu: 12 [mm]</li>
<li>Średni pobór prądu: ~40 [mA]</li>
<li>Napięcie zasilania: od 5 do 35 [V]</li>
<li>Złącza: USB, Zasilanie, 2x SMA (GPS, GSM), JTAG (przystosowany do pracy z moim programatorkiem).</li>
<li>3 Diody sygnalizacyjne (NET &#8211; GPRS, PWR  &#8211; Zasilanie, STAT &#8211; Status pracy)</li>
</ul>
<h4 style="text-align: justify;">Podstawowe problemy techniki</h4>
<p>Najważniejszym elementem każdego urządzenia elektronicznego jest zasilacz, gdyż jak wiadomo 90% urządzeń działa lepiej gdy są poprawnie zasilone (:. Należy mieć na uwadze fakt, że podczas nadawania komunikatu przez moduł GSM pobór prądu może w szczycie osiągnąć 2A, dlatego konstrukcja zasilacza musi być dokładnie przemyślana. Ponadto należy uwzględnić to, że napięcie w instalacji ciężarówki wynosi 24V, zaś w samochodach osobowych występuje 12V. Wybór padł na układ LM2594 będący przetwornicą step-down. Wykorzystano wersję nieregulowaną, o napięciu wyjściowym wynoszącym 5V. Wykorzystanie wersji 3,3V nie wchodziło w grę, gdyż moduł SIM300D do poprawnej pracy wymaga przynajmniej 3,6V. Napięcie z przetwornicy jest obniżane do poziomu ok 3,8-3,9V za pomocą układu LM1117-3,3V, którego wyprowadzenie GND jest dołączone do masy urządzenia za pośrednictwem diody krzemowej. Aby umożliwić chwilowe pobranie dużych prądów urządzenie zostało wyposażone w baterię kondensatorów tantalowych 330uF. Na płytce przewidziano miejsce dla trzech takich kondensatorów, jednak empirycznie stwierdziłem, że dwa w zupełności wystarczą i moduł nie uskarża się na <em>&#8216;under voltage operation&#8217;</em>. Warto zwrócić uwagę na to czy scalak przetwornicy pracuje ze stałą czy zmienną częstotliwością kluczowania dławika. W przypadku zmiennej częstotliwości może (w momencie dużych obciążeń) dochodzić do efektów dzwiękowych w dławiku (:. Wybrany układ pracuje z częstotliwością stałą, wynoszącą 150kHz, tak więc zdecydowanie ponad pasmem akustycznym.</p>
<p>Bardzo ważnym aspektem jest zapewnienie odpowiedniej grubości ścieżek doprowadzających napięcie do modułu GSM. W przypadku za wąskich ścieżek i dużych poborów prądu następują niepożądane spadki napięć.</p>
<h4>Jakie są potencjalne trudności podczas realizacji takiego projektu?</h4>
<p>Pierwszą trudnością jest poprawna implementacja procedur obsługujących błędy pracy modułu GSM. Jeżeli urządzenie wisi w momencie gdy padł zasięg, to znaczy dokładnie tyle, że programista nie zadbał o jakość firmware. Braki zasięgu się zdarzają, szczególnie w sieci Orange.</p>
<p>Następnym problemem są &#8216;ginące&#8217; pakiety w sieci GPRS. Należy zadbać o mechanizm potwierdzeń dostarczenia pakietów z danymi. Można wykorzystać protokół TCP zamiast UDP, ale nastręcza to dodatkowych problemów w momencie utraty zasięgu (trzeba na nowo ustanawiać połączenie socketów, a na serwerze socket cały czas zostaje otwarty) Na dobrą sprawę wystarczy UDP z prostym komunikatem potwierdzającym ze strony serwera.</p>
<p>Należy buforować dane, czasem utrata zasięgu może potrwać kilka minut, nie można dopuścić by dane nam wyparowały! w momencie <em>powrotu</em> zasięgu należy wysłać zgromadzoną paczkę danych. Serwer musi obsługiwać komunikaty zawierające informacje o kilku lokalizacjach. Komplikuje to protokół, ale tylko nieznacznie.</p>
<p>W przypadku utraty sygnału GPS, należy to sygnalizować do serwera jakimś prostym komunikatem (po co tracić pieniądze na nadmiarową ilość przesyłanych danych). Co nam daje taka informacja? Serwer <em>wie</em>, że urządzenie żyje, a problemy są przejściowe. Ponadto może wyświetlić komunikat o problemach z GPS.</p>
<p>Należy zaimplementować obsługę PIN. Kierowcy mają ciągoty do korzystania z kart SIM, znajdujących się w urządzeniu do wykonywania prywatnych rozmów (:.</p>
<p>Zaprojektowane urządzenie współpracuje aktualnie z aplikacją wykorzystującą Google Maps. Jest to najprostsza i dość niedoskonała metoda wizualizacji zgromadzonych informacji (niedokładność map). Warto zatem zastanowić się nad zakupem innych mapek.</p>
<h4>Pytania? Wątpliwości?</h4>
<p>To tyle ode mnie, jeśli ktokolwiek z Czytelników jest zainteresowany projektem to proszę o kontakt mailowy. Możliwe jest wykonanie większej liczby urządzeń, na specjalne zamówienie. Na zakończenie zamieszczam zdjęcie strony wierzchniej (GSM i GPS są przylutowane od spodu):</p>
<p><a href="http://truly-integrated.net/wp-content/uploads/2009/07/1.jpg"><img class="size-thumbnail wp-image-150 alignleft" title="gpsgsm_1" src="http://truly-integrated.net/wp-content/uploads/2009/07/1-150x150.jpg" alt="gpsgsm_1" width="150" height="150" /></a><a href="http://truly-integrated.net/wp-content/uploads/2009/07/2.jpg"><img class="alignleft size-thumbnail wp-image-151" title="gpsgsm_2" src="http://truly-integrated.net/wp-content/uploads/2009/07/2-150x150.jpg" alt="gpsgsm_2" width="150" height="150" /></a></p>
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://truly-integrated.net/2009/07/gps-tracker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GCC i funkcje o zmiennej liczbie argumentów</title>
		<link>http://truly-integrated.net/2009/07/gcc-i-funkcje-o-zmiennej-liczbie-argumentow/</link>
		<comments>http://truly-integrated.net/2009/07/gcc-i-funkcje-o-zmiennej-liczbie-argumentow/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 22:52:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ARM]]></category>
		<category><![CDATA[SW]]></category>

		<guid isPermaLink="false">http://truly-integrated.net/?p=91</guid>
		<description><![CDATA[Niniejszy wpis jest poświęcony zagadnieniu wykorzystania funkcji o zmiennej liczbie argumentów w swoich projektach. Najpopularniejszym przykładem funkcji posiadającą taką właściwość jest funkcja printf, której prototyp wygląda mniej-więcej tak:
int printf(char *fmt, ...);
Notacja &#8216;&#8230;&#8217; w polu argumentów funkcji informuje kompilator o tym, iż funkcja może przybierać dowolną liczbę argumentów. Powstaje podstawowe pytanie:  w jaki sposób takie argumenty [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Niniejszy wpis jest poświęcony zagadnieniu wykorzystania funkcji o zmiennej liczbie argumentów w swoich projektach. Najpopularniejszym przykładem funkcji posiadającą taką właściwość jest funkcja <em>printf, </em>której prototyp wygląda mniej-więcej tak:</p>
<pre>int printf(char *fmt, ...);</pre>
<p style="text-align: justify;">Notacja <em>&#8216;&#8230;&#8217;</em> w polu argumentów funkcji informuje kompilator o tym, iż funkcja może przybierać dowolną liczbę argumentów. Powstaje podstawowe pytanie:  w jaki sposób takie argumenty są przekazywane do funkcji skoro ich liczba nie jest wprost określona? Jak się do nich odwoływać?</p>
<p style="text-align: justify;">Twórcy kompilatora GCC rozwiązali sprawę przekazując takie parametry w formie obszaru pamięci zorganizowanego w specyficzny sposób. Na potrzeby rozważań ustalmy, iż funkcja, którą będziemy badać  będzie posiadała następujący prototyp:</p>
<pre>void foo(char *arg, ...);</pre>
<p>Jeżeli kolejne argumenty funkcji oznaczymy przez <em>arg0 &#8230; arg n</em> to zostaną one umieszczone w pamięci w sposób przedstawiony na poniższym rysunku:<img class="aligncenter size-full wp-image-107" title="gcc_va_args" src="http://truly-integrated.net/wp-content/uploads/2009/07/gcc_va_args.png" alt="gcc_va_args" width="318" height="272" /></p>
<p style="text-align: center;">
<p style="text-align: justify;">Wyjaśnienia wymaga zapis <em>a_sizeof(x). </em>Jest to makro zwracające rozmiar zmiennej (w bajtach) będącej jego argumentem w postaci &#8216;wyrównanej&#8217; do architektury dla której kompilujemy oprogramowanie. Przykładowo, jeśli architektura jest 32 bitowa to wartość dla zmiennej 1-bajtowej wynosi 4, a dla zmiennej 5-bajtowej wynosi 8. Powyższy rysunek mówi nam, iż każdy kolejny argument jest umieszczony po poprzednim w odległości równej <em>a_sizeof(x)</em>, gdzie <em>x</em> to argument poprzedni.</p>
<p style="text-align: justify;">Skoro wiemy już jak zmienne są rozmieszczone w pamięci to możemy zdefiniować sobie makra do poruszania się po nich i odczytywania ich wartości. Zestaw makr przygotowanych przeze mnie ma następującą postać:</p>
<div class="codesnip-container" >
<div class="c codesnip" style="font-family:monospace;"><span class="co2">#define __a_size(n)           ((sizeof(n) + sizeof(char *) &#8211; 1) &amp;amp; ~(sizeof(char *) &#8211; 1))</span></p>
<p><span class="co2">#define va_start(ptr, v)        (ptr = (va_list)(&amp;amp;v) + __a_size(v))</span><br />
<span class="co2">#define va_arg(ptr, t)          ( *(t *)((ptr += __a_size(v)) &#8211; __a_size(t)))</span><br />
<span class="co2">#define va_end(ptr)             (ptr = (va_list) 0)</span></p>
<p><span class="kw4">typedef</span> <span class="kw4">char</span> <span class="sy0">*</span> va_list</div>
</div>
<p style="text-align: justify;">Makro <em>__a_size(n)</em> jest odpowiednikiem notacji <em>a_sizeof(n)</em> z rysunku. Makro <em>va_start(ptr, v)</em> ustawia wskaźnik <em>ptr</em>, tak aby wskazywał na pierwszą zmienną ze zbioru. Aby poprawnie ustawić wskaźnik niezbędny jest adres ostatniej &#8216;normalnej&#8217; zmiennej (na rysunku jest zmienna <em>arg</em>). Makro <em>va_arg(ptr, t)</em> powoduje zwrócenie zmiennej wskazywanej przez ptr oraz ustawienie <em>ptr</em> tak by wskazywał na następną zmienną. Parametr <em>t</em> makra określa typ zmiennej jaką chcemy zwrócić. Jest on niezbędny, gdyż od niego zależy &#8216;odległość&#8217; do następnej zmiennej w pamięci. Makro <em>va_end(ptr)</em> służy do wyczyszczenia wartości wskaźnika ptr.</p>
<p style="text-align: justify;">Wyposażeni w taki zestaw makr możemy zacząć naszą przygodę z funkcjami o zmiennej liczbie argumentów. Dla przykładu napiszemy funkcję wypisującą wartość wszystkich zmiennych typu int podanych jako argumenty. Listing funkcji jest następujący:</p>
<div class="codesnip-container" >
<div class="c codesnip" style="font-family:monospace;"><span class="kw4">void</span> foo<span class="br0">&#40;</span><span class="kw4">int</span> num_ints<span class="sy0">,</span> &#8230;<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw4">int</span> i<span class="sy0">,</span> x<span class="sy0">;</span><br />
va_list va<span class="sy0">;</span></p>
<p>va_start<span class="br0">&#40;</span>va<span class="sy0">,</span> num_ints<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">for</span><span class="br0">&#40;</span>i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&amp;</span>lt<span class="sy0">;</span> num_ints<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
x <span class="sy0">=</span> va_arg<span class="br0">&#40;</span>va<span class="sy0">,</span> <span class="kw4">int</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;arg: %d, val: %d<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> i<span class="sy0">,</span> x<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p style="text-align: justify;">Przykładowe wywołanie:</p>
<pre style="text-align: justify;">foo(3, 1, 2, 3);</pre>
<p style="text-align: justify;">I jego rezultat:</p>
<pre style="text-align: justify;">arg: 0, val: 1
arg: 1, val: 2
arg: 2, val: 3</pre>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://truly-integrated.net/2009/07/gcc-i-funkcje-o-zmiennej-liczbie-argumentow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>USB JTAG i OpenOCD 0.1.0 + Eclipse</title>
		<link>http://truly-integrated.net/2009/07/usb-jtag-i-openocd-010-eclipse/</link>
		<comments>http://truly-integrated.net/2009/07/usb-jtag-i-openocd-010-eclipse/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 16:24:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ARM]]></category>
		<category><![CDATA[HW]]></category>
		<category><![CDATA[SW]]></category>

		<guid isPermaLink="false">http://truly-integrated.net/?p=32</guid>
		<description><![CDATA[Jakiś czas temu światło dzienne ujrzała nowa wersja popularnego oprogramowania OpenOCD, służącego do programowania i debugowania uC. W związku z tym, jakże wspaniałym, wydarzeniem uznałem za zasadne przedstawienie Czytelnikowi treści skryptów, służących do programowania pamięci flash mikrokontrolerów AT91SAM7S64. Wybór mikrokontrolera jest podyktowany tym, iż znalazł on zastosowanie w dużej części wykonanych przeze mnie urządzeń. W [...]]]></description>
			<content:encoded><![CDATA[<p>Jakiś czas temu światło dzienne ujrzała nowa wersja popularnego oprogramowania <a title="OpenOCD" href="http://openocd.berlios.de/web/">OpenOCD</a>, służącego do programowania i debugowania uC. W związku z tym, jakże wspaniałym, wydarzeniem uznałem za zasadne przedstawienie Czytelnikowi treści skryptów, służących do programowania pamięci flash mikrokontrolerów AT91SAM7S64. Wybór mikrokontrolera jest podyktowany tym, iż znalazł on zastosowanie w dużej części wykonanych przeze mnie urządzeń. W roli JTAG&#8217;a wykorzystałem, własnoręcznie wykonany,<a href="http://truly-integrated.net/archives/3"> klon Turtelizera 2</a>.</p>
<p>W pakiecie OpenOCD dołączono wiele skryptów opisujących sposób pracy interfejsów JTAG, jak również dla poszczególnych układów docelowych (targetów). Nic nie stoi na przeszkodzie aby je wykorzystać i znacząco ułatwić sobie życie. Przykładowy skrypt flashujący uC plikiem<em> main.hex </em> wygląda następująco:</p>
<pre>source [find openocd-0.1.0/src/target/interface/turtelizer2.cfg] # (1)
source [find openocd-0.1.0/src/target/target/sam7s64.cfg]        # (2)

init                                  # (3)
reset halt                            # (4)
flash write_image main.hex 0          # (5)
reset run                             # (6)
shutdown                              # (7)</pre>
<p>Pierwsza linia zawiera ściężkę prowadzącą do opisu użytego interfejsu JTAG, zaś linia (2) wskazuje na plik z opisem układu docelowego. Jeśli Czytelnik w swej pracy wykorzystuje inne uklady docelowe należy przejrzeć katalog <em>target</em> w folderze instalacyjnym OpenOCD w poszukiwaniu odpowiedniego pliku. Z każdym dniem społeczność pracująca nad OpenOCD uzupełnia zbiór plików konfiguracyjnych o nowe targety. Pozostałe linie mają składnię podobną do znanej z poprzednich wersji OpenOCD. Powodują one inicjalizację komunikacji z targetem oraz jego zresetowanie i wstrzymanie (3, 4). Flashowanie odbywa się dzięki komendzie zawartej w linii (5), której pierwszym parametrem jest operacja jaką wykonujemy na pamięci flash, po niej następuje nazwa pliku oraz offset od początku przestrzeni adresowej uC pod jaki zostaną zapisane dane. Linie (6, 7) kolejno resetują mikrokontroler i &#8220;wprawiają go w ruch&#8221; oraz kończą pracę OpenOCD. Jak wynika z załączonego przykładu skrypty, dzięki gotowym zbiorom plików konfiguracyjnych, uległy znacznemu uproszczeniu.</p>
<p>Skrypt służący do debugowania jest równie prosty co powyższy, używany do flashowania. Jego treść przedstawia się w sposób zgodny z przdestawionym na listingu:</p>
<pre>source [find ./openocd-0.1.0/src/target/interface/turtelizer2.cfg] # (1)

# Change the default telnet port...
telnet_port 4444                     # (2)

# GDB connects here
gdb_port 3333                        # (3)

# GDB can also flash my flash!
gdb_memory_map enable                # (4)
gdb_flash_program enable             # (5)
gdb_breakpoint_override hard         # (6)

source [find ./openocd-0.1.0/src/target/target/sam7s64.cfg]        # (7)

init                                 # (8)</pre>
<p>Przeznaczenie linii  (1, 7)  jest znane z poprzedniego skryptu. Linia (2) służy do konfiguracji portu na którym będzie nasłuchiwać OpenOCD. Linia (3) ustawia port pracy samego debuggera GDB. Linie (4, 5) umożliwiają programowanie pamięci flash uC z wykorzystaniem GDB. Linia (6) ustawia rodzaj stosowanych breakpoinów na breakpointy hardwareowe. Opcja ta jest niezbędna w momencie gdy firmware został zlinkowany tak by pracować w pamięci flash a nie w pamięci ram. Należy mieć świadomość, iż liczba jednocześnie stosowanych breakpointów hardwareowych jest bardzo ograniczona, a w przypadku AT91SAM7S64 wynosi dokładnie dwa. Linia (8) służy do uruchomienia procesu debugującego.</p>
<p style="text-align: justify;">Tak przygotowany skrypt wyśmienicie współpracuje ze środowiskiem Eclipse. Konfigurację Eclipsa z doinstalowanym pluginem <a title="Zylin CDT plugin" href="http://opensource.zylin.com/embeddedcdt.html">Zylin Embedded CDT</a> rozpoczynamy od dodania nowej <em>Debug Configuration</em> typu <em>Zylin Embedded Debug (Native)</em>. Należy wybrać nazwę projektu dla którego konfigurujemy debug oraz plik wykonywalny w formacie <em>elf</em>, który zawiera m. in. symbole niezbędne dla debugu. Plik taki powstaje każdorazowo w wyniku zlinkowania skompilowanych źródeł projektu.</p>
<p style="text-align: center;"><a href="http://truly-integrated.net/wp-content/uploads/2009/07/debug_conf.png"><img class="aligncenter size-medium wp-image-63" title="debug_conf" src="http://truly-integrated.net/wp-content/uploads/2009/07/debug_conf-570x427.png" alt="debug_conf" width="570" height="427" /></a></p>
<p style="text-align: justify;">Następnie przechodzimy do zakładki <em>Debbuger</em>, gdzie ustawiamy jako aplikację debugującą <em>arm-elf-gcc</em> lub innym, w zależności z jakich kompilatorów korzystamy. W zakładce <em>Commands</em> ustawiamy komendy wysyłane podczas inicjalizacji oraz samego uruchomienia trybu debug. Komendy, jakie należy umieścić w sekcji <em>Initialize commands</em> są następujące:</p>
<pre style="text-align: justify;">target remote localhost:3333
monitor reset halt</pre>
<p>Sekcję<em> &#8216;Run commands&#8217;</em> pozostawiamy pustą. Tak przygotowany Eclipse jest gotowy do odpluskwiania (ech&#8230;), zaraz po uruchomieniu opisanego wcześniej skryptu uruchamiającego <em>debug mode</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://truly-integrated.net/2009/07/usb-jtag-i-openocd-010-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
