<?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>Blog do Sergio Prado</title>
	<atom:link href="http://sergioprado.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://sergioprado.org</link>
	<description>Sistemas embarcados, Linux e tecnologia</description>
	<lastBuildDate>Thu, 02 Feb 2012 19:56:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Aprendendo e contribuindo com o kernel do Linux</title>
		<link>http://sergioprado.org/2012/02/02/aprendendo-e-contribuindo-com-o-kernel-do-linux/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aprendendo-e-contribuindo-com-o-kernel-do-linux</link>
		<comments>http://sergioprado.org/2012/02/02/aprendendo-e-contribuindo-com-o-kernel-do-linux/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 19:56:41 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Linux embarcado]]></category>
		<category><![CDATA[Resenhas]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://sergioprado.org/?p=2447</guid>
		<description><![CDATA[Resenha do livro Linux Kernel Development e vídeo sobre como contribuir com o kernel.
Posts relacionados:<ol>
<li><a href='http://sergioprado.org/2010/08/04/kernel-linux-2-6-35/' rel='bookmark' title='Kernel Linux 2.6.35'>Kernel Linux 2.6.35</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic -->
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;"><a href="http://www.amazon.com/gp/product/0672325128/ref=as_li_ss_tl?ie=UTF8&amp;tag=blodoserpra-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0672325128" target="_blank"><img class="size-full wp-image-2449 alignleft" title="lkd-3ed-cover" src="http://sergioprado.org/wp-content/uploads/2012/02/lkd-3ed-cover.jpg" alt="lkd 3ed cover Aprendendo e contribuindo com o kernel do Linux" width="200" height="257" /></a>Já tenho o livro <a href="http://www.amazon.com/gp/product/0672325128/ref=as_li_ss_tl?ie=UTF8&amp;tag=blodoserpra-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0672325128" target="_blank">Linux Kernel Development</a> do <a href="http://rlove.org/" target="_blank">Robert Love</a> há algum tempo, mas só agora terminei minha leitura da primeira à última página. É um livro ao mesmo tempo denso e didático. Bastante teoria, e muito código do kernel. Sei que ainda irei ler e reler muitas partes do livro, conforme avanço meus estudos e trabalho com projetos em Linux embarcado, mas seu conteúdo me ajudou a entender uma série de conceitos, e a identificar o porquê de certas decisões na implementação do kernel, incluindo:</span></p>
<ul style="text-align: justify;">
	<li><span style="font-family: verdana,geneva; font-size: 12px;">como o Linux gerencia internamente os processos, e que dentro do kernel processos e threads são a mesma coisa — a diferença esta no compartilhamento de recursos, e como o Linux implementa tudo isso através da chamada de sistema clone().</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">a modularidade do escalonador de tarefas do Linux, podendo ter diferentes classes de escalonadores de tarefas, com diferentes algoritmos, rodando ao mesmo tempo para diferentes classes de processos!</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">como o escalonador de tarefas padrão do Linux (CFS — Completely Fair Scheduler) calcula por quanto tempo cada processo deve rodar, usando o nice do processo para definir um peso proporcional ao total de processos disponíveis para execução.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">como a implementação das chamadas de sistema são feitas no nível do hardware.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">como implementar um manipulador de interrupção (interrupt handler).</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">a diferença entre os dois contextos de execução do kernel do Linux: contexto de processo e contexto de interrupção, explicando porque você não pode usar uma função que pode dormir (i.e. que gera mudança de contexto) dentro de uma interrução.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">quando e como usar softirqs, tasklets e work queues para deferir trabalho no tratamento de interrupção e em módulos do kernel (no caso de work queues).</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">como usar mecanismos de sincronização e proteger o acesso à recursos compartilhados com operações atômicas usando o tipo atomic_t, spinlocks, semáforos, mutexes e variáveis completion.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">que o significado de BogoMIPS (aquela mensagem que a gente sempre vê no início do boot do kernel) é uma medida de quão rápido é o processador em não fazer nada!</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">como funciona o gerenciador de memória virtual e a camada slab.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">como funciona a implementação de cache de disco (page cache) e qual o algoritmo usado para propagar as alterações (page writeback).</span></li>
	<li><span style="font-family: verdana,geneva; font-size: 12px;">etc!</span></li>
</ul>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;">Tudo isso exemplificado com muito código! Às vezes me pego pensando porque um recurso tão valioso e disponível gratuitamente como o kernel do Linux não é usado como ferramenta de ensino de sistemas operacionais em instituições de ensino Brasil afora.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;">É realmente um livro que todo aquele que pretende trabalhar no kernel do Linux (seja profissionalmente ou por hobby) deveria ter.</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: 12px;">CONTRIBUINDO</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;">Aproveitando que estamos falando sobre o kernel, recentemente assisti um vídeo do <a href="http://pt.wikipedia.org/wiki/Greg_Kroah-Hartman" target="_blank">Greg Kroah-Hartman</a> sobre como “Escrever e submeter seu primeiro patch do kernel”.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;"><iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="344" src="http://www.youtube.com/embed/LLBrBBImJt4" frameborder="0" allowFullScreen="true"> </iframe></span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;">Para quem não conhece, <a href="http://www.kroah.com/log/" target="_blank">Greg</a> é o mantenedor oficial da árvore estável do kernel e de alguns sub-sistemas, incluindo a árvore staging de drivers. Suas palestras são sempre didáticas e bem humoradas. Ele fala não só apenas sobre como submeter um patch, mas dá o caminho das pedras para quem quer se aventurar no desenvolvimento do kernel do Linux.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;">À propósito, o Greg é também o autor do livro Linux Kernel in a Nutshell, <a href="http://www.kroah.com/lkn/" target="_blank">disponível gratuitamente no blog dele</a>.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;">Recursos para estudo temos de sobra. Informações acessíveis sobre tudo. Software open-source e hardware open-source. De uma coisa tenho certeza. O futuro também será open-source. Me parece uma evolução natural. E você? Vai fazer parte deste futuro?</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;">Um abraço,</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: 12px;">Sergio Prado</span></p>
<div class="shr-publisher-2447"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Posts relacionados:</p><ol>
<li><a href='http://sergioprado.org/2010/08/04/kernel-linux-2-6-35/' rel='bookmark' title='Kernel Linux 2.6.35'>Kernel Linux 2.6.35</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2012/02/02/aprendendo-e-contribuindo-com-o-kernel-do-linux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Introduzindo a Beaglebone</title>
		<link>http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduzindo-a-beaglebone</link>
		<comments>http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 23:18:13 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Beagleboard]]></category>
		<category><![CDATA[Produtos]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[beaglebone]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://sergioprado.org/?p=2416</guid>
		<description><![CDATA[Introdução à Beaglebone, nova plataforma ARM para desenvolvimento de projetos com Linux embarcado.
Sem posts relacionados.]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic -->
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Sou fã confesso da Beagleboard. Na minha opinião, é hoje a melhor plataforma para se aprender Linux embarcado e trabalhar com software livre. Muitos projetos, boa documentação e custo acessível. </span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Já escrevi aqui alguns <a href="http://sergioprado.org/category/beagleboard/" target="_blank">artigos sobre esta plataforma</a>, e já trabalhei também em alguns projetos comerciais baseados nela. E quando fiquei sabendo do lançamento da <a href="http://beagleboard.org/bone" target="_blank">Beaglebone</a>, não pensei duas vezes em comprar. Um mês e meio depois (sim, ela ficou um bom tempo presa na alfândega!), cá estou eu e o Arthur com nosso novo brinquedinho!</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/beaglebone_arthur/" rel="attachment wp-att-2418"><img class="aligncenter size-full wp-image-2418" title="beaglebone_arthur" src="http://sergioprado.org/wp-content/uploads/2012/01/beaglebone_arthur.jpg" alt="beaglebone arthur Introduzindo a Beaglebone" width="550" height="309" /></a></span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">A Beaglebone, assim como a Beagleboard, também é um projeto de hardware aberto, porém com um design um pouco mais simples, e consequentemente mais barato. É uma plataforma de prototipação, e nesse sentido tem objetivos bem parecidos com o Arduino, já que usa o conceito de shields (no caso da Beaglebone veremos que estas placas de expansão chamam-se capes). Mas ela não veio para substituir ou competir com o Arduino, muito menos com a Beagleboard ou com a Raspberry Pi — falaremos sobre isso mais adiante. Por hora, que tal darmos olhada no hardware?</span><br /><br /><strong><span style="font-family: verdana,geneva; font-size: small;">HARDWARE</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">A Beaglebone é baseada no processador <a href="http://www.ti.com/product/am3359" target="_blank">AM3359</a>, um ARM Cortex-A8 da Texas Instruments que roda em até 720MHz, e possui 32K de cache L1, 256K de cache L2, 176K de ROM e 64K de RAM interna. Além disso, possui acelerador gráfico 3D, controlador LCD de 24 bits e controlador para a interface touchscreen.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/beaglebone_cpu/" rel="attachment wp-att-2421"><img class="aligncenter size-full wp-image-2421" title="beaglebone_cpu" src="http://sergioprado.org/wp-content/uploads/2012/01/beaglebone_cpu.png" alt="beaglebone cpu Introduzindo a Beaglebone" width="500" height="513" /></a></span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">A placa vem com 256MB de SDRAM, e assim como a Beagleboard-xM, não possui memória flash. Você precisa usar o cartão SD como unidade de armazenamento. Pode ser alimentada tanto por uma fonte externa quanto pela porta USB device. Esta mesma porta USB serve também de conexão serial (console), graças ao adaptador USB-&gt;Serial/JTAG incluido no design do hardware. Possui uma E2PROM de 32KB ligada ao barramento I2C, além das interfaces USB host, Ethernet, cartão SD/MMC e 4 leds que podem ser controlados pelo usuário.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/beaglebone_conn/" rel="attachment wp-att-2422"><img class="aligncenter size-full wp-image-2422" title="beaglebone_conn" src="http://sergioprado.org/wp-content/uploads/2012/01/beaglebone_conn.png" alt="beaglebone conn Introduzindo a Beaglebone" width="400" height="372" /></a></span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">O restante das interfaces de I/O estão disponíveis em 2 conectores de expansão de 46 pinos que podem fornecer diferentes conexões e barramentos como SPI, I2C, GPIO, LCD, HDMI, VGA, MMC, RS232, CAN, A/D, carregador de bateria, etc!</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">São nesses conectores que você pode plugar as placas de expansão, chamadas de capes. Cada beaglebone aceita até 4 capes, e cada cape deve ter uma E2PROM endereçável ligada ao barramento I2C, que vai ajudar o sistema operacional a identificá-la e configurar os I/Os de acordo.</span></p>
<p style="text-align: center;"><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/beaglebone_cape_dvi/" rel="attachment wp-att-2423"><img class="aligncenter size-full wp-image-2423" title="beaglebone_cape_dvi" src="http://sergioprado.org/wp-content/uploads/2012/01/beaglebone_cape_dvi.jpg" alt="beaglebone cape dvi Introduzindo a Beaglebone" width="240" height="196" /></a></span><span style="font-family: verdana,geneva; font-size: x-small;"><strong><span style="font-family: verdana,geneva;">Cape com saídas de áudio e vídeo</span></strong></span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">No momento em que escrevo este artigo, o preço da Beaglebone varia de $79 a $89 (FOB), dependendo do distribuidor e se você quer adquirir apenas a placa ou o kit completo. Convertendo para nossa moeda, e incluindo frete e impostos, deve sair em torno de R$350,00. A lista oficial de distribuidores encontra-se em <a href="http://beagleboard.org/buy" target="_blank">http://beagleboard.org/buy</a>.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">O kit completo vem com a placa, um cabo USB e um cartão SD de 4G com a documentação e uma imagem do Angstrom pré-instalada. </span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">E por falar em imagem, que tal colocar esta plaquinha pra funcionar?</span><br /><br /><strong><span style="font-family: verdana,geneva; font-size: small;">SOFTWARE</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Alimente a Beaglebone diretamente com o cabo USB, ou ligue uma fonte externa de 5V. O led de Power irá acender, e os leds USER0 e USER1 começarão a piscar. A Beaglebone será identificada na sua máquina de desenvolvimento como um dispositivo de armazenamento (como se fosse um pendrive). Você verá um dispositivo chamado BEAGLE_BONE com um monte de arquivos, incluindo as imagens do bootloader e do kernel, documentação e drivers para sistemas operacionais menos evoluidos :)</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">O primeiro passo é abrir o arquivo README.htm no seu navegador e dar uma lida. Este arquivo contém algumas orientações gerais sobre o funcionamento da Beaglebone.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Neste momento, a distribuição Angstrom que vem com a placa já esta rodando. E você pode acessá-la de algumas formas.</span><br /><br /><strong><span style="font-family: verdana,geneva; font-size: small;">ACESSANDO VIA CONSOLE</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Para acessar via console no Linux, você vai precisar inserir o modulo ftdi_sio, conforme abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sudo modprobe ftdi_sio vendor=0x0403 product=0xa6d0</pre></div></div>



<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Serão criados dois dispositivos tty (no meu caso foram criados o ttyUSB0 e o ttyUSB1). O segundo (ttyUSB1) é a console. Configure sua aplicação de terminal favorita com 115200 8N1 e teste o acesso à console:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">U-Boot SPL 2011.09-00000-gf63b270-dirty (Nov 14 2011 - 10:37:14)
Texas Instruments Revision detection unimplemented
OMAP SD/MMC: 0
reading u-boot.img
reading u-boot.img
&nbsp;
U-Boot 2011.09-00000-gf63b270-dirty (Nov 14 2011 - 10:37:14)
&nbsp;
...
&nbsp;
.---O---.                                           
|       |                  .-.           o o        
|   |   |-----.-----.-----.| |   .----..-----.-----.
|       |     | __  |  ---'| '--.|  .-'|     |     |
|   |   |  |  |     |---  ||  --'|  |  |  '  | | | |
'---'---'--'--'--.  |-----''----''--'  '-----'-'-'-'
                -'  |
                '---'
&nbsp;
The Angstrom Distribution beaglebone ttyO0
&nbsp;
Angstrom v2011.10-core - Kernel 3.1.0+
&nbsp;
beaglebone login:</pre></div></div>



<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">O usuário é root e a senha vazia.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Se você tiver problemas, ou estiver usando outro sistema operacional, o arquivo README.htm mencionado mais acima possui algumas instruções adicionais que podem ajudá-lo.</span><br /><br /><strong><span style="font-family: verdana,geneva; font-size: small;">CONECTANDO VIA REDE</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">A Beaglebone tem um cliente DHCP rodando, então quando você ligá-la na sua rede (supondo-se que sua rede tenha um servidor DHCP), ela irá pegar um IP automaticamente.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Você pode consultar o IP atribuído à Beaglebone acessando-a via console, verificando o arquivo info.txt ou listando os logs do seu servidor DHCP.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Com a conexão de rede funcionando, você consegue acessar a Beaglebone por SSH (usuário root e sem senha):</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ssh root@192.168.1.107
The authenticity of host '192.168.1.107 (192.168.1.107)' can't be established.
RSA key fingerprint is d6:67:cf:08:d0:87:12:d9:12:c9:37:d9:81:bd:aa:db.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.107' (RSA) to the list of known hosts.
root@192.168.1.107's password:
root@beaglebone:~#</pre></div></div>



<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">A Beaglebone tem um servidor rodando na porta 80 que disponibiliza uma apresentação do projeto. Supondo que o IP da Beaglebone seja “192.168.0.7″, você consegue acessar este servidor simplesmente digitando no seu navegador “http:/192.168.0.7/”:</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/beaglebone_web_pres/" rel="attachment wp-att-2428" target="_blank"><img class="aligncenter size-full wp-image-2428" title="beaglebone_web_pres" src="http://sergioprado.org/wp-content/uploads/2012/01/beaglebone_web_pres.png" alt="beaglebone web pres Introduzindo a Beaglebone" width="550" height="453" /></a></span><br /><span style="font-family: verdana,geneva; font-size: small;">A Beaglebone tem também um outro servidor na porta 443 provendo acesso à console do equipamento via SSH de dentro do seu navegador! Supondo novamente que o IP da Beaglebone seja “192.168.0.7″, você consegue acessar este servidor digitando no seu navegador “https:/192.168.0.7/”. Obs: a Beaglebone usa o GateOne, um terminal e cliente SSH desenvolvido em HTML5. Portanto, você precisa de um navegador com suporte à HTML5.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/beaglebone_gateone/" rel="attachment wp-att-2429" target="_blank"><img class="aligncenter size-full wp-image-2429" title="beaglebone_gateone" src="http://sergioprado.org/wp-content/uploads/2012/01/beaglebone_gateone.png" alt="beaglebone gateone Introduzindo a Beaglebone" width="550" height="385" /></a></span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Mas o mais legal mesmo é a IDE embarcada no dispositivo e que pode ser acessada pelo navegador na porta 3000. Supondo mais uma vez que o IP da Beaglebone seja “192.168.0.7″, você consegue acessar esta IDE digitando no seu navegador “http:/192.168.0.7:3000“</span><br /><br /><a href="http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/beaglebone_cloud9/" rel="attachment wp-att-2432" target="_blank"><img class="aligncenter size-full wp-image-2432" title="beaglebone_cloud9" src="http://sergioprado.org/wp-content/uploads/2012/01/beaglebone_cloud9.png" alt="beaglebone cloud9 Introduzindo a Beaglebone" width="550" height="410" /></a><br /><span style="font-family: verdana,geneva; font-size: small;">Esta IDE embarcada na Beaglebone é a <a href="http://c9.io/" target="_blank">Cloud9 IDE</a>, uma interface que roda no seu navegador, e que possibilita escrever, executar e debugar aplicações escritas em JavaScript e baseadas em um framework chamado node.js.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">O conceito é bem parecido com o do <a href="http://sergioprado.org/2011/04/05/projetando-na-nuvem-com-o-kit-mbed/" target="_blank">projeto mbed que recebeu um artigo</a> um tempo atrás. Em ambos os projetos, a IDE roda no navegador. No caso do mbed, a IDE roda em um servidor na Internet. E no caso da Beaglebone, a IDE roda dentro dela mesmo!</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">E o que é esse tal de node.js? Segundo a <a href="http://nodejs.org/" target="_blank">página do projeto</a>, o node.js é uma plataforma que roda em cima do V8 (engine de JavaScript do Google) desenvolvida para se construir aplicações de rede rápidas e escaláveis. Na prática, você escreve programas em JavaScript que são interpretados e executados dentro da Beaglebone por uma aplicação chamada “node”. Ou seja, você trabalha com uma linguagem de script, mais amigável e com bibliotecas prontas para interfacear com o hardware e com o sistema operacional. </span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Por exemplo, esta é uma aplicação escrita em node.js que faz o led USER3 da Beaglebone piscar:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> bb <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'./bonescript'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> ledPin <span style="color: #339933;">=</span> bone.<span style="color: #660066;">P8_3</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> ledPin2 <span style="color: #339933;">=</span> bone.<span style="color: #660066;">USR3</span><span style="color: #339933;">;</span>
&nbsp;
setup <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    pinMode<span style="color: #009900;">&#40;</span>ledPin<span style="color: #339933;">,</span> OUTPUT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    pinMode<span style="color: #009900;">&#40;</span>ledPin2<span style="color: #339933;">,</span> OUTPUT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
loop <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    digitalWrite<span style="color: #009900;">&#40;</span>ledPin<span style="color: #339933;">,</span> HIGH<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    digitalWrite<span style="color: #009900;">&#40;</span>ledPin2<span style="color: #339933;">,</span> HIGH<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    delay<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    digitalWrite<span style="color: #009900;">&#40;</span>ledPin<span style="color: #339933;">,</span> LOW<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    digitalWrite<span style="color: #009900;">&#40;</span>ledPin2<span style="color: #339933;">,</span> LOW<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    delay<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
bb.<span style="color: #660066;">run</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">BEAGLEBONE X ARDUINO</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">A Beaglebone veio para preencher uma lacuna existente em desenvolvimento rápido e prototipagem para soluções high-end com Linux. Por esse motivo, não tem como deixar de fazer uma comparação com o Arduino. Ambos foram projetados com o conceito de expansão para facilitar a prototipagem: o Arduino com seus shields e a Beaglebone com seus capes. Ambos também possuem um ambiente de desenvolvimento que roda em qualquer SO, linguagem mais user-friendly, bibliotecas prontas, etc.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Mas não creio que seja uma questão de concorrência. O Arduino continuará sendo usado para acender leds, controlar motores e fazer seu robô andar. Agora, se você precisar de um sistema de reconhecimento facial dentro do seu robô, é aí que pode entrar a Beaglebone.</span><br /><br /><strong><span style="font-family: verdana,geneva; font-size: small;">BEAGLEBONE X BEAGLEBOARD-XM</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">De forma alguma a Beaglebone é uma evolução da Beagleboard-xM. Muito pelo contrário, o hardware da Beagleboard-xM é melhor. Eles apenas são projetos com conceitos diferentes. Se você quer mais processamento, memória, portas USB e conexão de vídeo, vai de Beagleboard-xM. Já se o que você quer é um hardware fácil de expandir e de baixo custo, vai de Beaglebone.</span><br /><br /><strong><span style="font-family: verdana,geneva; font-size: small;">BEAGLEBOARD X RASPBERRY PI</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Também não faz sentido a comparação. O objetivo do projeto <a href="http://www.raspberrypi.org/" target="_blank">Raspberry Pi</a> é o de ser um PC de baixo custo. Tá certo que, devido ao seu baixíssimo custo ($25 na versão normal e $35 na versão com Ethernet), muita gente vai querer tirar uma casquinha e até usar em algum projeto. Ou seja, se o que você precisa é de algo próximo à um computador pessoal (porta USB, saídas de áudio e vídeo) e de baixissimo custo, você pode pensar em usar a Raspberry Pi. Se você quer algo com mais capacidade de processamento, com diferentes interfaces de I/O e capacidade de expansão, pode pensar em usar a Beaglebone.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">O negócio agora é esperar a evolução do projeto, as placas de expansão que serão lançadas (ainda não me acostumei com o nome “capes”), e se o uso do framework node.js em Linux embarcado vai se popularizar.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Enquanto isso, diz aí: o que você achou da Beaglebone? Tem intenção de comprá-la para usar em algum projeto?</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Um abraço,</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Sergio Prado</span></p>
<div class="shr-publisher-2416"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Sem posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2012/01/26/introduzindo-a-beaglebone/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Resultado do concurso do livro uC/OS-III The Real-Time Kernel</title>
		<link>http://sergioprado.org/2012/01/25/resultado-do-concurso-do-livro-ucos-iii-the-real-time-kernel/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=resultado-do-concurso-do-livro-ucos-iii-the-real-time-kernel</link>
		<comments>http://sergioprado.org/2012/01/25/resultado-do-concurso-do-livro-ucos-iii-the-real-time-kernel/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 18:19:24 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Concurso]]></category>
		<category><![CDATA[Linguagem C]]></category>
		<category><![CDATA[RTOS]]></category>
		<category><![CDATA[ucosiii]]></category>

		<guid isPermaLink="false">http://sergioprado.org/?p=2395</guid>
		<description><![CDATA[Resultado do concurso para ganhar o livro uC/OS-III The Real-Time Kernel.
Posts relacionados:<ol>
<li><a href='http://sergioprado.org/2012/01/10/quer-ganhar-o-livro-ucos-iii-da-micrium/' rel='bookmark' title='Quer ganhar o livro uC/OS-III The Real-Time Kernel?'>Quer ganhar o livro uC/OS-III The Real-Time Kernel?</a></li>
<li><a href='http://sergioprado.org/2010/11/02/resultado-do-concurso-para-ganhar-o-convite-vip/' rel='bookmark' title='Resultado do concurso para ganhar o convite VIP'>Resultado do concurso para ganhar o convite VIP</a></li>
<li><a href='http://sergioprado.org/2010/05/18/sistemas-de-tempo-real-parte-2-3/' rel='bookmark' title='Sistemas de Tempo Real — Parte 2'>Sistemas de Tempo Real — Parte 2</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic -->
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Muito bem pessoal, chegou a hora de conhecer os 3 vencedores da <a href="http://sergioprado.org/2012/01/10/quer-ganhar-o-livro-ucos-iii-da-micrium/" target="_blank">promoção para ganhar o livro de RTOS da Micrium</a>!</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Primeiramente, gostaria de agradecer à todos pela participação. Recebi 85 respostas, e deu um pouco de trabalho corrigir tudo! :)</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">A maioria acertou pelo menos 3 dos 4 desafios, e 38 acertaram tudo. Dentre estas 38 pessoas, fiz o sorteio lá no <a href="http://www.random.org/" target="_blank">http://www.random.org/</a>.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Mas antes de dizer quem são os 3 felizardos, que tal darmos uma olhada novamente nos desafios?</span></p>
<p><strong><span style="font-family: verdana, geneva; font-size: small;">DESAFIO 1</span></strong></p>
<p><span style="font-family: verdana, geneva; font-size: small;">O desafio 1 dizia o seguinte:</span></p>
<p><span style="font-family: verdana, geneva; font-size: small;">O código abaixo tem um erro. Qual é este erro?</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define SIZE 15 </span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> i<span style="color: #339933;">;</span>
&nbsp;
    a <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span>SIZE<span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> SIZE<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> i<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> i <span style="color: #339933;">*</span> i<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> SIZE<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%dn&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    free<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">A maioria acertou este desafio. Na linha 10 alocamos uma região de memória e armazenamos o endereço no ponteiro “a”. Na linha 16 este ponteiro é alterado, e quando tentamos desalocá-lo na linha 18 teremos problemas na certa, já que o ponteiro “a” não armazena mais o endereço inicial retornado por malloc(). A solução aqui seria não alterar este ponteiro. O código abaixo resolve o problema:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define SIZE 15 </span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> i<span style="color: #339933;">;</span>
&nbsp;
    a <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span>SIZE<span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> SIZE<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> i<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> i <span style="color: #339933;">*</span> i<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> SIZE<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%dn&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// CORREÇÃO</span>
&nbsp;
    free<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Algumas pessoas apontaram ainda que faltou checar o retorno da função malloc() e fazer o cast para (int *). É verdade! O cast é necessário principalmente se você tentar compilar em C++. Mas não considerei estes fatores para validar a resposta como certa.</span></p>
<p><strong><span style="font-family: verdana, geneva; font-size: small;">DESAFIO 2</span></strong></p>
<p><span style="font-family: verdana, geneva; font-size: small;">O desafio 2 dizia o seguinte:</span></p>
<p><span style="font-family: verdana, geneva; font-size: small;">O código abaixo tam­bém tem um erro. Qual?</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span><span style="color: #339933;">*</span> ptr1<span style="color: #339933;">,</span> ptr2<span style="color: #339933;">;</span>
&nbsp;
    ptr1 <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    ptr2 <span style="color: #339933;">=</span> ptr1<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #339933;">*</span>ptr2 <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">A maioria também acertou este exercício. Uma coisa que aprendi deste quando comecei a estudar C é que devemos colocar o “*” sempre do lado do nome do ponteiro, e não do lado do tipo. No código acima, ptr2 é um inteiro, e não um ponteiro para inteiro como pretendiamos, causando erro na linha 11. Para corrigir este código, basta declarar ptr2 como ponteiro:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ptr1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ptr2<span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// CORREÇÃO</span>
&nbsp;
    ptr1 <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    ptr2 <span style="color: #339933;">=</span> ptr1<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #339933;">*</span>ptr2 <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Assim como no primeiro exercício, algumas pessoas também apontaram a ausência da checagem do retorno da função malloc() e do cast para (int *). Mas também não considerei estes fatores para validar a resposta como certa.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Outros falaram da ausência do free(). Sim, é sempre uma boa prática usar o free(), mas sua ausência nem sempre significa erro. No nosso caso, como a aplicação aloca e depois encerra, não teremos problema com memory leak pela ausência do free().</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana, geneva; font-size: small;">DESAFIO 3</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">O desafio 3 dizia o seguinte:</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">A função abaixo recebe um vetor de números inteiros e tem o obje­tivo de retornar o menor número inteiro deste vetor. Imple­mente esta função sem usar nen­hum oper­ador de com­para­ção! Ou seja, você não pode usar nen­hum destes oper­adores: “==”, “!=”, “&gt;”, “&lt;”, “&gt;=”, “&lt;=”.</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> menor<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> buf<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> size_t size<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Aqui o bicho pegou! Este é o típico “exercício bombril”, que pode ser resolvido de 1001 maneiras. Recebi implementações de 5 linhas e outras de 50 linhas! :)</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Esta é a minha sugestão de implementação:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> menor<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> buf<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> size_t size<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> m <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> size<span style="color: #339933;">;</span> i<span style="color: #339933;">;</span> i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>buf<span style="color: #009900;">&#91;</span>i <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> m<span style="color: #339933;">;</span>
            buf<span style="color: #009900;">&#91;</span>i <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">--;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        m<span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Eu faço uma varredura do vetor em um loop e decremento, um a um, cada elemento deste vetor. A quantidade de decrementos realizados é armazenada na variável “m”. Quando um dos elementos do vetor atingir o valor 0, significa que descobri qual era o elemento de menor valor dentro do vetor, e retorno este valor, que é exatamente a quantidade de decrementos realizada, armazenada na variável “m”.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Recebi algumas implementações que usavam esta lógica, mas também recebi outras implementações bem interessantes.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Achei bem legal esta implementação do Paulo Daniel:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> menor<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> buf<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> size_t size<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> min <span style="color: #339933;">=</span> UINT_MAX<span style="color: #339933;">;</span>
   <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>size<span style="color: #009900;">&#41;</span> 
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#91;</span><span style="color: #339933;">--</span>size<span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span>min<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
         min <span style="color: #339933;">=</span> buf<span style="color: #009900;">&#91;</span>size<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">return</span> min<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Ele conseguiu resolver em 5 linhas, usando apenas uma operação de divisão de inteiros!</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;"><strong>Atualização:</strong> Como bem observado pelos leitores Fernando Barboza e Уθя¡ςκ, esta implementação tem uma falha, já que existe o risco de divisão por 0 na linha 5. Mas a forma como o problema foi resolvido não deixa de ser bem interessante.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Já o Douglas Drumond preferiu escovar alguns bits e trabalhar com complemento de 2:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> menor<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> buf<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> size_t size<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> shamt <span style="color: #339933;">=</span>  <span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">8</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> mask <span style="color: #339933;">=</span> <span style="color: #208080;">0x01</span><span style="color: #339933;">;</span>
&nbsp;
    size_t i <span style="color: #339933;">=</span> size <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> menor_item <span style="color: #339933;">=</span> buf<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> menor_item<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;&gt;</span> shamt<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> mask<span style="color: #009900;">&#41;</span> menor_item <span style="color: #339933;">=</span> buf<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> menor_item<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><strong><span style="font-family: verdana, geneva; font-size: small;">DESAFIO 4</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Este desafio dizia o seguinte:</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Escreva um pro­grama em C que imprima “Quero o meu livro!”, mas sem usar nen­hum ponto-e-vírgula no arquivo “.c”! Obs: o pro­grama deve com­pi­lar e fun­cionar nor­mal­mente.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">A solução é bem simples:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Quero o livro!n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Você pode trocar o “if” pelo “while” também.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Teve gente que queria tanto o livro que colocou em um loop infinito! :)</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Quero o meu livro!n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Mas aqui o pessoal resolveu usar a criatividade. Como falei apenas que não podia usar “;” no arquivo “.c”, e não mencionei nada sobre o uso de arquivo “.h”, recebi respostas do tipo:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Author: Celso</span>
<span style="color: #666666; font-style: italic;">// imprime.c</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #339933;">#include &quot;imprime.h&quot;</span>
<span style="color: #993333;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  IMPRIME
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// imprime.h</span>
<span style="color: #339933;">#define IMPRIME   printf(&quot;Quero o meu livro!n&quot;);</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Ou então trocando o “;” por um define passado pelo compilador:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* Author: Fernando Martines
 *
 * Compilacao: gcc -DSPECIAL=&quot;;&quot; desafio4.c -o desafio4
 */</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Quero o meu livro!n&quot;</span><span style="color: #009900;">&#41;</span> SPECIAL
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span> SPECIAL
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Bom, gostei muito do resultado destes desafios. Aprendi bastante e espero que vocês tenham aprendido também. Afinal, o que importa é participar. Ganhar é só um detalhe, não é verdade? O quê? Não!? :)</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">OK, chega de enrolação, estes são os três participantes que acertaram os 4 desafios e foram sorteados para receber o livro:</span></p>
<ul>
	<li><span style="font-family: verdana, geneva; font-size: small;">Rodrigo (a.k.a. Skhaz)</span></li>
	<li><span style="font-family: verdana, geneva; font-size: small;">Eduardo Vieira</span></li>
	<li><span style="font-family: verdana, geneva; font-size: small;">Rodolfo Pereira Araujo</span></li>
</ul>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Para aqueles que não ganharam, não desanimem! </span><span style="font-family: verdana, geneva; font-size: small;">Vocês podem baixar gratuitamente o PDF do livro no site da Micrium <a href="http://micrium.com/page/downloads/os-iii_projects" target="_blank">aqui</a>.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Ou então vocês podem esperar o próximo concurso. Eu havia falado que tinha 3 livros, não é verdade? Então… eu estava escondendo o jogo! :)</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Na verdade, alem destes 3, tenho mais 1! E logo mais teremos um novo desafio por aqui. Mas desta vez não será tão fácil assim! :)</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Um abraço!</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Sergio Prado</span></p>
<div id="-chrome-auto-translate-plugin-dialog" style="opacity: 1 !important; background-image: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: transparent !important; position: absolute !important; top: 0px; left: 0px; overflow-x: visible !important; overflow-y: visible !important; z-index: 999999 !important; text-align: left !important; display: none; padding: 0px !important; margin: 0px !important;">
<div style="max-width: 300px !important; color: #fafafa !important; opacity: 0.8 !important; border-color: #000000 !important; border-width: 0px !important; -webkit-border-radius: 10px !important; background-color: #363636 !important; font-size: 16px !important; padding: 8px !important; overflow: visible !important; background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, #000), color-stop(50%, #363636), color-stop(100%, #000)); z-index: 999999 !important; text-align: left  !important;"></div>
<p><img style="position: absolute !important; z-index: -1 !important; right: 1px !important; top: -20px !important; cursor: pointer !important; -webkit-border-radius: 20px; background-color: rgba(200, 200, 200, 0.3) !important; padding: 3px 5px 0 !important; margin: 0 !important;" onclick="document.location.href='http://translate.google.com/';" src="http://www.google.com/uds/css/small-logo.png" alt="small logo Resultado do concurso do livro uC/OS III The Real Time Kernel"  title="Resultado do concurso do livro uC/OS III The Real Time Kernel" /></p>
</div>
<div class="shr-publisher-2395"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Posts relacionados:</p><ol>
<li><a href='http://sergioprado.org/2012/01/10/quer-ganhar-o-livro-ucos-iii-da-micrium/' rel='bookmark' title='Quer ganhar o livro uC/OS-III The Real-Time Kernel?'>Quer ganhar o livro uC/OS-III The Real-Time Kernel?</a></li>
<li><a href='http://sergioprado.org/2010/11/02/resultado-do-concurso-para-ganhar-o-convite-vip/' rel='bookmark' title='Resultado do concurso para ganhar o convite VIP'>Resultado do concurso para ganhar o convite VIP</a></li>
<li><a href='http://sergioprado.org/2010/05/18/sistemas-de-tempo-real-parte-2-3/' rel='bookmark' title='Sistemas de Tempo Real — Parte 2'>Sistemas de Tempo Real — Parte 2</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2012/01/25/resultado-do-concurso-do-livro-ucos-iii-the-real-time-kernel/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Aprendendo e compartilhando</title>
		<link>http://sergioprado.org/2012/01/17/aprendendo-e-compartilhando/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aprendendo-e-compartilhando</link>
		<comments>http://sergioprado.org/2012/01/17/aprendendo-e-compartilhando/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 13:51:18 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Dicas de carreira]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[compartilhar]]></category>

		<guid isPermaLink="false">http://sergioprado.org/?p=2376</guid>
		<description><![CDATA[Este post é sobre aprender, compartilhar e fazer a diferença!
Sem posts relacionados.]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic -->
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Quem é leitor assíduo do blog sabe que de vez em quando deixo de lado os bits e bytes do dia-a-dia para me meter em assuntos mais “analógicos” como <a href="http://www.sergioprado.org/category/dicas-de-carreira/" target="_blank">atitudes, gestão de carreira e filosofia de vida</a>.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Não que eu seja um especialista em psicologia comportamental, ou que tenha passado anos meditando com monges budistas, longe disso! :) Mas acredito que tenho um compromisso de compartilhar aquilo em que acredito com àqueles que acompanham o blog.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">E já recebi de pessoas que me acompanham inúmeras mensagens e perguntas sobre como criar um blog. Sobre o que escrever? Que domínio escolher? Como e onde hospedar? Que ferramentas usar? Qual o melhor layout? E por aí vai…</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Vou tentar responder todas estas perguntas, dentro daquilo que tenho experienciado nestes mais de dois de blog. Mas antes quero falar sobre algo fundamental. Algo o qual você precisa estar preparado. Porque tão importante quanto iniciar um projeto, é ter disciplina para mantê-lo.</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana, geneva; font-size: small;">POKE THE BOX</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Recentemente li mais um ótimo livro do <a href="http://www.sethgodin.com/" target="_blank">Seth Godin</a>, chamado <a href="http://www.amazon.com/gp/product/1936719002/ref=as_li_ss_tl?ie=UTF8&amp;tag=blodoserpra-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1936719002" target="_blank">Poke the Box</a>. O livro é sobre como tomar initiativas. Iniciar projetos. Mas é também sobre entregas. Finalizar projetos. E como se preparar para o que acontecer neste meio tempo.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">O problema principal aqui é o medo. Medo de fracassar. As pessoas tem medo de fracassar. E lidam com isso de duas formas. </span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Alguns vão ao extremo. Iniciam tantos projetos que não acabam nenhum. É um meio de fugir das responsabilidades. De arranjar desculpas para não terminar aquilo que começou.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Mas a maioria não inicia nenhum projeto, por medo de falhar. Afinal, começar algo maximiza as chances de fracasso. Na prática, o fracasso é o mesmo. Na verdade, pior, já que deixamos de aprender com os erros.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Portanto, se você quer começar seu blog. Simplesmente comece. Dê o primeiro passo.</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana, geneva; font-size: small;">OS PRIMEIROS PASSOS</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Tomar a decisão é difícil. Executar é fácil. Crie uma conta no <a href="http://www.blogger.com/" target="_blank">Blogger</a> ou no <a href="http://wordpress.com/" target="_blank">WordPress</a>. Em questão de minutos seu blog estará pronto para o primeiro post. Vai lá!</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Mas sobre o que você quer escrever? Escreva sobre o que você gosta. Escreva sobre o que te motiva. E não invente. Os leitores são inteligentes. Por outro lado, também não tenha medo de expressar sua opinião. É ela que faz a diferença.</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana, geneva; font-size: small;">PEDE PRA SAIR!?</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Depois de alguns posts você começará a ouvir dentro de sua cabeça a voz do <a href="http://pt.wikipedia.org/wiki/Capit%C3%A3o_Roberto_Nascimento" target="_blank">Capitão Nascimento</a>: “Pede pra sair!”.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Você esta disposto a investir horas por semana para escrever um post de qualidade? Porque você vai começar a reclamar de falta de tempo (seria prioridade?) para escrever no blog.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Esteja preparado também para enfrentar opiniões divergentes dos leitores. Você vai precisar ter jogo de cintura. Aprender a “ouvir” diferentes pontos de vista. Assumir seus erros e bola pra frente. Mas aproveita. Você vai aprender bastante, eu garanto.</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana, geneva; font-size: small;">PORQUE COMPARTILHAR?</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Simplesmente pelo fato de que você tem o que compartilhar. E porque vai contribuir com sua própria experiência. E com seu próprio aprendizado. E também porque se você não o fizer, quer goste ou não, esta tirando algo de todos nós. Algo que só você sabe. E que poderia estar fazendo a diferença para muita gente.</span></p>
<p><strong><span style="font-family: verdana, geneva; font-size: small;">MAIS ALGUNS DETALHES</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Conforme você mantém a disciplina e a regularidade na publicação de conteúdo, a quantidade de leitores irá crescer, e você vai querer migrar para seu próprio domínio.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Mas qual dominio usar? Use seu nome, um apelido ou algum nome abstrato. Hospedagem? Eu uso o <a href="http://www.godaddy.com/" target="_blank">GoDaddy</a>, mas existem muitos outros por aí. Layout? Prefira algo limpo, que facilite a leitura. Propagandas? Evite ao máximo. Ou use em lugares que não atrapalhem a leitura dos posts.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Mas não se preocupe com isso. São apenas alguns “detalhes”. Difícil mesmo é dar o passo inicial. E depois continuar andando.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Portanto, dedique-se à pratica de iniciar projetos. Frequentemente. E sempre. Esqueça a idéia de que existe um mapa pronto, e que você precisa seguir este mapa. Desenhe seu próprio mapa. Siga-o. E mude a rota quando necessário. Faça a diferença.</span></p>
<blockquote>
<p style="text-align: center;"><span style="font-family: verdana, geneva; font-size: small;">“There are two mistakes one can make along the road to truth. Not going all the way, and not starting.” Siddhartha Gautama</span></p></blockquote>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">E aí, pronto pra compartilhar?</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Um abraço,</span></p>
<p style="text-align: justify;"><span style="font-family: verdana, geneva; font-size: small;">Sergio Prado</span></p>
<div id="-chrome-auto-translate-plugin-dialog" style="opacity: 1 !important; background-image: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: transparent !important; position: absolute !important; top: 0px; left: 0px; overflow-x: visible !important; overflow-y: visible !important; z-index: 999999 !important; text-align: left !important; display: none; background-position: initial initial !important; background-repeat: initial initial !important; padding: 0px !important; margin: 0px !important;">
<div style="max-width: 300px !important; color: #fafafa !important; opacity: 0.8 !important; border-color: #000000 !important; border-width: 0px !important; -webkit-border-radius: 10px !important; background-color: #363636 !important; font-size: 16px !important; padding: 8px !important; overflow: visible !important; background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, #000), color-stop(50%, #363636), color-stop(100%, #000)); z-index: 999999 !important; text-align: left  !important;"></div>
<img style="position: absolute !important; z-index: -1 !important; right: 1px !important; top: -20px !important; cursor: pointer !important; -webkit-border-radius: 20px; background-color: rgba(200, 200, 200, 0.3) !important; padding: 3px 5px 0 !important; margin: 0 !important;" onclick="document.location.href='http://translate.google.com/';" src="http://www.google.com/uds/css/small-logo.png" alt="small logo Aprendendo e compartilhando"  title="Aprendendo e compartilhando" /></div>
<div class="shr-publisher-2376"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Sem posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2012/01/17/aprendendo-e-compartilhando/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Quer ganhar o livro uC/OS-III The Real-Time Kernel?</title>
		<link>http://sergioprado.org/2012/01/10/quer-ganhar-o-livro-ucos-iii-da-micrium/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=quer-ganhar-o-livro-ucos-iii-da-micrium</link>
		<comments>http://sergioprado.org/2012/01/10/quer-ganhar-o-livro-ucos-iii-da-micrium/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 18:28:17 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Concurso]]></category>
		<category><![CDATA[RTOS]]></category>
		<category><![CDATA[micrium]]></category>
		<category><![CDATA[ucosiii]]></category>

		<guid isPermaLink="false">http://sergioprado.org/?p=2341</guid>
		<description><![CDATA[Concurso para ganhar o livro uC/OS-III - The Real-Time Kernel da Micrium.
Posts relacionados:<ol>
<li><a href='http://sergioprado.org/2011/06/24/quer-ganhar-um-convite-vip-para-o-seminario-linux-embarcado-2011/' rel='bookmark' title='Quer ganhar um convite VIP para o Seminário Linux Embarcado 2011?'>Quer ganhar um convite VIP para o Seminário Linux Embarcado 2011?</a></li>
<li><a href='http://sergioprado.org/2010/05/18/sistemas-de-tempo-real-parte-2-3/' rel='bookmark' title='Sistemas de Tempo Real — Parte 2'>Sistemas de Tempo Real — Parte 2</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic -->
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Como vocês podem ver, tenho aqui comigo algumas cópias de capa-dura do livro sobre o novíssimo <a href="http://micrium.com/page/products/rtos/os-iii" target="_blank">uC/OS-III</a> da <a href="http://micrium.com/" target="_blank">Micrium</a>!</span></p>
<p><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/wp-content/uploads/2012/01/livros-micrium.jpg" target="_blank"><img class="size-full wp-image-2342 aligncenter" title="livros-micrium" src="http://sergioprado.org/wp-content/uploads/2012/01/livros-micrium.jpg" alt="livros micrium Quer ganhar o livro uC/OS III The Real Time Kernel?" width="550" height="309" /></a></span></p>
<p style="text-align: center;"><strong><span style="font-family: verdana,geneva; font-size: small;">Arthur esta louco para começar a usar o uC/OS-III no seu ARM Cortex-M3!</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">O livro é muito bom, extremamente didático, fácil de acompanhar e entender. Traz os conceitos principais de sistemas operacionais de tempo real como o escalonador de tarefas, tratamento de interrupções, mecanismos de sincronização, comunicação entre tarefas, etc. São 820 páginas de muito RTOS na veia!</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Os livros foram gentilmente doados pela NXP para serem sorteados aqui no blog. Mas é claro que não vai ser tão fácil assim! :)</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Se você quer receber este livro no conforto da sua casa (frete por minha conta para qualquer lugar do Brasil) precisa resolver os 4 desafios abaixo.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Cada desafio vale um ponto. As 3 (três) pessoas que pontuarem melhor levarão um livro para casa. Se houver empate, farei um sorteio. O concurso vale até o dia 24/01/2012 às 23:59.</span><br /><br /><del><span style="font-family: verdana,geneva; font-size: small;">Mandem as respostas para <a href="mailto:contato@sergioprado.org?subject=Concurso%20livro%20Micrium" target="_blank">contato@sergioprado.org</a> com o assunto “<em>Concurso livro Micrium</em>”.</span></del></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;"><strong>Atualização:</strong> O concurso esta encerrado. O resultado foi publicado <a href="http://sergioprado.org/2012/01/25/resultado-do-concurso-do-livro-ucos-iii-the-real-time-kernel/" target="_blank">aqui</a>.</span><br /><br /><strong><span style="font-family: verdana,geneva; font-size: small;">DESAFIO 1</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">O código abaixo tem um erro. Qual é este erro?</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define SIZE 15 </span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">,</span> i<span style="color: #339933;">;</span>
&nbsp;
    a <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span>SIZE<span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> SIZE<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> i<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> i <span style="color: #339933;">*</span> i<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> SIZE<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>a<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    free<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">DESAFIO 2</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">O código abaixo também tem um erro. Qual?<br /></span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span><span style="color: #339933;">*</span> ptr1<span style="color: #339933;">,</span> ptr2<span style="color: #339933;">;</span>
&nbsp;
    ptr1 <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    ptr2 <span style="color: #339933;">=</span> ptr1<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #339933;">*</span>ptr2 <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">DESAFIO 3</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">A função abaixo recebe um vetor de números inteiros e tem o objetivo de retornar o menor número inteiro deste vetor. Implemente esta função sem usar nenhum operador de comparação! Ou seja, você não pode usar nenhum destes operadores: “<em>==</em>”, “<em>!=</em>”, “<em>&gt;</em>”, “<em>&lt;</em>”, “<em>&gt;=</em>”, “<em>&lt;=</em>”.</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> menor<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> buf<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> size_t size<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">DESAFIO 4</span></strong><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Escreva um programa em C que imprima “<em>Quero o meu livro!</em>”, mas sem usar nenhum ponto-e-vírgula no arquivo “<em>.c</em>”! Obs: o programa deve compilar e funcionar normalmente.</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Um abraço e boa sorte!</span><br /><br /><span style="font-family: verdana,geneva; font-size: small;">Sergio Prado</span></p>
<div class="shr-publisher-2341"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Posts relacionados:</p><ol>
<li><a href='http://sergioprado.org/2011/06/24/quer-ganhar-um-convite-vip-para-o-seminario-linux-embarcado-2011/' rel='bookmark' title='Quer ganhar um convite VIP para o Seminário Linux Embarcado 2011?'>Quer ganhar um convite VIP para o Seminário Linux Embarcado 2011?</a></li>
<li><a href='http://sergioprado.org/2010/05/18/sistemas-de-tempo-real-parte-2-3/' rel='bookmark' title='Sistemas de Tempo Real — Parte 2'>Sistemas de Tempo Real — Parte 2</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2012/01/10/quer-ganhar-o-livro-ucos-iii-da-micrium/feed/</wfw:commentRss>
		<slash:comments>48</slash:comments>
		</item>
		<item>
		<title>Configurando e usando o Eclipse em Linux embarcado</title>
		<link>http://sergioprado.org/2012/01/04/configurando-usando-eclipse-em-linux-embarcado/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=configurando-usando-eclipse-em-linux-embarcado</link>
		<comments>http://sergioprado.org/2012/01/04/configurando-usando-eclipse-em-linux-embarcado/#comments</comments>
		<pubDate>Wed, 04 Jan 2012 16:36:01 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[Linux embarcado]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://sergioprado.org/?p=2238</guid>
		<description><![CDATA[Neste artigo estudaremos como configurar e usar o Eclipse no desenvolvimento de aplicações para Linux embarcado.
Posts relacionados:<ol>
<li><a href='http://sergioprado.org/2011/11/30/gerando-e-usando-toolchains-em-linux-embarcado/' rel='bookmark' title='Gerando e usando toolchains em Linux embarcado'>Gerando e usando toolchains em Linux embarcado</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic -->
<p style="text-align: justify;"><span style="font-size: small; font-family: verdana,geneva;">Neste artigo irei responder uma pergunta que recebo frequentemente no blog e no dia-a-dia do trabalho que realizo na minha empresa:</span></p>
<blockquote>
<p style="text-align: center;"><span style="font-family: verdana,geneva; font-size: small;">“Sergio, como faço para configurar um ambiente de desenvolvimento de aplicações para Linux embarcado?”</span></p></blockquote>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">A resposta? Mais fácil do que você imagina.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Existem algumas ferramentas de ambiente de desenvolvimento integrado (IDE) disponíveis para quem trabalha com Linux, dentre elas o <a href="http://kdevelop.org/" target="_blank">KDevelop</a> e o <a href="http://eclipse.org/" target="_blank">Eclipse</a>.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Eu particularmente gosto bastante do KDevelop, mas o Eclipse é definitivamente a IDE open-source mais popular do mercado. E aqui nós iremos aprender a configurá-la como ambiente de desenvolvimento para Linux embarcado.</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">HISTÓRICO</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">No fim da década de 90, a IBM iniciou o desenvolvimento do Eclipse, inicialmente como um ambiente de desenvolvimento para a linguagem Java. Em 2001, para alavancar o desenvolvimento do projeto, a IBM doou o código para a comunidade de software livre. E em 2004, foi criada a Fundação Eclipse. Desde então, o projeto evoluiu bastante, e hoje ele esta bem maduro para ser utilizado em projetos de diferentes propósitos.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Mas Sergio, o que vou fazer com um ambiente de desenvolvimento para Java se irei programar em C?</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">É aí que esta o segredo do Eclipse. Sua arquitetura baseada em plugins possibilitou a expansão das suas funcionalidades, como por exemplo a adição de um editor C/C++.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Então algumas empresas começaram a pensar: porque vou criar um ambiente de desenvolvimento do zero, se posso pegar uma ferramenta pronta, madura e funcional, e apenas adaptá-la ao meu produto? </span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Daí surgiram muitas ferramentas de desenvolvimento baseadas no Eclipse. Quer alguns exemplos?</span></p>
<ul style="text-align: justify;">
	<li><span style="font-family: verdana,geneva; font-size: small;"><a href="http://mvista.com/product_detail_devrocket.php" target="_blank">DevRocket</a> da Montavista.<br /></span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;"><a href="http://www.timesys.com/embedded-linux/tools/ide" target="_blank">TimeStorm</a> da Timesys<br /></span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;"><a href="http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/overview/" target="_blank">Sourcery CodeBench</a> da Mentor Graphics<br /></span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;"><a href="http://www.code-red-tech.com/lpcxpresso.php" target="_blank">LPCXpresso’s IDE</a> da Code Red (para uCs da NXP)<br /></span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;"><a href="http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4116" target="_blank">AVR32 Studio 2.6</a> da Atmel<br /></span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">E por aí vai!</span></li>
</ul>
<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">PORQUE UMA IDE? PORQUE O ECLIPSE?</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Dependendo do tamanho e da complexidade do seu projeto, você vai precisar de uma ferramenta para agilizar seu trabalho. Em se tratando de Linux embarcado, uma IDE pode te ajudar bastante, principalmente se tiver:<br /></span></p>
<ol style="text-align: justify;">
	<li><span style="font-family: verdana,geneva; font-size: small;">Um bom editor de código-fonte, com suporte a highlighting de sintaxe, auto-complete de código e navegação entre os objetos do projeto (funções, estruturas, variáveis, etc). <br /></span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">Um gerenciador de build do projeto para gerar automaticamente o arquivo de build a partir do código-fonte.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">Um debugger decente.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">Um mecanismo de gerenciamento remoto do dispositivo alvo (seu produto, kit de desenvolvimento, etc).<br /></span></li>
</ol>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Conseguimos tudo isso (e muito mais) através do Eclipse e de dois plugins, o CDT (C/C++ Development Toolkit) e o RSE (Remote Systems Explorer).</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">E configurar este ambiente nao tem muito segredo.</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">INSTALANDO</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">A versão mais atual do Eclipse no momento em que escrevo este artigo é a Eclipse Indigo. É ela que utilizaremos para nossos testes.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Pela <a href="http://www.eclipse.org/downloads/" target="_blank">página de downloads</a> você pode baixar a ferramenta em diferentes “sabores” (IDE para java, java EE, javaScript, modelagem de dados, testes de software, etc). </span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Nós queremos a versão com suporte a C/C++ para Linux: Eclipse IDE for C/C++ Linux Developers. Nesta versão já estão empacotados todos os plugins que mencionei acima.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Você pode executar os comandos abaixo para baixar, instalar e executar o eclipse:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ wget http://eclipse.c3sl.ufpr.br/technology/epp/downloads/release/indigo/SR1/eclipse-linuxtools-indigo-SR1-incubation-linux-gtk.tar.gz
$ tar zxfv eclipse-linuxtools-indigo-SR1-incubation-linux-gtk.tar.gz
$ cd eclipse/
$ ./eclipse</pre></div></div>



<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Agora vamos começar a configurar a ferramenta, começando pelo Remote System Explorer.</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">TESTANDO E USANDO O RSE</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">O RSE (Remote System Explorer) é uma ferramenta que vai possibilitar o acesso e gerenciamento remoto do hardware. Através de uma conexão remota via rede com o dispositivo, você poderá manipular o sistema de arquivos, copiar/remover/editar arquivos, obter acesso ao shell, tudo pela interface do Eclipse!</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Para começar, abra a perspectiva do RSE em “<em>Window-&gt;Open Perspective-&gt;Other-&gt;Remote System Explorer</em>”.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">À sua esquerda vai aparecer uma janela com as conexões disponíveis. Por padrão, a única conexão disponível é uma local com o sistema de arquivos da sua máquina de desenvolvimento:</span></p>
<p style="text-align: justify;"></p>
<p><a href="http://sergioprado.org/wp-content/uploads/2012/01/rse_1.png" target="_blank"><img class="aligncenter" style="vertical-align: middle;" src="http://sergioprado.org/wp-content/uploads/2012/01/rse_1.png" alt="rse 1 Configurando e usando o Eclipse em Linux embarcado" width="550" height="371" title="Configurando e usando o Eclipse em Linux embarcado" /></a></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Vamos criar agora uma conexão remota via SSH com o equipamento. Esta configuração exige que seu equipamento esteja conectado em rede com sua máquina de desenvolvimento.</span></p>
<ol style="text-align: justify;">
	<li><span style="font-family: verdana,geneva; font-size: small;">Clique com o botão direito na janela à esquerda que contém as conexões disponíveis e selecione “<em>New-&gt;Connection</em>”.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">Selecione “<em>SSH Only</em>” e clique em “<em>Next</em>”.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">Digite o IP do equipamento no campo “<em>Host name</em>” e um nome que você quer dar para a conexão no campo “<em>Connection name</em>”. </span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">Clique em “<em>Finish</em>”.</span></li>
</ol>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Uma outra conexão com o nome que você configurou aparecerá à esquerda. Clique com o botão direito nela, selecione “<em>Connect</em>”, digite e usuário e senha, e pronto! Se você não receber nenhuma mensagem de erro, seu acesso remoto esta configurado e funcionando. Com ele você terá acesso ao shell do equipamento via SSH. Mas o mais interessante é o acesso remoto ao rootfs do equipamento:</span></p>
<p style="text-align: center;"><a href="http://sergioprado.org/wp-content/uploads/2012/01/rse_2.png" target="_blank"><span style="font-family: verdana,geneva; font-size: small;"><img class="aligncenter" src="http://sergioprado.org/wp-content/uploads/2012/01/rse_2.png" alt="rse 2 Configurando e usando o Eclipse em Linux embarcado" width="550" height="381" title="Configurando e usando o Eclipse em Linux embarcado" /></span></a></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Facilita bastante nosso trabalho quando precisamos navegar pelo rootfs do equipamento e alterar algum arquivo, não é verdade?</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Obs: Esta conexão criada exige um servidor SSH com suporte à SFTP instalado no equipamento. O OpenSSH serve bem para este propósito, mas em alguns casos ele é grande demais para ser embarcado no dispositivo. Então você pode usar o Dropbear e um outro servidor SFTP. Você pode também querer usar o FTP ao invés do SFTP. Neste caso, você vai precisar criar no Eclipse duas conexões, uma para o SSH e outra para o FTP.</span></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">CROSS-COMPILANDO UMA APLICAÇÃO</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Cross-compilar uma aplicação no Eclipse é muito simples, basta ter um toolchain configurado para a sua plataforma. Você pode baixar um toolchain pronto ou gerar seu próprio toolchain. </span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Escrevi dois artigos que podem te ajudar a entender o que são e como gerar toolchains para o seu equipamento. Se você quer entender o que são toolchains <a href="http://sergioprado.org/2011/11/02/desmistificando-toolchains-em-linux-embarcado/" target="_blank">clique aqui</a> e se quiser saber com gerar um toolchain <a href="http://sergioprado.org/2011/11/30/gerando-e-usando-toolchains-em-linux-embarcado/" target="_blank">clique aqui</a>.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Agora vamos criar um projeto no Eclipse preparado para cross-compilar uma aplicação para seu equipamento:</span></p>
<ol>
	<li style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Vá para a perspectiva C/C++ em “<em>Window-&gt;Open Perspective-&gt;C/C++</em>”.</span></li>
	<li style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Crie um novo projeto em <em>“File-&gt;New-&gt;C Project</em>”.</span></li>
	<li style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Dê um nome ao seu projeto, selecione a opção “<em>Executable-&gt;Cross-Compile Project</em>” e clique em “<em>Next</em>”.</span></li>
	<li style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Agora vem o segredo: precisamos configurar o toolchain. Na opção “<em>Tool command prefix</em>” configure o prefixo das ferramentas do toolchain, e na opção “<em>Tool command path</em>” configure o diretório onde se encontram as ferramentas do toolchain. A minha configuração ficou assim:<br /><br /><a href="http://sergioprado.org/wp-content/uploads/2012/01/cross1.png" target="_blank"><img class="aligncenter" src="http://sergioprado.org/wp-content/uploads/2012/01/cross1.png" alt="cross1 Configurando e usando o Eclipse em Linux embarcado" width="500" height="180" title="Configurando e usando o Eclipse em Linux embarcado" /></a><br /><br /></span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">Clique em “<em>Finish</em>”.</span></li>
</ol>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Crie uma aplicação simples para testar (<em>File-&gt;New-&gt;Source File</em>):</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*
 * hello.c
 *
 *  Created on: Dec 30, 2011
 *      Author: sprado
 */</span>
&nbsp;
<span style="color: #339933;">#include &quot;stdio.h&quot;</span>
&nbsp;
<span style="color: #993333;">int</span> sum<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> a<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> a <span style="color: #339933;">+</span> b<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hello Embedded World! Sum = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> soma<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Agora é só compilar em “<em>Project-&gt;Build Project</em>” e pronto! Para testar, abra novamente a perspectiva Remote System Explorer e arraste o binário gerado da pasta do projeto do Eclipse para o target através da conexão SFTP. Teste abrindo um terminal via SSH. Assim fica fácil, não é verdade? :)</span></p>
<p style="text-align: center;"><a href="http://sergioprado.org/wp-content/uploads/2012/01/cross_2.png" target="_blank"><span style="font-family: verdana,geneva; font-size: small;"><img class="aligncenter" src="http://sergioprado.org/wp-content/uploads/2012/01/cross_2.png" alt="cross 2 Configurando e usando o Eclipse em Linux embarcado" width="550" height="385" title="Configurando e usando o Eclipse em Linux embarcado" /></span></a></p>
<p style="text-align: justify;"><strong><span style="font-family: verdana,geneva; font-size: small;">DEBUGGING REMOTO</span></strong></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Que tal agora debugar remotamente a aplicação rodando no dispositivo?</span></p>
<ol style="text-align: justify;">
	<li><span style="font-family: verdana,geneva; font-size: small;">Acesse “<em>Run-&gt;Debug Configurations</em>”.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">Clique duas vezes em “<em>C/C++ Remote aplications</em>”</span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">No campo “<em>Connection</em>”, selecione o nome da conexão remota que você criou com o Remote System Explorer.</span></li>
	<li><span style="font-family: verdana,geneva; font-size: small;">Configure o caminho completo onde será salva a aplicação no target, incluindo o nome da aplicação, no campo “<em>Remote Absolute File Path</em>”.</span></li>
</ol>
<p style="text-align: center;"><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/wp-content/uploads/2012/01/debug_1.png" target="_blank"><img class="aligncenter size-full wp-image-2282" title="debug_1" src="http://sergioprado.org/wp-content/uploads/2012/01/debug_1.png" alt="debug 1 Configurando e usando o Eclipse em Linux embarcado" width="550" height="391" /></a></span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Por último, configure na aba “<em>Debugger</em>” o nome da ferramenta de debugging do seu toolchain, e salve:</span></p>
<p style="text-align: center;"><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/wp-content/uploads/2012/01/debug_2.png" target="_blank"><img class="aligncenter size-full wp-image-2283" title="debug_2" src="http://sergioprado.org/wp-content/uploads/2012/01/debug_2.png" alt="debug 2 Configurando e usando o Eclipse em Linux embarcado" width="550" height="389" /></a></span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Agora é só clicar no inseto verde!</span></p>
<p style="text-align: center;"><span style="font-family: verdana,geneva; font-size: small;"><a href="http://sergioprado.org/wp-content/uploads/2012/01/debug_3.png" target="_blank"><img class="aligncenter size-full wp-image-2284" title="debug_3" src="http://sergioprado.org/wp-content/uploads/2012/01/debug_3.png" alt="debug 3 Configurando e usando o Eclipse em Linux embarcado" width="550" height="372" /></a></span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Nunca foi tão fácil configurar debugging remoto em Linux embarcado, não é verdade? :)</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">O que mostrei neste artigo foi apenas o básico da configuração do Eclipse para iniciar o desenvolvimento em Linux embarcado. Esta IDE é cheia de plugins e funcionalidades interessantes. Vale a pena dar uma olhada, estudar, testar.</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Para aqueles que se aventurarem, ou já tiveram experiências com o Eclipse (boas ou ruins), deixem seus comentários aqui!</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Um abraço,</span></p>
<p style="text-align: justify;"><span style="font-family: verdana,geneva; font-size: small;">Sergio Prado</span></p>
<div id="-chrome-auto-translate-plugin-dialog" style="opacity: 1 !important; background-image: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: transparent !important; position: absolute !important; top: 0px; left: 0px; overflow-x: visible !important; overflow-y: visible !important; z-index: 999999 !important; text-align: left !important; display: none; background-position: initial initial !important; background-repeat: initial initial !important; padding: 0px !important; margin: 0px !important;">
<div style="max-width: 300px !important; color: #fafafa !important; opacity: 0.8 !important; border-color: #000000 !important; border-width: 0px !important; -webkit-border-radius: 10px !important; background-color: #363636 !important; font-size: 16px !important; padding: 8px !important; overflow: visible !important; background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, #000), color-stop(50%, #363636), color-stop(100%, #000)); z-index: 999999 !important; text-align: left  !important;"></div>
<img style="position: absolute !important; z-index: -1 !important; right: 1px !important; top: -20px !important; cursor: pointer !important; -webkit-border-radius: 20px; background-color: rgba(200, 200, 200, 0.3) !important; padding: 3px 5px 0 !important; margin: 0 !important;" onclick="document.location.href='http://translate.google.com/';" src="http://www.google.com/uds/css/small-logo.png" alt="small logo Configurando e usando o Eclipse em Linux embarcado"  title="Configurando e usando o Eclipse em Linux embarcado" /></div>
<div class="shr-publisher-2238"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Posts relacionados:</p><ol>
<li><a href='http://sergioprado.org/2011/11/30/gerando-e-usando-toolchains-em-linux-embarcado/' rel='bookmark' title='Gerando e usando toolchains em Linux embarcado'>Gerando e usando toolchains em Linux embarcado</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2012/01/04/configurando-usando-eclipse-em-linux-embarcado/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Kit de desenvolvimento LPC3250 da Embedded Artists</title>
		<link>http://sergioprado.org/2011/12/21/kit-de-desenvolvimento-lpc3250-da-embedded-artists/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kit-de-desenvolvimento-lpc3250-da-embedded-artists</link>
		<comments>http://sergioprado.org/2011/12/21/kit-de-desenvolvimento-lpc3250-da-embedded-artists/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 19:16:38 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Linux embarcado]]></category>
		<category><![CDATA[Produtos]]></category>
		<category><![CDATA[embedded artists]]></category>
		<category><![CDATA[lpc3250]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=2169</guid>
		<description><![CDATA[Introdução ao kit de desenvolvimento LPC3250 da Embedded Artists.
Posts relacionados:<ol>
<li><a href='http://sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/' rel='bookmark' title='Kit de desenvolvimento FriendlyARM mini2440'>Kit de desenvolvimento FriendlyARM mini2440</a></li>
<li><a href='http://sergioprado.org/2011/10/16/linux-embarcado-com-o-sam9m10-da-atmel/' rel='bookmark' title='Linux embarcado com o SAM9M10 da Atmel'>Linux embarcado com o SAM9M10 da Atmel</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O kit de desenvolvimento <a href="http://www.embeddedartists.com/products/kits/lpc3250_kit.php" target="_blank">LPC3250 da Embedded Artists</a> vem equipado com o microcontrolador <a href="http://ics.nxp.com/products/lpc3000/lpc32x0/" target="_blank">LPC3250 da NXP</a>, e pode ser uma boa escolha se você quer boa performance, alto nível de integração de periféricos e baixo consumo.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Se sua aplicação precisa de uma capacidade de processamento maior do que a oferecida pelas CPUs ARM Cortex-M3, com necessidades de display gráfico e conectividade, mas não quer uma solução tão high-end como as linhas i.MX da Freescale ou Sitara da TI, talvez o LPC3250 seja o que você procura.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O kit é composto basicamente por uma placa com CPU e memória RAM/Flash (<a href="http://www.embeddedartists.com/products/oem/lpc3250_oem.php" target="_blank">LPC3250 OEM Board</a>) conectada à uma placa-base (QVGA Base Board), com o display e um conjunto de periféricos para acesso.<br />
	</span></span></p>
<p style="text-align: center; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><img alt="ea lpc3250 Kit de desenvolvimento LPC3250 da Embedded Artists" height="420" src="http://www.sergioprado.org/wp-content/uploads/ea-lpc3250.jpg" width="550" title="Kit de desenvolvimento LPC3250 da Embedded Artists" /><br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O microcontrolador LPC3250 é um ARM9 rodando à 266MHz com 256kB de SRAM, interface para flash NAND e barramento para SDRAM, Ethernet MAC e um controlador de display LCD integrados, além de diversas interfaces de comunicação como USB, UART, I2C, SPI, I2S, PWM, ADC, etc.<br />
	</span></span></p>
<p style="text-align: center; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><img alt="lpc3250 block Kit de desenvolvimento LPC3250 da Embedded Artists" height="661" src="http://www.sergioprado.org/wp-content/uploads/lpc3250_block.png" width="550" title="Kit de desenvolvimento LPC3250 da Embedded Artists" /><br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O kit vêm com 128MB de flash NAND, 4MB de flash NOR e 64MB de SDRAM. Pode ser alimentado por USB ou uma fonte externa de 9-15V. Possui interfaces Ethernet, USB host/OTG, cartão SD/MMC, display LCD de 3.2″, JTAG, RS232, IrDA, acelerômetro, E2PROM, botões, leds e conectores para expansão de I/O.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O manual do usuário pode ser baixado <a href="http://embeddedartists.com/sites/default/files/support/oem/lpc3250/LPC3250_OEM_Board_Users_Guide.pdf" target="_blank">aqui</a> e o datasheet <a href="http://embeddedartists.com/sites/default/files/docs/datasheet/LPC3250_OEM_Board_Datasheet.pdf" target="_blank">aqui</a>.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O kit pode ser adquirido no site da Embedded Artists por $340 FOB (no momento em que escrevo este artigo), ou em um de seus <a href="http://www.embeddedartists.com/shop/distributors.php" target="_blank">distribuidores</a> como a <a href="http://www.digikey.com" target="_blank">Digi-Key</a>, a <a href="http://www.futureelectronics.com" target="_blank">Future Electronics</a> e a <a href="http://www.mouser.com/embeddedartists" target="_blank">Mouser</a>. No Brasil, a <a href="http://www.microgenios.com.br" target="_blank">Microgenios</a> é a distribuidora oficial da Embedded Artists.<br />
	</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">LINUX<br />
	</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Com MMU e boa capacidade de memória (Flash e RAM), conectividade e interface com displays gráficos, o kit é uma boa plataforma para se trabalhar com Linux.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A comunidade Linux para os microcontroladores da NXP gira em torno do site <a href="http://www.lpclinux.com" target="_blank">http://www.lpclinux.com</a>, com seções de download, tutoriais, blogs, forums, etc.<br />
	</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">PROCESSO DE BOOT<br />
	</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O microcontrolador LPC3250 possui uma ROM interna de 32K com um código de boot que é executado sempre que você liga o equipamento. Este código de boot procura por um bootloader em 4 diferentes fontes: UART, SPI, NOR e NAND.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Quando você liga o equipamento, este código de boot em ROM verifica a entrada SERVICE (GPI_1) do microcontrolador. Se esta entrada estiver em nível baixo, o codigo de boot inicia um processo de recuperação para baixar um programa pela UART e carregá-lo para a SRAM. Se esta entrada estiver em nível alto, ele irá procurar por um bootloader nas seguintes interfaces, nesta ordem: SPI, NOR e NAND. Se ele encontrar, irá carregar os primeiros 54kB para a SRAM.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Este código carregado para a SRAM é o bootloader de 1o. estágio, chamado de Kickstarter, responsável basicamente por carregar e iniciar um bootloader de 2o. estágio, o S1L. Este bootloader de 2o. estágio é o responsável por inicializar o hardware (GPIO, clock, SDRAM, etc) e carregar o bootloader de 3o. estágio, o U-Boot. Ufa!<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Daí é o processo normal de qualquer sistema Linux embarcado, o U-Boot carrega o kernel e então temos nosso sistema Linux rodando no kit.<br />
	</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">USANDO O KIT<br />
	</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Para usar o kit, basta alimentá-lo com o cabo USB, conforme figura abaixo:<br />
	</span></span></p>
<p style="text-align: center; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><img alt="lpc3250 plugging Kit de desenvolvimento LPC3250 da Embedded Artists" height="359" src="http://www.sergioprado.org/wp-content/uploads/lpc3250_plugging.png" width="550" title="Kit de desenvolvimento LPC3250 da Embedded Artists" /><br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Você só vai precisar de uma fonte externa se for ligar dispositivos de consumo alto no barramento USB.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Como a placa possui o chip FT232 da FTDI, ao mesmo tempo que o cabo USB serve para alimentar o kit, ele será sua conexão serial (console) com o equipamento!<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Configure seu programa de comunicação serial preferido com 115200-8N1, ligue o kit na sua máquina de desenvolvimento pelo cabo USB, e veja o menu do bootloader de 2o. estágio (S1L):<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Embedded Artist 3250 Board (S1L 2.0)
Build date: Nov 23 2010 13:21:19
&nbsp;
EA3250#</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Com este bootloader você é capaz de bootar do cartão SD, da UART ou da NAND Flash. Mas é claro que você vai querer bootar o Linux, não é verdade? Então você vai precisar gravar o U-Boot na flash NAND.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Você pode baixar o u-boot <a href="http://www.sergioprado.org/wp-content/plugins/download-monitor/download.php?id=21" target="_blank">daqui</a>, renomeá-lo para u-boot.bin e salvá-lo em um cartão SD.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Coloque o cartão SD no kit, reinicie-o e na linha de comandos do bootloader S1L, carregue o U-Boot do cartão SD para a RAM:<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">EA3250# load blk u-boot.bin raw 0x83fa0000</pre></div></div>



<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Salve na flash:<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">EA3250# nsave</pre></div></div>



<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">E configure o bootloader S1L para automaticamente carregar o U-Boot no boot do equipamento:<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">EA3250# aboot flash raw 0x83fa0000</pre></div></div>



<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Configure também um delay de 2 segundos no boot do S1L:<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">EA3250# prompt EA3250# 2</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Reinicie e pronto! Você receberá o prompt do U-Boot no terminal:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Embedded Artist 3250 Board (S1L 2.0)
Build date: Nov 23 2010 13:21:19
Autoboot in progress, press any key to stop
&nbsp;
U-Boot 2009.03-rc1 (Sep 28 2009 - 09:38:20)
&nbsp;
DRAM:  64 MB
NAND:  128 MiB
*** Warning - bad CRC or NAND, using default environment
&nbsp;
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0
uboot#</pre></div></div>



<p><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">TREINAMENTO</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Este é o kit que utilizarei nas minhas primeiras seções do <a href="http://www.sergioprado.org/treinamentos/desenvolvendo-sistemas-linux-embarcado/" target="_blank">treinamento de Linux embarcado</a>. Os kits foram gentilmente cedidos pela NXP para a realização do treinamento.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Busquei desenvolver uma metodologia de ensino de forma que as atividades de laboratório fossem independentes de hardware. Nada de receitas de bolo. O que você aprender com este kit, poderá aplicar em qualquer outro hardware com suporte à Linux. Mas espero que possamos nos divertir bastante com este kit, desenvolver alguns projetos legais durante (e depois) do treinamento, e claro, aprender Linux embarcado!<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Para quem já se inscreveu, vejo vocês lá!<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Um abraço!<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Sergio Prado</span></span></p><div class="shr-publisher-2169"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Posts relacionados:</p><ol>
<li><a href='http://sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/' rel='bookmark' title='Kit de desenvolvimento FriendlyARM mini2440'>Kit de desenvolvimento FriendlyARM mini2440</a></li>
<li><a href='http://sergioprado.org/2011/10/16/linux-embarcado-com-o-sam9m10-da-atmel/' rel='bookmark' title='Linux embarcado com o SAM9M10 da Atmel'>Linux embarcado com o SAM9M10 da Atmel</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2011/12/21/kit-de-desenvolvimento-lpc3250-da-embedded-artists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementando um teclado virtual no Linux</title>
		<link>http://sergioprado.org/2011/12/12/implementando-um-teclado-virtual-no-linux/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=implementando-um-teclado-virtual-no-linux</link>
		<comments>http://sergioprado.org/2011/12/12/implementando-um-teclado-virtual-no-linux/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 00:01:34 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Linguagem C]]></category>
		<category><![CDATA[Linux embarcado]]></category>
		<category><![CDATA[device driver]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=2150</guid>
		<description><![CDATA[Neste artigo veremos como desenvolver um modulo do kernel para emular um teclado virtual.
Posts relacionados:<ol>
<li><a href='http://sergioprado.org/2010/12/18/linux-device-drivers-parte-1/' rel='bookmark' title='Linux Device Drivers — Parte 1'>Linux Device Drivers — Parte 1</a></li>
<li><a href='http://sergioprado.org/2011/01/07/linux-device-drivers-parte-2/' rel='bookmark' title='Linux Device Drivers — Parte 2'>Linux Device Drivers — Parte 2</a></li>
<li><a href='http://sergioprado.org/2011/04/25/por-dentro-da-console-em-sistemas-linux/' rel='bookmark' title='Por dentro da console em sistemas Linux'>Por dentro da console em sistemas Linux</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">A idéia de escrever este artigo surgiu da necessidade de um projeto que trabalhei algumas semanas atrás.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O objetivo era implementar um teclado virtual, de forma que um processo ou aplicação pudesse simular o pressionamento de uma tecla, sem que esta tecla tivesse sido realmente pressionada em um teclado físico.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Até aí tudo bem, qualquer biblioteca ou toolkit gráfico decente (X11, DirectFB, Qt, etc) possui algum mecanismo para emular entrada de teclado. Mas o objetivo era ser independente de biblioteca gráfica, e funcionar também em ambiente somente texto. Ou seja, precisavamos de algo implementado dentro do kernel.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Mas não vamos “colocar a carroça na frente dos bois”! Antes de pensar na solução, vamos pensar no problema…<br />
	</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">PURA MÁGICA?<br />
	</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Não, não é mágica. Mas uma tecla pressionada dentro do kernel do Linux passa por algumas camadas até você vê-la ecoando na tela do seu monitor.<br />
	</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">CAMADA 0: HARDWARE<br />
	</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Tudo começa no hardware, claro. A controladora do teclado conectado ao seu PC varre e decodifica a matriz de teclas e cuida de detalhes como o controle de debouncing.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Quando você pressiona uma tecla, essa tecla é transformada em um código chamado de scancode. Cada tecla possui um scancode quando é pressionada e outro quando é liberada (o bit mais significativo é setado). Por exemplo, a letra ‘x’ emite o scancode 0x2d quando é pressionada e 0xad quando é liberada (no meu teclado USB).<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Se você quiser, pode usar a ferramenta “<em>showkey</em>” para fazer o dump e exibir o scancode das teclas pressionadas no seu PC:<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sudo showkey -s
press any key (program terminates 10s after last keypress)...
0x2d 0xad</pre></div></div>



<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Portanto, para cada tecla pressionada, uma interrupção é gerada para a CPU, e os scancodes são enviados via barramento de comunicação, dependendo do hardware do seu teclado (PS2, USB, etc).</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Logo após, a rotina de tratamento de interrupção do teclado é acionada, sendo responsável por receber e tratar estes scancodes, conforme veremos a seguir.<br />
	</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">CAMADA 1: DEVICE DRIVER<br />
	</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Aqui já estamos no kernel do Linux. Um device driver vai conversar com o hardware do seu teclado, receber e tratar os scancodes.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">E dependendo do hardware que você esta usando (teclado USB, PS2, etc), um diferente device driver será o responsável por ler estes scancodes. Por exemplo, a implementação do teclado PS2 padrão encontra-se nos fontes do kernel em <a href="http://lxr.free-electrons.com/source/drivers/input/keyboard/atkbd.c?v=3.0" target="_blank"><em>drivers/input/keyboard/atkbd.c</em></a>. Vai lá dar uma olhada, eu espero!<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Após ler os scancodes, o device driver irá convertê-los em um outro código chamado keycodes. Cuidado para não confundir! Scancode é um código dependente do hardware do teclado e tratado pelo device driver. Keycode é um código que representa uma tecla dentro de um sistema Linux.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Você já viu que cada tecla pressionada gera dois scancodes (pressionada e liberada). Mas ela possui um único keycode. Por exemplo, no meu PC, quando pressiono a tecla ‘x’, é gerado o keycode 45:<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sudo showkey -k
press any key (program terminates 10s after last keypress)...
keycode  45 press
keycode  45 release</pre></div></div>



<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Mas como então o kernel diferencia teclas pressionadas e liberadas se o keycode é o mesmo? Fácil. O device driver gera dois eventos para o kernel. Um para teclas pressionadas e outro para teclas liberadas. E estes eventos são enviados para camada input do kernel.<br />
	</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">CAMADA 2: INPUT SUBSYSTEM<br />
	</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">É nesta camada que percebemos toda a capacidade de modularização do kernel do Linux. <br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A camada input foi criada para abstrair a captura de eventos de dispositivos de entrada como mouse, teclado, joysticks, touch screens, etc. Enquanto que cada um destes dispositivos possui seu respectivo device driver, cada device driver exporta os eventos para a camada input. Por sua vez, a camada input trata e exporta estes eventos em um formato padrão para arquivos de dispositivo em /dev/input/:<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ls /dev/input
event0  event1  event2  event3  event4  event5  mice  mouse0</pre></div></div>



<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Cada um destes arquivos de dispositivo representam um dispositivo de entrada.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Você pode usar a ferramenta “evtest” para verificar qual o dispositivo relacionado à determinado arquivo:<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sudo evtest /dev/input/event4
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x1c4f product 0x2 version 0x110
Input device name: &quot;USB USB Keykoard&quot;
...</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Veja que, na minha máquina, /dev/input/event4 é o arquivo de dispositivo que gera os eventos do teclado USB.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A ferramenta “evtest” também é capaz de monitorar os eventos de dispositivos de entrada. Execute novamente o comando acima, pressione uma tecla e veja os eventos que foram exportados para userspace através deste arquivo de dispositivo:<br />
	</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">...
Event: time 1323720735.849223, type 1 (Key), code 45 (X), value 1
Event: time 1323720735.849225, -------------- Report Sync ------------
Event: time 1323720735.905222, type 1 (Key), code 45 (X), value 0
Event: time 1323720776.880210, -------------- Report Sync ------------
...</pre></div></div>



<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Perceba o keycode 45 para a tecla ‘x’ e os valores 1 para tecla pressionada e 0 para tecla liberada.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Por fim, as bibliotecas gráficas monitoram os eventos nestes arquivos de dispositivos e exportam estes eventos para as aplicações. E assim você vê uma tecla ecoando em seu terminal!<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Linux é ou não é um dos SOMLTT — sistemas operacionais mais legais de todos os tempos? :-)<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Apenas um detalhe aqui: no caso do teclado, além de exportar os eventos para “/dev/input/”, a camada input também exporta os eventos de teclas pressionadas para a camada TTY ativa no momento. Desta forma, se você estiver em um terminal conectado à /dev/tty2, por exemplo, irá receber este evento. Se quiser saber mais sobre a camada TTY, leia o artigo “<a href="http://www.sergioprado.org/2011/04/25/por-dentro-da-console-em-sistemas-linux/" target="_blank">Por dentro da console em sistemas Linux</a>”.<br />
	</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">VOLTANDO AO NOSSO PROBLEMA…<br />
	</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Depois de todas estas explicações, espero que você não tenha se esquecido do nosso problema original: emular um teclado virtual independente de biblioteca gráfica, e que funcione em modo texto.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Agora ficou mais fácil pensar numa solução, não é verdade? </span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Reveja as camadas. A camada 0 é hardware, e não temos hardware no nosso caso. A camada 2 é genérica, e não é uma boa prática mexer nela. Potanto, é na camada 1 que trabalharemos.<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Vamos desenvolver um device driver (no nosso caso, um módulo do kernel, já que não falaremos com nenhum hardware) que irá gerar eventos de teclado para a camada input. Simples assim!<br />
	</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A SOLUÇÃO<br />
	</span></span></strong></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para não complicar muito, vamos escrever um modulo simples que irá emular a digitação de uma frase a cada 10 segundos. Assim que carregado, uma frase será “digitada” pelo módulo a cada 10 segundos. E para deixar o trabalho mais divertido, a frase será “segmentation fault”!</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Sem mais enrolação, este é o código completo do nosso módulo do kernel:<br />
	</span></span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;linux/fs.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/cdev.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/module.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/kernel.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/delay.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/kthread.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/device.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/slab.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/tty.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/tty_flip.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/kbd_kern.h&quot;</span>
<span style="color: #339933;">#include &quot;linux/input.h&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* vtkbd kernel thread struct */</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> task_struct <span style="color: #339933;">*</span>vtkbd_thread_task<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* vtkbd input device structure */</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">struct</span> input_dev <span style="color: #339933;">*</span>vtkbd_input_dev<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">const</span> <span style="color: #993333;">char</span> str_keys<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> KEY_S<span style="color: #339933;">,</span> KEY_E<span style="color: #339933;">,</span> KEY_G<span style="color: #339933;">,</span> KEY_M<span style="color: #339933;">,</span> KEY_E<span style="color: #339933;">,</span> KEY_N<span style="color: #339933;">,</span>
                          KEY_T<span style="color: #339933;">,</span> KEY_A<span style="color: #339933;">,</span> KEY_T<span style="color: #339933;">,</span> KEY_I<span style="color: #339933;">,</span> KEY_O<span style="color: #339933;">,</span> KEY_N<span style="color: #339933;">,</span>
                          KEY_SPACE<span style="color: #339933;">,</span> KEY_F<span style="color: #339933;">,</span> KEY_A<span style="color: #339933;">,</span> KEY_U<span style="color: #339933;">,</span> KEY_L<span style="color: #339933;">,</span>
                          KEY_T<span style="color: #339933;">,</span> KEY_ENTER <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* kernel thread */</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> vtkbd_thread<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>unused<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>kthread_should_stop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>str_keys<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            input_report_key<span style="color: #009900;">&#40;</span>vtkbd_input_dev<span style="color: #339933;">,</span> str_keys<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            input_report_key<span style="color: #009900;">&#40;</span>vtkbd_input_dev<span style="color: #339933;">,</span> str_keys<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            input_sync<span style="color: #009900;">&#40;</span>vtkbd_input_dev<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">/* wait 10 seconds */</span>
        msleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">10000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* driver initialization */</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> __init vtkbd_init<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">static</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>name <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;Virtual Keyboard&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* allocate input device */</span>
    vtkbd_input_dev <span style="color: #339933;">=</span> input_allocate_device<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>vtkbd_input_dev<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        printk<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;vtkbd_init: Error on input_allocate_device!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span>ENOMEM<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* set input device name */</span>
    vtkbd_input_dev<span style="color: #339933;">-&gt;</span>name <span style="color: #339933;">=</span> name<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* enable key events */</span>
    set_bit<span style="color: #009900;">&#40;</span>EV_KEY<span style="color: #339933;">,</span> vtkbd_input_dev<span style="color: #339933;">-&gt;</span>evbit<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">256</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        set_bit<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> vtkbd_input_dev<span style="color: #339933;">-&gt;</span>keybit<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* register input device */</span>
    input_register_device<span style="color: #009900;">&#40;</span>vtkbd_input_dev<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* start thread */</span>
    vtkbd_thread_task <span style="color: #339933;">=</span> kthread_run<span style="color: #009900;">&#40;</span>vtkbd_thread<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;vtkbd_thread&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    printk<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Virtual Keyboard driver initialized.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* driver exit */</span>
<span style="color: #993333;">void</span> __exit vtkbd_exit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #808080; font-style: italic;">/* stop thread */</span>
    kthread_stop<span style="color: #009900;">&#40;</span>vtkbd_thread_task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* unregister input device */</span>
    input_unregister_device<span style="color: #009900;">&#40;</span>vtkbd_input_dev<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    printk<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Virtual Keyboard driver.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
module_init<span style="color: #009900;">&#40;</span>vtkbd_init<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
module_exit<span style="color: #009900;">&#40;</span>vtkbd_exit<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
MODULE_LICENSE<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;GPL&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
MODULE_AUTHOR<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Sergio Prado sergio.prado@embeddedlabworks.com&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
MODULE_DESCRIPTION<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Virtual Keyboard driver&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O módulo tem basicamente 3 funções: <em>vtkbd_init()</em> para inicializar o módulo, <em>vtkbd_exit()</em> para fazer a limpeza ao descarregar o módulo e <em>vtkbd_thread()</em> que faz a mágica de digitar a frase periodicamente.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Na função de inicialização, o primeiro passo é alocar um dispositivo de input com a função <em>input_allocate_device()</em> na linha 54. Essa função vai devolver uma estrutura que vai nos possibilitar conversar com a camada input e gerar os eventos de teclado. Nas linhas 64 a 66 habilitamos a geração de eventos em todas as teclas (veja o loop) e na linha 69 registramos o dispositivo de input com a função <em>input_register_device()</em>. Por último, criamos e iniciamos a thread do kernel que irá fazer o “trabalho sujo”. Se você quiser ler mais sobre Kernel Threads, leia o artigo “<a href="http://www.sergioprado.org/2011/04/18/linux-device-drivers-trabalhando-com-kernel-threads/" target="_blank">Linux Device Drivers — Trabalhando com Kernel Threads</a>”</span></span></p>
<p style="text-align: justify; "><font class="Apple-style-span" face="verdana, geneva, sans-serif"><span class="Apple-style-span" style="font-size: 14px;">Na função de limpeza, paramos a thread e removemos o dispositivo de input que registramos na inicialização.</span></font></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A thread <em>vtkbd_thread()</em> é bem simples e faz toda a mágica. Ela é basicamente um loop infinito que, a cada 10 segundos, gera os eventos para emular a digitação. O vetor <em>str_keys[]</em> contém os keycodes para a frase “<em>segmentation fault</em>”. Esses keycodes estão definidos em <a href="http://lxr.free-electrons.com/source/include/linux/input.h?v=3.0" target="_blank">include/linux/input.h</a>. Para cada keycode, geramos dois eventos com a função <em>input_report_key()</em>, simulando a tecla pressionada na linha 34 e a tecla liberada na linha 35 (veja os parâmetros 1 e 0, respectivamente). Por último, executamos a função <em>input_sync()</em>, notificando a camada input da existência de novos eventos a serem tratados.</span></span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Simples, não?</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para compilar, crie um Makefile com o conteúdo abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">KVER := $(shell uname -r)
KDIR := /usr/src/linux-headers-$(KVER)
PWD  := $(shell pwd)
&nbsp;
obj-m += vtkbd.o
&nbsp;
default:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
&nbsp;
clean:
        @rm -Rf *.o *.ko *.mod.c modules.order Module.symvers Module.markers</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">E compile:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ make</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para carregar o módulo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sudo insmod vtkbd.ko</pre></div></div>



<p style="text-align: justify; "><font class="Apple-style-span" face="verdana, geneva, sans-serif"><span class="Apple-style-span" style="font-size: 14px;">E para remover o módulo:</span></font></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sudo rmmod vtkbd</pre></div></div>



<p style="text-align: justify; "><font class="Apple-style-span" face="verdana, geneva, sans-serif"><span class="Apple-style-span" style="font-size: 14px;">Como o módulo ficará digitando “segmentation fault” a cada 10 segundos, este é o tempo que você terá para digitar o comando de remoção do módulo antes dele bagunçar seu shell!</span></font></p>
<p style="text-align: justify; "><font class="Apple-style-span" face="verdana, geneva, sans-serif"><span class="Apple-style-span" style="font-size: 14px;">E lembre-se de que você esta trabalhando em kernel space, com acesso total e irrestrito à memória e I/Os. Portanto, o ideal aqui é trabalhar em uma máquina virtual. É mais seguro e pode evitar muitos acidentes, principalmente para aqueles que estão começando os estudos do Kernel do Linux.</span></font></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">PEGADINHA DO MALANDRO</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Agora pegue este módulo, e quando seu amigo deixar a seção aberta para tomar um café, instale e cronometre o tempo que ele vai levar para encontrar a causa do “segmentation fault”! Isso se ele encontrar… :)<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Um abraço,<br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Sergio Prado</span></span></p><div class="shr-publisher-2150"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Posts relacionados:</p><ol>
<li><a href='http://sergioprado.org/2010/12/18/linux-device-drivers-parte-1/' rel='bookmark' title='Linux Device Drivers — Parte 1'>Linux Device Drivers — Parte 1</a></li>
<li><a href='http://sergioprado.org/2011/01/07/linux-device-drivers-parte-2/' rel='bookmark' title='Linux Device Drivers — Parte 2'>Linux Device Drivers — Parte 2</a></li>
<li><a href='http://sergioprado.org/2011/04/25/por-dentro-da-console-em-sistemas-linux/' rel='bookmark' title='Por dentro da console em sistemas Linux'>Por dentro da console em sistemas Linux</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2011/12/12/implementando-um-teclado-virtual-no-linux/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Primeira turma do treinamento de Linux embarcado</title>
		<link>http://sergioprado.org/2011/12/07/primeira-turma-do-treinamento-de-linux-embarcado/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=primeira-turma-do-treinamento-de-linux-embarcado</link>
		<comments>http://sergioprado.org/2011/12/07/primeira-turma-do-treinamento-de-linux-embarcado/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 18:14:10 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Linux embarcado]]></category>
		<category><![CDATA[treinamento]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=2129</guid>
		<description><![CDATA[Estão abertas as inscrições para a primeira turma do treinamento "Desenvolvendo Sistemas Linux Embarcado", que será realizado a partir do dia 28 de janeiro de 2012.
Sem posts relacionados.]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic -->
<p style="text-align: justify;"><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Vocês pediram, e depois de bastante trabalho e esforço, estou abrindo a primeira turma do treinamento “Desenvolvendo Sistemas Linux Embarcado”, que será realizado em 3 sábados consecutivos a partir do dia 28 de janeiro de 2012.</span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">A idéia do treinamento é capacitá-los a desenvolver e customizar uma distribuição Linux embarcada completa, de forma que possam chegar em casa e ter os conhecimentos necessários para embarcar Linux em qualquer hardware.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Para quem ainda não teve a oportunidade de ler, o conteúdo do treinamento inclui:</span></span></p>
<ul>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Enten­der, con­fig­u­rar e gerar seu próprio tool­chain para cross-compilação.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Con­fig­u­rar e com­pi­lar o Boot­loader para o kit de desenvolvimento.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Estu­dar, con­fig­u­rar e com­pi­lar um ker­nel Linux cus­tomizado para o kit de desenvolvimento.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Com­pi­lar e tes­tar módu­los do kernel.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Criar um rootfs do zero usando ape­nas pacotes de soft­ware aberto e livre.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Desen­volver usando um servi­dor NFS.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Gravar ima­gens na memória flash e no cartão SD do kit de desenvolvimento.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Enten­der e usar os difer­entes tipos de sis­tema de arquivo para memória flash e dis­pos­i­tivos de bloco.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Usar o Buil­d­root como sis­tema de build para autom­a­ti­zar a ger­ação de um sis­tema Linux completo.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Enten­der licenças de soft­ware e apren­der a aplicar patches.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Desen­volver e cross-compilar apli­cações para Linux embarcado.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Desen­volver apli­cações bási­cas com Qt em Linux embarcado.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Debugar apli­cações com GDB, strace e ltrace.</span></li>
	<li><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Desen­volver um pro­jeto com­pleto de Linux embar­cado (qual­quer pro­jeto, use sua imaginação!).</span></li>
</ul>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">O investimento será de R$700,00 por participante. Fiz bastante esforço para chegar neste valor, que acredito ser razoável e acessível.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Consegui uma boa parceria com a NXP, que gentilmente doou os kits de desenvolvimento para a realização do treinamento. Utilizaremos neste treinamento o kit de desen­volvi­mento <a href="http://www.embeddedartists.com/products/kits/lpc3250_kit.php" target="_blank">LPC3250 Developer’s Kit</a> da Embed­ded Artists.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Também consegui um ótimo local para a realização do treinamento. Será em São Paulo, na Ka Solution, unidade Centro, próximo ao metrô São Bento. Salas limpas, máquinas de última geração, ar-condicionado, café, suco e refrigerantes à vontade, e dois coffee-breaks por dia!</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Decidi trabalhar com uma turma de 10 pessoas ao invés de 12. Acredito que será mais produtivo. </span></span><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px;">Portanto, se você tem interesse, não perca tempo! :)</span></p>
<p style="text-align: justify;"><del><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Para maiores informações sobre o treinamento e os procedimentos para realizar a inscrição, <a href="http://www.sergioprado.org/treinamentos/desenvolvendo-sistemas-linux-embarcado/" target="_blank">clique aqui</a>.</span></span></del></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;"><strong>Atualização:</strong> As inscrições para a primeira turma estão encerradas. Para informações sobre o treinamento e as próximas turmas, <a href="http://sergioprado.org/treinamentos/desenvolvendo-sistemas-linux-embarcado/" target="_blank">clique aqui</a>.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Um abraço,</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Sergio Prado</span></span></p>
<div class="shr-publisher-2129"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Sem posts relacionados.</p>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2011/12/07/primeira-turma-do-treinamento-de-linux-embarcado/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Gerando e usando toolchains em Linux embarcado</title>
		<link>http://sergioprado.org/2011/11/30/gerando-e-usando-toolchains-em-linux-embarcado/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gerando-e-usando-toolchains-em-linux-embarcado</link>
		<comments>http://sergioprado.org/2011/11/30/gerando-e-usando-toolchains-em-linux-embarcado/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 00:48:36 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[Linux embarcado]]></category>
		<category><![CDATA[cross compiling]]></category>
		<category><![CDATA[toolchain]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=2082</guid>
		<description><![CDATA[Neste artigo iremos estudar a geração e a utilização de toolchains em Linux embarcado.
Posts relacionados:<ol>
<li><a href='http://sergioprado.org/2011/11/02/desmistificando-toolchains-em-linux-embarcado/' rel='bookmark' title='Desmistificando toolchains em Linux embarcado'>Desmistificando toolchains em Linux embarcado</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">No <a href="http://www.sergioprado.org/2011/11/02/desmistificando-toolchains-em-linux-embarcado/" target="_blank">último artigo</a> vimos os principais conceitos de toolchain em Linux embarcado: o que é um toolchain, os tipos de toolchain e seus componentes básicos.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Neste artigo iremos aprender a gerar e utilizar um toolchain para cross-compilar aplicações e projetos open-source para Linux embarcado.</span></p>
<p style="text-align: justify; "><strong><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">ONDE POSSO ENCONTRAR UM TOOLCHAIN?</span></strong></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Você tem duas opções: usar um toolchain pronto ou gerar (compilar) seu próprio toolchain. Cada uma destas opções tem suas vantagens e desvantagens.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Usar um toolchain pronto é fácil. Normalmente vem junto com o BSP (Board Support Package) da sua plataforma de desenvolvimento. Existem também versões gratuitas disponibilizadas por empresas como a <a href="http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition" target="_blank">Code Sourcery</a> (que foi adquirida pela Mentor Graphics). Mas usar um toolchain pronto engessa sua solução. Como o toolchain depende das bibliotecas do sistema, você vai precisar adaptar seu produto às bibliotecas de sistema usadas no toolchain. Se o toolchain não tem um compilador C++, você não conseguirá desenvolver aplicações nesta linguagem. Conclusão: em vez da ferramenta se adaptar às suas necessidades, você é que vai precisar se adaptar à ferramenta. O que na maioria das vezes não é muito bom, certo?</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">A segunda opção, gerar um toolchain, pode dar um pouco mais de trabalho, mas te traz toda a flexibilidade necessária para adaptar a ferramenta às necessidades do seu projeto. É o que faremos a seguir.</span></p>
<p style="text-align: justify; "><strong><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">GERANDO SEU PRÓPRIO TOOLCHAIN</span></strong></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O processo de geração de um toolchain, como você deve imaginar, é bem complicado. Mas existem ferramentas que automatizam este processo. </span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Boa parte das ferramentas de Build System, como o <a href="http://www.openembedded.org/" target="_blank">OpenEmbedded</a> e o <a href="http://buildroot.uclibc.org/" target="_blank">Buildroot</a>, fazem isso. Mas existem algumas ferramentas específicas para gerar toolchains. Dentre elas, a mais famosa é o <a href="http://crosstool-ng.org/" target="_blank">crosstool-ng</a>, que usaremos para gerar um toolchain para cross-compilar aplicações Linux para ARM.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O crosstool-ng pode ser baixado da página do projeto em <a href="http://crosstool-ng.org/" target="_blank">http://crosstool-ng.org/</a>. Crie uma pasta de trabalho na sua máquina, baixe e descompacte o crosstool-ng:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cd /opt/toolchain
$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.13.1.tar.bz2
$ tar jxfv crosstool-ng-1.13.1.tar.bz2
$ cd crosstool-ng-1.13.1/</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Primeiramente, precisamos configurar e compilar o crosstool-ng:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ./configure --local
$ make &amp;&amp; make install</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O processo acima deve ter gerado o script “<em>ct-ng</em>”, que será usado para configurar o toolchain.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O crosstool-ng vem com algumas configurações de toolchain por padrão, que podem ser visualizadas com o comando abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ./ct-ng list-samples
Sample name                           Status
alphaev56-unknown-linux-gnu           [L X]
alphaev67-unknown-linux-gnu           [L X]
arm-bare_newlib_cortex_m3_nommu-eabi  [L X]
arm-cortex_a15-linux-gnueabi          [L X]
arm-cortex_a8-linux-gnueabi           [L  ]
arm-davinci-linux-gnueabi             [L  ]
armeb-unknown-eabi                    [L  ]
armeb-unknown-linux-gnueabi           [L X]
armeb-unknown-linux-uclibcgnueabi     [L X]
arm-iphone-linux-gnueabi              [L X]
...</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">A listagem acima esta exibindo apenas uma parte das configurações disponíveis por padrão no crosstool-ng. Ele é capaz de gerar toolchains para ARM, MIPS, PPC, x86 e AVR, dentre outras arquiteturas e plataformas.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Você pode se aventurar a criar uma configuração do zero, mas o mais comum é usar uma das configurações pré-definidas, e então trabalhar em cima dela. No nosso caso, usaremos o “<em>arm-unknown-linux-uclibcgnueabi</em>” e faremos algumas pequenas modificações.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Portanto, carregue esta configuração com o comando abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ./ct-ng arm-unknown-linux-uclibcgnueabi</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Vamos agora abrir o menu de configuração do crosstool-ng e fazer alguns ajustes:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ./ct-ng menuconfig</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Entre na opção “<em>Paths and misc options</em>” e configure a quantidade de threads de execução. Essa configuração ajuda a diminuir o tempo de compilação e geração do toolchain. Multiplique a quantidade de núcleos da sua CPU por dois:</span></p>
<p style="text-align: justify; "><em><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">(2) Number of parallel jobs</span></em></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Ainda neste menu, configure o diretório de instalação do toolchain na opção “<em>Prefix directory</em>”:</span></p>
<p style="text-align: justify; "><em><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">(/opt/toolchain/x-tools/${CT_TARGET}) Prefix directory</span></em></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Volte à tela principal e entre na opção “<em>Toolchain options</em>” para configurar o “<em>alias</em>”: </span></p>
<p><em><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">(arm-linux) Tuple’s alias</span></em></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Configurando “<em>arm-linux</em>” como alias, todas as ferramentas começarão com o prefixo “<em>arm-linux</em>”. Por exemplo, o gcc do toolchain terá o nome “<em>arm-linux-gcc</em>”.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Salve e saia. Agora é só iniciar a geração do toolchain com o comando abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ./ct-ng build</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Obs: No momento em que escrevo este artigo, o site do kernel do Linux não esta 100% no ar (os caras tiveram alguns problemas de segurança que tiraram o site do ar durante um bom tempo). Por este motivo, o crosstool-ng deu um erro ao tentar baixar o kernel do Linux (arquivo linux-2.6.33.19.tar.gz). Neste caso, vá para a <a href="http://git.kernel.org/" target="_blank">página do github do kernel</a>, baixe a versão requisitada pelo crosstool-ng, e salve-a no diretório “<em>.build/tarballs/</em>”.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O processo de compilação pode demorar um pouco. No final, verifique o toolchain gerado no diretório abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ls /opt/toolchain/x-tools/arm-unknown-linux-uclibcgnueabi/bin
arm-linux-addr2line     arm-linux-g++        arm-linux-ldd       arm-linux-size                             arm-unknown-linux-uclibcgnueabi-c++filt       arm-unknown-linux-uclibcgnueabi-gdb       arm-unknown-linux-uclibcgnueabi-ranlib
arm-linux-ar            arm-linux-gcc        arm-linux-nm        arm-linux-strings                          arm-unknown-linux-uclibcgnueabi-cpp           arm-unknown-linux-uclibcgnueabi-gprof     arm-unknown-linux-uclibcgnueabi-readelf
arm-linux-as            arm-linux-gcc-4.4.3  arm-linux-objcopy   arm-linux-strip                            arm-unknown-linux-uclibcgnueabi-ct-ng.config  arm-unknown-linux-uclibcgnueabi-ld        arm-unknown-linux-uclibcgnueabi-run
arm-linux-c++           arm-linux-gccbug     arm-linux-objdump   arm-unknown-linux-uclibcgnueabi-addr2line  arm-unknown-linux-uclibcgnueabi-g++           arm-unknown-linux-uclibcgnueabi-ldd       arm-unknown-linux-uclibcgnueabi-size
arm-linux-cc            arm-linux-gcov       arm-linux-populate  arm-unknown-linux-uclibcgnueabi-ar         arm-unknown-linux-uclibcgnueabi-gcc           arm-unknown-linux-uclibcgnueabi-nm        arm-unknown-linux-uclibcgnueabi-strings
arm-linux-c++filt       arm-linux-gdb        arm-linux-ranlib    arm-unknown-linux-uclibcgnueabi-as         arm-unknown-linux-uclibcgnueabi-gcc-4.4.3     arm-unknown-linux-uclibcgnueabi-objcopy   arm-unknown-linux-uclibcgnueabi-strip
arm-linux-cpp           arm-linux-gprof      arm-linux-readelf   arm-unknown-linux-uclibcgnueabi-c++        arm-unknown-linux-uclibcgnueabi-gccbug        arm-unknown-linux-uclibcgnueabi-objdump
arm-linux-ct-ng.config  arm-linux-ld         arm-linux-run       arm-unknown-linux-uclibcgnueabi-cc         arm-unknown-linux-uclibcgnueabi-gcov          arm-unknown-linux-uclibcgnueabi-populate</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Sempre que você for usar o toolchain, vai precisar configurar a variável de ambiente PATH:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ export PATH=/opt/toolchain/x-tools/arm-unknown-linux-uclibcgnueabi/bin:$PATH</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Agora teste o toolchain gerado:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ arm-linux-gcc
arm-linux-gcc: no input files</pre></div></div>



<p style="text-align: justify; "><strong><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">USANDO O TOOLCHAIN</span></strong></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Usar o toolchain para cross-compilar uma aplicação é muito fácil. Crie um programa simples em C:</span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// main.c</span>
<span style="color: #339933;">#include &quot;stdio.h&quot;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hello Embedded Universe!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Se você quisesse compilar nativamente sua aplicação, bastaria usar o gcc conforme abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ gcc main.c -o main</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para confirmar que a aplicação foi compilada nativamente, use o comando “<em>file</em>”:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para cross-compilar, basta trocar o gcc pelo compilador do toolchain, que no nosso caso é o <em>arm-linux-gcc</em>:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ arm-linux-gcc main.c -o main</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Obs: Lembre-se de que a variável <em>PATH</em> deve estar configurada corretamente para o bash encontrar as ferramentas do toolchain.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Use o comando “<em>file</em>” para confirmar que a aplicação foi compilada para ARM:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ file main
main: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Fácil, não?</span></p>
<p style="text-align: justify; "><strong><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">CROSS-COMPILANDO APLICAÇÕES MAIS COMPLEXAS</span></strong></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Mas Sergio, compilar um arquivo “<em>.c</em>” é fácil. E no caso de um projeto mais complexo, com diversos arquivos-fonte?</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Um projeto deste porte é normalmente baseado em um ou mais Makefiles, ou em um conjunto de ferramentas chamadas de autotools.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para um projeto baseado em Makefile, você pode abrir o arquivo de Makefile, encontrar a definição das variáveis que definem as ferramentas de compilação (AR, AS, LD, CC, GCC, CPP, CXX, STRIP) e substituir pelas do seu toolchain. Não se esqueça de que a variável <em>PATH</em> também deve estar configurada corretamente.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para um projeto baseado em autotools, o procedimento comum para compilar nativamente a aplicação é este:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ./configure
$ make
$ make install</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Mas para cross-compilar um projeto baseado em autotools, alguns cuidados adicionais devem ser tomados, como configurar o compilador através da variável de ambiente <em>CC</em>, e indicar o “<em>host</em>” ao executar a ferramenta “<em>configure</em>”.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para estudar este processo, vamos cross-compilar o <a href="http://www.lighttpd.net/" target="_blank">lighttpd</a>, um web server bastante usado em Linux embarcado, e cujo projeto é baseado em autotools.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Baixe e descompacte o pacote:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cd /opt/toolchain/
$ wget http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.29.tar.gz
$ tar zxfv lighttpd-1.4.29.tar.gz
$ cd lighttpd-1.4.29/</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para cross-compilar usando o toolchain que geramos, basta executar os comandos abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ export PATH=/opt/toolchain/x-tools/arm-unknown-linux-uclibcgnueabi/bin:$PATH
$ export CC=arm-linux-gcc
$ ./configure --host=arm-linux --without-pcre --without-zlib --without-bzip2 --disable-ipv6
$ make</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Na primeira linha configuramos a variável de ambiente <em>PATH</em>. Na segunda linha configuramos o compilador do toolchain através da variável de ambiente <em>CC</em>. Na terceira linha configuramos o software indicando qual é o host (máquina que irá executar a aplicação), e desabilitando algumas bibliotecas que não temos disponíveis. Por último, executamos o <em>make</em> para compilar a aplicação.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Confirme se o <em>lighttpd</em> foi compilado para ARM:</span></p>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ file ./src/lighttpd
./src/lighttpd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Percebam que a geração e o uso de toolchains não envolve nenhum tipo de “magia negra”. Quanto menos uma ferramenta for uma “caixa preta” para você, melhor. Você será mais produtivo, e resolverá eventuais problemas muito mais rapidamente.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Um abraço,</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Sergio Prado</span></p><div class="shr-publisher-2082"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Posts relacionados:</p><ol>
<li><a href='http://sergioprado.org/2011/11/02/desmistificando-toolchains-em-linux-embarcado/' rel='bookmark' title='Desmistificando toolchains em Linux embarcado'>Desmistificando toolchains em Linux embarcado</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/2011/11/30/gerando-e-usando-toolchains-em-linux-embarcado/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 4.075 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-06 08:53:16 -->

