<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2portuguesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Blog do Sergio Prado</title>
	
	<link>http://www.sergioprado.org</link>
	<description>Sistemas embarcados e tecnologia em geral</description>
	<lastBuildDate>Wed, 01 Sep 2010 23:35:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/blog_do_sergio_prado" /><feedburner:info uri="blog_do_sergio_prado" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>blog_do_sergio_prado</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/blog_do_sergio_prado" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fblog_do_sergio_prado" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>Resenha: Embedded Software The Works</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/4nFWzhlTYKU/</link>
		<comments>http://www.sergioprado.org/2010/09/01/resenha-embedded-software-the-works/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 11:00:05 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Resenhas]]></category>
		<category><![CDATA[Colin Walls]]></category>
		<category><![CDATA[Embedded Systems]]></category>
		<category><![CDATA[livro]]></category>
		<category><![CDATA[Mentor Graphics]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=850</guid>
		<description><![CDATA[Resenha do livro "Embedded Software The Works" de Colin Walls.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Terminei recentemente a leitura do Livro “<a href="http://www.amazon.com/Embedded-Software-Works-Colin-Walls/dp/0750679549" target="_blank">Embedded Software The Works</a>”, escrito por Colin Walls, experiente engenheiro e um dos pioneiros da indústria de sistemas embarcados, que trabalha atualmente na <a href="http://www.mentor.com/" target="_blank">Mentor Graphics</a>. O livro é uma coletânea de vários artigos, separados por temas de interesse em 9 capítulos. <br />
	</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A linguagem utilizada é simples, e apesar de manter certa ordem de apresentação do conteúdo, você não precisa ler na ordem apresentada. Alguns artigos, que foram escritos na década de 90, estão um pouco defasados, mas no geral é um livro que vale a pena pelo menos dar uma olhada em alguns capítulos, que são bem interessantes.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O capítulo 1 apresenta uma introdução à sistemas embarcados e sua evolução durante os últimos 30 anos, falando sobre memória, arquitetura de CPUs e seu processo de seleção, além de dois artigos bem interessantes sobre a interface USB. O capítulo 2 é sobre design de sistemas embarcados, abrangendo tópicos como UML e Eclipse. </span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Os capítulos 3, 4 e 5 são inteiramente voltados ao desenvolvimento de software embarcado em C e C++, com algumas dicas valiosas principalmente para quem está começando na área. Os capítulos 6 e 7 também são bem interessantes, discutindo tópicos relacionados à sistemas de tempo real. Os dois últimos capítulos falam sobre protocolos de rede e FPGAs.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O site do livro é <a href="http://embeddedsoftwareworks.com/" target="_blank">este aqui</a>, e quem se interessar pode dar uma folheada no <a href="http://books.google.com.br/books?id=FLvsis4_QhEC&amp;dq=embedded+software+the+works&amp;printsec=frontcover&amp;source=bn&amp;hl=pt-BR&amp;ei=PoN9TOOHK8KC8gbOvJD1Bg&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4&amp;ved=0CCsQ6AEwAw#v=onepage&amp;q&amp;f=false" target="_blank">Google Books</a>. Vale a pena também acompanhar o <a href="http://blogs.mentor.com/colinwalls/" target="_blank">The Colin Walls Blog</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>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/05/27/misra-c-padrao-para-software-em-c/' rel='bookmark' title='Permanent Link: Misra-C — Padrão para software em C'>Misra-C — Padrão para software em C</a></li>
<li><a href='http://www.sergioprado.org/2010/02/24/como-se-tornar-um-desenvolvedor-de-software-embarcado/' rel='bookmark' title='Permanent Link: Como se tornar um desenvolvedor de software embarcado'>Como se tornar um desenvolvedor de software embarcado</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=4nFWzhlTYKU:DOj1RvR7edk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=4nFWzhlTYKU:DOj1RvR7edk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=4nFWzhlTYKU:DOj1RvR7edk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=4nFWzhlTYKU:DOj1RvR7edk:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/4nFWzhlTYKU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/09/01/resenha-embedded-software-the-works/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/09/01/resenha-embedded-software-the-works/</feedburner:origLink></item>
		<item>
		<title>Mini2440 — Linux com U-Boot e Emdebian</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/6uByWM74GuU/</link>
		<comments>http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 11:00:07 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[emdebian]]></category>
		<category><![CDATA[mini2440]]></category>
		<category><![CDATA[u-boot]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=852</guid>
		<description><![CDATA[Neste post vamos carregar o U-Boot e o Emdebian no kit FriendlyARM mini2440.]]></description>
			<content:encoded><![CDATA[<p><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">No último artigo vimos com mais detalhes a arquitetura do kit FriendlyARM mini2440 e o bootloader que vem instalado de fábrica. Quem ainda não leu este post, pode acessá-lo <a href="http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/" target="_blank">aqui</a>.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Vamos agora colocar a mão na massa. Nosso objetivo aqui é carregar na flash NAND o bootloader <a href="http://www.denx.de/wiki/U-Boot" target="_blank">U-Boot</a>, bastante usado em sistemas embarcados, e depois fazê-lo carregar uma imagem do <a href="http://www.emdebian.org/" target="_blank">Emdebian</a>, uma versão do Debian mais leve.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O único pré-requisito é um kit FriendlyARM mini2440 conectado à uma máquina Linux pela serial (para acessar a console), pela USB (para transferir a imagem do U-boot) e por um cabo de rede (para carregar as imagens do kernel e do rootfs do Emdebian).</span></span></p>
<p style="text-align: justify; "><font class="Apple-style-span" face="verdana, geneva, sans-serif" size="4"><span class="Apple-style-span" style="font-size: 14px;">Usei o binário do U-boot deste link <a href="http://mini2440.spaceopera.org/site/servlet/org.meshcms.core.DownloadServlet/androidonthemini2440/files/android-install-kit-mini2440.tar.gz" target="_blank">aqui</a>. O kernel eu baixei <a href="http://www.friendlyarm.net/dl.php?file=android-kernel_20090825.tgz" target="_blank">daqui</a>, mas precisei customizá-lo para habilitar o suporte à sistema de arquivos JFFS2 e corrigir o mapeamento das partições da MTD no driver da Flash. O rootfs eu peguei <a href="http://mini2440.googlecode.com/files/emdebian-grip-090306-armel-lenny-installed.tar.bz2" target="_blank">aqui</a>, mas também precisei “dar um tapa”, e corrigir um problema que impedia de subir o terminal pela console RS232.</span></font></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Para facilitar o trabalho daqueles que irão executar este passo-a-passo, criei um “pacote especial” com todas as ferramentas e imagens necessárias para dar vida ao Emdebian no mini2440. Este pacote pode ser baixado <a href="http://rapidshare.com/files/415759764/uboot-emdebian.tar.gz.html" target="_blank">aqui</a>. Descompacte-o para sua máquina e mãos à obra!</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Bootloader U-Boot</span></span></strong></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O bootloader é uma aplicação que é carregada e executada assim que o hardware é ligado. No universo desktop, estamos familiarizados com o LILO ou o GRUB para carregar sistemas Unix-like, mas no universo embedded as coisas são um pouco mais complicadas. Um bootloader para sistemas embarcados possui 3 principais responsabilidades:</span></p>
<ol>
	<li><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Inicializar o hardware.</span></span></li>
	<li><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Possibilitar a carga e gravação da aplicação na flash via alguma interface de I/O, como porta serial, USB ou interface de rede.</span></span></li>
	<li><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Carregar e executar aplicações da RAM.</span></span></li></ol>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Um bootloader bem conhecido no universo embedded é o Das U-Boot, também conhecido apenas como U-Boot, um bootloader multi-plataforma e open-source, com suporte à diversas arquiteturas como PowerPC, ARM, MIPS, Coldfire e x86. A página do projeto pode ser acessada <a href="http://www.denx.de/wiki/U-Boot" target="_blank">aqui</a>.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O U-Boot será o bootloader que utilizaremos para carregar o Emdebian pela NAND. O processo para carregar e gravar o U-Boot na flash é simples.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Primeiro iremos carregar a imagem do U-Boot na RAM. Para isso precisaremos da imagem do U-Boot (“u-boot-256M.bin” ou “u-boot-128M.bin”, dependendo do seu kit), e da ferramenta “usbpush”. Todos os arquivos encontram-se no link que passei no início deste post. Não esqueça também que a serial e a USB devem estar conectadas.</span></span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Inicie o kit pela NOR, no menu do supervivi selecione a opção “q” e </span><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">prepare-o para receber a imagem do U-Boot e salvar em RAM:</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>q<span style="color: #009900;">&#93;</span> Goto shell of vivi
Enter your selection<span style="color: #339933;">:</span> q
Supervivi<span style="color: #339933;">&gt;</span> load ram <span style="color: #208080;">0x31000000</span> <span style="color: #0000dd;">242360</span> u</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Obs: O parâmetro “242360” deve ser o tamanho em bytes da imagem do U-Boot (“</span><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">u-boot-256M.bin</span><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">” para a flash de 256M no meu caso).</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Então, em um shell do Linux, digite o comando abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">$ sudo .<span style="color: #339933;">/</span>usbpush u<span style="color: #339933;">-</span>boot<span style="color: #339933;">-</span>256M.<span style="color: #202020;">bin</span></pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">A console irá exibir uma mensagem indicando que a transferência foi realizada com sucesso.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Agora iremos executar o U-Boot da RAM mesmo, assim podemos formatar a NAND e depois copiar o U-Boot para lá.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Digite então na console do mini2440:</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Supervivi<span style="color: #339933;">&gt;</span> go <span style="color: #208080;">0x31000000</span></pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Após algumas mensagens, irá aparecer o shell do U-Boot. </span><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Agora vamos formatar a flash. A execução dos comandos abaixo podem demorar um pouco, portanto tenha paciência :)</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">MINI2440 <span style="color: #339933;"># nand scrub</span>
....
<span style="color: #202020;">MINI2440</span> <span style="color: #339933;"># nand createbbt</span>
....</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Depois é só escrever o U-Boot na flash Nand.</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">MINI2440 <span style="color: #339933;"># nand write.e 0x31000000 0 242360</span></pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Obs: Não se esqueça de que novamente o parâmetro “242360” deve ser o tamanho em bytes da imagem do U-Boot.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Muito bem. Você acabou de instalar o U-Boot na sua flash NAND. Desligue a placa, mude a chave para bootar pela NAND para a console cair no shell do U-Boot.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Este bootloader tem bastante recursos. O comando “help” vai exibir uma lista. Podemos por exemplo listar informações da placa ou das partições da flash, conforme abaixo:</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">MINI2440 <span style="color: #339933;"># bdinfo</span>
arch_number <span style="color: #339933;">=</span> <span style="color: #208080;">0x000007CF</span>
env_t       <span style="color: #339933;">=</span> <span style="color: #208080;">0x00000000</span>
boot_params <span style="color: #339933;">=</span> <span style="color: #208080;">0x30000100</span>
DRAM bank   <span style="color: #339933;">=</span> <span style="color: #208080;">0x00000000</span>
<span style="color: #339933;">-&gt;</span> start    <span style="color: #339933;">=</span> <span style="color: #208080;">0x30000000</span>
<span style="color: #339933;">-&gt;</span> size     <span style="color: #339933;">=</span> <span style="color: #208080;">0x04000000</span>
ethaddr     <span style="color: #339933;">=</span> <span style="color:#800080;">08</span><span style="color: #339933;">:</span><span style="color:#800080;">08</span><span style="color: #339933;">:</span><span style="color: #0000dd;">11</span><span style="color: #339933;">:</span><span style="color: #0000dd;">18</span><span style="color: #339933;">:</span><span style="color: #0000dd;">12</span><span style="color: #339933;">:</span><span style="color: #0000dd;">27</span>
ip_addr     <span style="color: #339933;">=</span> 10.0.0.111
baudrate    <span style="color: #339933;">=</span> <span style="color: #0000dd;">115200</span> bps
&nbsp;
MINI2440 <span style="color: #339933;"># mtdparts </span>
device nand0 <span style="color: #339933;">&lt;</span>mini2440<span style="color: #339933;">-</span>nand<span style="color: #339933;">&gt;,</span> <span style="color: #339933;"># parts = 4</span>
 <span style="color: #339933;">#: name                size            offset          mask_flags</span>
 <span style="color: #0000dd;">0</span><span style="color: #339933;">:</span> u<span style="color: #339933;">-</span>boot              <span style="color: #208080;">0x00040000</span>      <span style="color: #208080;">0x00000000</span>      <span style="color: #0000dd;">0</span>
 <span style="color: #0000dd;">1</span><span style="color: #339933;">:</span> env                 <span style="color: #208080;">0x00020000</span>      <span style="color: #208080;">0x00040000</span>      <span style="color: #0000dd;">0</span>
 <span style="color: #0000dd;">2</span><span style="color: #339933;">:</span> kernel              <span style="color: #208080;">0x00500000</span>      <span style="color: #208080;">0x00060000</span>      <span style="color: #0000dd;">0</span>
 <span style="color: #0000dd;">3</span><span style="color: #339933;">:</span> root                <span style="color: #208080;">0x0faa0000</span>      <span style="color: #208080;">0x00560000</span>      <span style="color: #0000dd;">0</span>
active partition<span style="color: #339933;">:</span> nand0<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span> <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span>u<span style="color: #339933;">-</span>boot<span style="color: #009900;">&#41;</span> <span style="color: #208080;">0x00040000</span> @ <span style="color: #208080;">0x00000000</span>
<span style="color: #339933;">&lt;/</span>mini2440<span style="color: #339933;">-</span>nand<span style="color: #339933;">&gt;</span></pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Podemos carregar uma aplicação via serial com os comandos “loadb”, “loads” e “loady”, via NFS com o comando “nfs”, via TFTP com o comando “tftpboot” ou via USB com o comando “usbboot”. Podemos também testar a RAM com os comandos “mtest” e “mw”.</span></p>
<p style="text-align: justify; "><strong><font class="Apple-style-span" face="verdana, geneva, sans-serif" size="4"><span class="Apple-style-span" style="font-size: 14px;">Carregando o Emdebian</span></font></strong></p>
<p style="text-align: justify; "><font class="Apple-style-span" face="verdana, geneva, sans-serif" size="4"><span class="Apple-style-span" style="font-size: 14px;">O Emdebian é uma versão do Debian para sistemas embarcados. Mantém as principais características do Debian, como sistema de gerenciamento de pacotes, sistema de licenças e portabilidade entre diversas plataformas. O sistema de build é customizado para trabalhar com pacotes pequenos e gerar distribuições bem mais leves. A página do projeto pode ser acessada <a href="http://www.emdebian.org/" target="_blank">aqui</a>.</span></font></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A carga do kernel (“uImage”) e do rootfs (“</span></span><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">emdebian-jffs2.img</span><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">”) é feita através de uma conexão de rede. Ligue seu PC com o mini2440 através de um cabo de rede, configure o endereço IP do seu PC com 10.0.0.1, e o do kit com 10.0.0.2. Configure o mini2440 através dos comandos abaixo na console do U-Boot:</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">MINI2440 <span style="color: #339933;"># dynenv set 40000</span>
MINI2440 <span style="color: #339933;"># setenv ipaddr 10.0.0.2</span>
MINI2440 <span style="color: #339933;"># setenv serverip 10.0.0.1</span>
MINI2440 <span style="color: #339933;"># saveenv</span></pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Use o comando “ping 10.0.0.1″ na console do U-Boot para verificar se a conexão com o PC está funcionando corretamente.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Vamos agora gravar o kernel. O processo consiste em carregar a imagem do kernel para a RAM, e então de lá gravar na flash:</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">MINI2440 <span style="color: #339933;"># tftp 0x31000000 uImage</span>
MINI2440 <span style="color: #339933;"># nand erase kernel</span>
MINI2440 <span style="color: #339933;"># nand write.e 0x31000000 kernel 0x205f58</span></pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Para o rootfs, o processo é idêntico:</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">MINI2440 <span style="color: #339933;"># tftp 0x31000000 emdebian-jffs2.img</span>
MINI2440 <span style="color: #339933;"># nand erase root </span>
MINI2440 <span style="color: #339933;"># nand write.e 0x31000000 root 0x23e0000</span></pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Agora só falta setar as variáveis de ambiente do U-Boot para iniciar o kernel do Linux corretamente:</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">MINI2440 <span style="color: #339933;"># setenv bootcmd nboot.e kernel ; bootm</span>
MINI2440 <span style="color: #339933;"># setenv bootargs root=/dev/mtdblock3 rootfstype=jffs2 console=ttySAC0,115200</span>
MINI2440 <span style="color: #339933;"># saveenv</span>
MINI2440 <span style="color: #339933;"># boot</span></pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Pronto! O Emdebian já está rodando no nosso kit mini2440:</span></p>
<div style="text-align: justify; ">
	<p style="text-align: justify; "><font class="Apple-style-span" face="verdana, geneva, sans-serif" size="4"><span class="Apple-style-span" style="font-size: 14px;"><img alt="" height="294" src="http://www.sergioprado.org/wp-content/uploads/mini2440-emdebian.png" width="500" /><br />
		</span></font></p>
	<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Quando comecei a escrever este post, minha intenção original era carregar o <a href="http://www.android.com/" target="_blank">Android</a>, mas acabei “descobrindo” durante o processo que a quantidade de RAM do mini2440 (64M) não é suficiente para este SO. O que o pessoal acabou fazendo foi rodá-lo a partir de um cartão de memória SD usando um mecanismo de swap. Se isso funciona mesmo ou não, veremos no meu próximo post…:)</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>
	<div style="text-align: justify; "><span style="font-size: 14px; "><span style="font-family: verdana, geneva, sans-serif; ">Sergio Prado</span></span></div></div>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/' rel='bookmark' title='Permanent Link: Mini2440 — Memory layout e bootloader'>Mini2440 — Memory layout e bootloader</a></li>
<li><a href='http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/' rel='bookmark' title='Permanent Link: Kit de desenvolvimento FriendlyARM mini2440'>Kit de desenvolvimento FriendlyARM mini2440</a></li>
<li><a href='http://www.sergioprado.org/2010/05/25/video-introducao-ao-linux-embarcado/' rel='bookmark' title='Permanent Link: Vídeo: Introdução ao Linux Embarcado'>Vídeo: Introdução ao Linux Embarcado</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=6uByWM74GuU:_00bSf1uJEU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=6uByWM74GuU:_00bSf1uJEU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=6uByWM74GuU:_00bSf1uJEU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=6uByWM74GuU:_00bSf1uJEU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/6uByWM74GuU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/</feedburner:origLink></item>
		<item>
		<title>Mini2440 — Memory layout e bootloader</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/sRe9LKf7jZM/</link>
		<comments>http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 16:13:13 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Produtos]]></category>
		<category><![CDATA[arm9]]></category>
		<category><![CDATA[FriendlyARM]]></category>
		<category><![CDATA[mini2440]]></category>
		<category><![CDATA[nand]]></category>
		<category><![CDATA[nor]]></category>
		<category><![CDATA[supervivi]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=801</guid>
		<description><![CDATA[Nest post vamos ver com um pouco mais de detalhes a arquitetura da CPU, o layout de memória e o bootloader que vem instalado de fábrica no kit FriendlyARM mini2440.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Recentemente comprei o kit <a href="http://www.friendlyarm.net/products/mini2440" target="_blank">FriendlyARM Mini2440</a>, e escrevi um post introdut&oacute;rio sobre ele <a href="http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/" target="_blank">aqui</a>.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Minhas impress&otilde;es iniciais s&atilde;o muito boas. Ele &eacute; possivelmente um dos melhores kits existentes (que conhe&ccedil;o) para se aprender sobre Linux embarcado, por ser um hardware robusto, pelas ferramentas existentes e pela rela&ccedil;&atilde;o custo/benef&iacute;cio.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Vamos ver ent&atilde;o com um pouco mais de detalhes a arquitetura da CPU, o layout de mem&oacute;ria e o bootloader que vem instalado de f&aacute;brica.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><strong>CPU E O LAYOUT DE MEM&Oacute;RIA</strong></span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O kit, com todas as suas interfaces de I/O e mem&oacute;ria, pode ser visto na figura abaixo:</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><img alt="" height="400" src="http://www.sergioprado.org/wp-content/uploads/mini2440(1).png" width="580" /></span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A CPU &eacute; um&nbsp;<span class="Apple-style-span">Samsung </span><span class="Apple-style-span">S3C2440 baseado no core&nbsp;</span><a href="http://en.wikipedia.org/wiki/ARM9" target="_blank"><span class="Apple-style-span">A</span><span class="Apple-style-span">RM920T</span></a><span class="Apple-style-span">, RISC, arquitetura Harvard e voltado para aplica&ccedil;&otilde;es de baixo consumo. O datasheet pode ser baixado <a href="http://www.armkits.com/download/s3c2440.pdf" target="_blank">aqui</a>.</span></span></span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Tem capacidade de endere&ccedil;amento de at&eacute; 1GB, sendo 8 bancos de mem&oacute;ria de 128M selecion&aacute;veis atrav&eacute;s de 8 chip select&#39;s (nGCS0...nGCS7).</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A mem&oacute;ria RAM de 64MB (2 x 32MB) est&aacute; mapeada para o endere&ccedil;o f&iacute;sico 0x30000000&nbsp;<span class="Apple-style-span">atrav&eacute;s do nGCS6.</span></span></span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Existem duas mem&oacute;rias de programa neste kit, o que acaba sendo um diferencial perante outros kits ARM voltados para aprendizado. O kit possui 2MB de mem&oacute;ria flash do tipo NOR e 64MB de mem&oacute;ria flash do tipo NAND.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Para quem n&atilde;o conhece, vale aqui uma explica&ccedil;&atilde;o sobre as diferen&ccedil;as entre estes dois tipos de mem&oacute;ria.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Ambas foram inventadas na d&eacute;cada de 80 pela Toshiba. As primeiras mem&oacute;rias NOR foram vendidas pela Intel em 88. Com tempo de resposta para apagar e escrever muito grande, mas com a possibilidade de acesso &agrave; leitura em qualquer posi&ccedil;&atilde;o de mem&oacute;ria, foi uma aplica&ccedil;&atilde;o ideal para mem&oacute;rias do tipo ROM, para armazenar programas que dificilmente s&atilde;o alterados, como a BIOS de PCs &nbsp;e firmware de equipamentos eletr&ocirc;nicos.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">J&aacute; as mem&oacute;rias do tipo NAND possui um tempo de escrita bem menor, e uma maior densidade, ou seja, mais MB de dados pelo mesmo espa&ccedil;o se comparados com as mem&oacute;rias NOR. Por outro lado, n&atilde;o &eacute; poss&iacute;vel acesso de leitura &agrave; qualquer posi&ccedil;&atilde;o de mem&oacute;ria. A leitura e grava&ccedil;&atilde;o &eacute; feita por blocos de mem&oacute;ria (4kB por exemplo). Isso d&aacute; a ela a aplica&ccedil;&atilde;o ideal para armazenamento de dados. Quando usada como mem&oacute;ria de programa, &eacute; necess&aacute;rio ter um bootloader que carrega seu conte&uacute;do em mem&oacute;ria RAM para ser executado.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O kit mini2440 consegue fazer o boot pelas duas mem&oacute;rias atrav&eacute;s de uma chave (NAND &lt;-&gt; NOR) no canto inferior direito da imagem acima.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Ao fazer o boot pela NAND, a CPU possui uma regi&atilde;o especial chamada de&nbsp;<span class="Apple-style-span">&quot;Boot internal SRAM&quot;, onde s&atilde;o carregados e executados os primeiros 4KB da NAND. Estes primeiros 4K de programa ser&atilde;o os respons&aacute;veis por carregar o resto do programa da NAND para a RAM, e rodar a aplica&ccedil;&atilde;o a partir de l&aacute;.</span></span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><span class="Apple-style-span">Ao fazer o boot pela NOR, &eacute; carregado o bootloader Supervivi,&nbsp;que v&ecirc;m instalado de f&aacute;brica. Ele &eacute;&nbsp;baseado no bootloader open source vivi da Samsung. Vamos dar uma olhada nele com mais detalhes.</span></span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><strong><span class="Apple-style-span">BOOTLOADER SUPERVIVI</span></strong></span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Para acessar o bootloader ligue os cabos RS323 e USB e deixe a chave de sele&ccedil;&atilde;o de mem&oacute;ria na posi&ccedil;&atilde;o NOR. Voc&ecirc; pode usar qualquer aplica&ccedil;&atilde;o para consoles como o <a href="http://technet.microsoft.com/en-us/library/bb457166.aspx" target="_blank">HyperTerminal</a> para Windows ou o <a href="http://alioth.debian.org/projects/minicom/" target="_blank">minicom</a> para Linux. Este &eacute; o menu inicial do bootloader Supervivi:</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><span class="Apple-style-span"><img alt="" height="364" src="http://www.sergioprado.org/wp-content/uploads/supervivi_menu.png" width="479" /></span></span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A op&ccedil;&atilde;o &quot;q&quot; oferece um shell para o bootloader e as outras op&ccedil;&otilde;es automatizam determinada tarefa.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Apesar da manipula&ccedil;&atilde;o do bootloader ser pela console (porta serial), a transfer&ecirc;ncia de arquivos &eacute; pela USB. Voc&ecirc; vai precisar de uma aplica&ccedil;&atilde;o adicional para transferir arquivos e imagens: <a href="http://www.friendlyarm.net/dl.php?file=dnw.zip" target="_blank">DNW for Windows</a>&nbsp;ou <a href="http://www.friendlyarm.net/dl.php?file=usbpush.tar.gz" target="_blank">Usb-push for Linux</a>.&nbsp;<span class="Apple-style-span">Nos nossos exemplos usaremos um PC com Linux, mas os procedimentos com Windows s&atilde;o similares, e mais informa&ccedil;&otilde;es podem ser encontradas no manual de usu&aacute;rio do kit <a href="http://www.friendlyarm.net/dl.php?file=download.pdf" target="_blank">aqui</a>.</span></span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><strong>CARREGANDO UMA APLICA&Ccedil;&Atilde;O STANDALONE</strong></span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Para carregar uma aplica&ccedil;&atilde;o standalone na flash NAND, basta usar a op&ccedil;&atilde;o &quot;a&quot;. Esta aplica&ccedil;&atilde;o standalone pode ser qualquer bin&aacute;rio pronto para execu&ccedil;&atilde;o. Pode ser uma simples aplica&ccedil;&atilde;o para piscar leds ou uma aplica&ccedil;&atilde;o mais completa com RTOS. Vamos carregar aqui o bin&aacute;rio &quot;myled.bin&quot; na flash, que vem como exemplo junto com o kit:</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Primeiro devemos preparar o bootloader para carregar o arquivo com a op&ccedil;&atilde;o &quot;a&quot;:</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>a<span style="color: #009900;">&#93;</span> Absolute User Application
Enter your selection<span style="color: #339933;">:</span> a
USB host is connected. <span style="color: #202020;">Waiting</span> a download.</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Depois devemos disparar a transfer&ecirc;ncia com a aplica&ccedil;&atilde;o usb-push:</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">$ sudo .<span style="color: #339933;">/</span>usbpush <span style="color: #339933;">/</span>media<span style="color: #339933;">/</span>cdrom0<span style="color: #339933;">/</span>sample\ code\ without\ OS<span style="color: #339933;">/</span>myled.<span style="color: #202020;">bin</span>
csum <span style="color: #339933;">=</span> <span style="color: #208080;">0x83c6</span>
send_file<span style="color: #339933;">:</span> addr <span style="color: #339933;">=</span> <span style="color: #208080;">0x30000000</span><span style="color: #339933;">,</span> len <span style="color: #339933;">=</span> <span style="color: #208080;">0x0000084c</span></pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O bootloader vai exibir o status da transfer&ecirc;ncia:</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Now<span style="color: #339933;">,</span> Downloading <span style="color: #009900;">&#91;</span>ADDRESS<span style="color: #339933;">:</span>30000000h<span style="color: #339933;">,</span>TOTAL<span style="color: #339933;">:</span><span style="color: #0000dd;">2134</span><span style="color: #009900;">&#93;</span>
RECEIVED FILE SIZE<span style="color: #339933;">:</span>    <span style="color: #0000dd;">2134</span> <span style="color: #009900;">&#40;</span>2KB<span style="color: #339933;">/</span>S<span style="color: #339933;">,</span> 1S<span style="color: #009900;">&#41;</span>
Downloaded file at <span style="color: #208080;">0x30000000</span><span style="color: #339933;">,</span> size <span style="color: #339933;">=</span> <span style="color: #0000dd;">2124</span> bytes
Write to flash ok<span style="color: #339933;">:</span> skipped size <span style="color: #339933;">=</span> <span style="color: #208080;">0x0</span><span style="color: #339933;">,</span> size <span style="color: #339933;">=</span> <span style="color: #208080;">0x84c</span></pre></div></div>



<div style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Ent&atilde;o &eacute; s&oacute; mudar a chave para NAND e reiniciar o kit.</span></div>
<div>
	<div style="text-align: justify; ">&nbsp;</div>
	<div style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Vale aqui ressaltar um detalhe que j&aacute; expliquei mais acima: como sua aplica&ccedil;&atilde;o esta rodando pela NAND, o processador vai carregar os primeiros 4K para a SRAM interna e executar. Portanto, os primeiros 4K da sua aplica&ccedil;&atilde;o dever&aacute; ter um c&oacute;digo para copiar seu conte&uacute;do para a RAM e ent&atilde;o bootar a aplica&ccedil;&atilde;o de l&aacute;.</span></div>
	<div style="text-align: justify; ">&nbsp;</div>
	<div style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; "><strong>CARREGANDO O LINUX</strong></span></div>
	<div style="text-align: justify; ">&nbsp;</div>
	<div style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">O bootloader divide a flash em 4 parti&ccedil;&otilde;es. Acesse o menu do bootloader com a op&ccedil;&atilde;o &quot;q&quot; e digite o comando &quot;part show&quot;</span></div>
	<div style="text-align: justify; ">&nbsp;</div>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Supervivi<span style="color: #339933;">&gt;</span> part show
Number of partitions<span style="color: #339933;">:</span> <span style="color: #0000dd;">4</span>
name            <span style="color: #339933;">:</span>       offset          size            flag
<span style="color: #339933;">------------------------------------------------------------</span>
vivi            <span style="color: #339933;">:</span>       <span style="color: #208080;">0x00000000</span>      <span style="color: #208080;">0x00040000</span>      <span style="color: #0000dd;">0</span>
param           <span style="color: #339933;">:</span>       <span style="color: #208080;">0x00040000</span>      <span style="color: #208080;">0x00020000</span>      <span style="color: #0000dd;">0</span>
kernel          <span style="color: #339933;">:</span>       <span style="color: #208080;">0x00060000</span>      <span style="color: #208080;">0x00500000</span>      <span style="color: #0000dd;">0</span>
root            <span style="color: #339933;">:</span>       <span style="color: #208080;">0x00560000</span>      <span style="color: #208080;">0x3fa80000</span>      <span style="color: #0000dd;">0</span></pre></div></div>



	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Na primeira parti&ccedil;&atilde;o est&aacute; o pr&oacute;prio bootloader da NAND, a segunda &eacute; uma regi&atilde;o para armazenar par&acirc;metros e vari&aacute;veis usadas pelo bootloader, na terceira est&aacute; o kernel e na quarta o rootfs.</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><br />
		</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Esta forma de trabalho facilita o desenvolvimento, porque voc&ecirc; pode fazer altera&ccedil;&otilde;es no rootfs sem ter que alterar o kernel, por exemplo.</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><br />
		</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Para ent&atilde;o carregar o linux, o processo &eacute; bem parecido com a aplica&ccedil;&atilde;o standalone explicada acima. A diferen&ccedil;a &eacute; que voc&ecirc; vai precisar executar separadamente os comandos &quot;v&quot; para o bootloader, &quot;k&quot; para o kernel e &quot;y&quot; para o rootfs.</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><br />
		</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><strong>O QUE MAIS POSSO FAZER COM ESTE BOOTLOADER</strong></span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><br />
		</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Voc&ecirc; pode ainda carregar um WINDOWS CE (op&ccedil;&otilde;es &quot;n&quot;, &quot;l&quot;, &quot;w&quot;), carregar uma aplica&ccedil;&atilde;o diretamente para a mem&oacute;ria e rodar de l&aacute; (op&ccedil;&atilde;o &quot;d&quot;), formatar a flash (op&ccedil;&atilde;o &quot;f&quot;) e at&eacute; fazer backup/restore&nbsp;</span></span><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">da NAND&nbsp;</span><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">(op&ccedil;&otilde;es &quot;u&quot; e &quot;r&quot;).&nbsp;</span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><br />
		</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><span class="Apple-style-span">A regra aqui &eacute; usar o bootloader Supervivi na mem&oacute;ria NOR para manipular a flash NAND, e assim n&atilde;o correr o risco de travar o kit. Se voc&ecirc; apagar o conte&uacute;do da NOR, s&oacute; com um JTAG para voc&ecirc; carregar novamente o bootloader.</span></span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><br />
		</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Este bootloader, apesar de ajudar inicialmente, tem algumas defici&ecirc;ncias, como suportar apenas sistemas de arquivo yaffs. No pr&oacute;ximo post vamos carregar o u-boot, um bootloader bem mais flexivel, e brincar um pouco com o Android. At&eacute; l&aacute;!</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><br />
		</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Um abra&ccedil;o,</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><br />
		</span></span></div>
	<div style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Sergio Prado</span></span></div></div>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/' rel='bookmark' title='Permanent Link: Kit de desenvolvimento FriendlyARM mini2440'>Kit de desenvolvimento FriendlyARM mini2440</a></li>
<li><a href='http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/' rel='bookmark' title='Permanent Link: Mini2440 — Linux com U-Boot e Emdebian'>Mini2440 — Linux com U-Boot e Emdebian</a></li>
<li><a href='http://www.sergioprado.org/2010/07/29/memory-leak-em-linguagem-c/' rel='bookmark' title='Permanent Link: Memory leak em linguagem C'>Memory leak em linguagem C</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=sRe9LKf7jZM:XqvgSebFRvI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=sRe9LKf7jZM:XqvgSebFRvI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=sRe9LKf7jZM:XqvgSebFRvI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=sRe9LKf7jZM:XqvgSebFRvI:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/sRe9LKf7jZM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/</feedburner:origLink></item>
		<item>
		<title>Linuxcon 2010</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/7o3dFveaurQ/</link>
		<comments>http://www.sergioprado.org/2010/08/13/linuxcon-2010/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 02:26:08 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[linux foundation]]></category>
		<category><![CDATA[linuxcon]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=790</guid>
		<description><![CDATA[O que rolou na Linuxcon 2010 em Boston/EUA, e como participar da Linuxcon Brasil 2010.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; "><span style="font-size:14px;">Esta semana, em Boston/EUA, a <a href="http://www.linuxfoundation.org" target="_blank">Linux Foundation</a> organizou a <a href="http://events.linuxfoundation.org/events/linuxcon/live-video-streaming" target="_blank">Linuxcon 2010</a>, reunindo desenvolvedores, administradores, usuários e executivos que trabalham com Linux.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;">Muita coisa aconteceu por lá, em áreas tão diversas como mobile, servidores e sistemas embarcados.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;">A Linux Foundation divulgou um programa, chamado de “<a href="http://www.linuxfoundation.org/programs/legal/compliance" target="_blank">Open Compliance Program</a>”, cujo intuito é ajudar as empresas a disponibilizar os códigos-fonte utilizados sob licenças open-source, como a GPL. Segundo a Linux Foundation, muitas empresas não divulgam seu código-fonte por falta de conhecimento dos aspectos legais ou operacionais. A Linux Foundation irá disponibilizar ferramentas, manuais, cursos e modelos de documento para que as empresas evitem o desrespeito às licenças de software livre.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;">Sabendo da importância que o Linux vem assumindo nos últimos anos em sistemas embarcados e dispositivos móveis, a <a href="http://www.qualcomm.com/quicinc/" target="_blank">Qualcomm Inovation Center</a>, uma subsidiária da <a href="http://www.qualcomm.com/" target="_blank">Qualcomm</a>, fabricante de chips para celulares, tornou-se um membro Platinum da Linux Foundation. Isso significa um melhor suporte e avanço do Linux no mercado mobile.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;">No keynote da <a href="http://www.novell.com" target="_blank">Novell</a>, no segundo dia do evento, falou-se bastante sobre a evolução da computação em nuvem, balanceamento de carga em servidores Linux e virtualização. </span></p>
<p style="text-align: justify; "><span style="font-size:14px;">Foi divulgada também uma pesquisa realizada Forrester Research, sobre a utilização do Linux como host entre desenvolvedores de software, e o resultado mostrou um crescimento do Linux nos últimos 3 anos:</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><img alt="" height="320" src="http://www.sergioprado.org/wp-content/uploads/pesquisa_linux.png" width="371" /><br />
	</span></p>
<p style="text-align: justify; "><span style="font-size:14px;">Falou-se também da plataforma <a href="http://meego.com/" target="_blank">Meego</a>, junção dos projetos <a href="http://en.wikipedia.org/wiki/Moblin" target="_blank">Moblin</a> da Intel e <a href="http://maemo.org/" target="_blank">Maemo</a> da Nokia, baseado na arquitetura Atom da Intel.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Pelo que li em sites e blogs de tecnologia, o grande foco este ano foi a importância do software livre e aberto, e do crescimento da plataforma Linux no mercado mobile.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Nos dias 31/08 e 01/09, em São Paulo, vai acontecer a Linuxcon Brasil. Palestrantes de nome estarão por lá, como Linus Torvalds (criador do Linux), Jim Zelim (diretor da Linux Foundation) e Jane Silber (CEO da Canonical), além do inusitado <a href="http://pt.wikipedia.org/wiki/Jon_Hall" target="_blank">Jon “maddog” Hall</a>, que sempre esta em todos os eventos de Linux.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Eu estarei lá para ouvir o que o pessoal tem a dizer sobre o futuro do Linux, principalmente no mercado embedded. Se você quiser participar, a página do evento pode ser acessada <a href="http://events.linuxfoundation.org/events/linuxcon-brazil/pt/inicio" target="_blank">aqui</a>, e o ingresso para o evento pode ser comprado no site da <a href="http://www.linuxnewmedia.com.br/shopping/cart/" target="_blank">Linux Magazine</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>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/08/04/kernel-linux-2-6-35/' rel='bookmark' title='Permanent Link: Kernel Linux 2.6.35'>Kernel Linux 2.6.35</a></li>
<li><a href='http://www.sergioprado.org/2009/10/03/ii-seminario-programacao-cc-para-sistemas-embarcados/' rel='bookmark' title='Permanent Link: Seminário Programação C/C++ para Sistemas Embarcados 2009'>Seminário Programação C/C++ para Sistemas Embarcados 2009</a></li>
<li><a href='http://www.sergioprado.org/2010/08/12/meld-2-0-para-desenvolvedores-de-linux-embarcado/' rel='bookmark' title='Permanent Link: Meld 2.0 para desenvolvedores de linux embarcado'>Meld 2.0 para desenvolvedores de linux embarcado</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=7o3dFveaurQ:K-9Vpbw_jkM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=7o3dFveaurQ:K-9Vpbw_jkM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=7o3dFveaurQ:K-9Vpbw_jkM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=7o3dFveaurQ:K-9Vpbw_jkM:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/7o3dFveaurQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/08/13/linuxcon-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/08/13/linuxcon-2010/</feedburner:origLink></item>
		<item>
		<title>Meld 2.0 para desenvolvedores de linux embarcado</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/sy79Nvd4tp8/</link>
		<comments>http://www.sergioprado.org/2010/08/12/meld-2-0-para-desenvolvedores-de-linux-embarcado/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 22:34:01 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[linux embarcado]]></category>
		<category><![CDATA[meld]]></category>
		<category><![CDATA[montavista]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=782</guid>
		<description><![CDATA[Nova versão da comunidade para desenvolvedores de Linux embarcado da MontaVista.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A <a href="http://www.mvista.com/" target="_blank">MontaVista</a>, empresa líder no mercado de Linux Embarcado, liberou esta semana a nova versão do site da comunidade online para desenvolvidores de Linux embarcado, o Meld 2.0.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A primeira versão havia sido lançada em 2009, e sofreu várias alterações, principalmente na interface.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Apesar de ser patrocinado pela MontaVista, o site é voltado para qualquer tópico relacionado à sistemas embarcados com Linux, incluindo desenvolvimento com Android, customização do Linux, gerenciamento de memória e I/O, multi-core, etc.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Muito bom para solucionar problemas, ajudar outros desenvolvedores e fazer networking.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O novo site pode ser acessado em <a href="http://meld.org" target="_blank">meld.org</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>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/05/25/video-introducao-ao-linux-embarcado/' rel='bookmark' title='Permanent Link: Vídeo: Introdução ao Linux Embarcado'>Vídeo: Introdução ao Linux Embarcado</a></li>
<li><a href='http://www.sergioprado.org/2010/08/04/kernel-linux-2-6-35/' rel='bookmark' title='Permanent Link: Kernel Linux 2.6.35'>Kernel Linux 2.6.35</a></li>
<li><a href='http://www.sergioprado.org/2010/02/24/como-se-tornar-um-desenvolvedor-de-software-embarcado/' rel='bookmark' title='Permanent Link: Como se tornar um desenvolvedor de software embarcado'>Como se tornar um desenvolvedor de software embarcado</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=sy79Nvd4tp8:AvFcUGp5taE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=sy79Nvd4tp8:AvFcUGp5taE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=sy79Nvd4tp8:AvFcUGp5taE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=sy79Nvd4tp8:AvFcUGp5taE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/sy79Nvd4tp8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/08/12/meld-2-0-para-desenvolvedores-de-linux-embarcado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/08/12/meld-2-0-para-desenvolvedores-de-linux-embarcado/</feedburner:origLink></item>
		<item>
		<title>Renesas oferece kit de avaliação gratuitamente</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/-umemj5Qfak/</link>
		<comments>http://www.sergioprado.org/2010/08/11/renesas-oferece-kit-de-avaliacao-gratuitamente/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 01:22:37 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Produtos]]></category>
		<category><![CDATA[renesas]]></category>
		<category><![CDATA[rx600]]></category>
		<category><![CDATA[rx610]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=771</guid>
		<description><![CDATA[Renesas oferece gratuitamente seu kit de avaliação RX-Stick for RX610.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Por um tempo determinado a <a href="http://www.renesas.com" target="_blank">Renesas</a> esta oferecendo gratuitamente seu kit de avaliação RX-Stick for RX610. A RX600 é uma série high-end da família RX de processadores, sucessora das famílias H8SX e R32C, arquiteturas de 32 bits da Renesas. Mais informações sobre a série RX600 podem ser lidas <a href="http://www.renesas.eu/products/mpumcu/rx/rx600/rx600_landing.jsp" target="_blank">aqui</a>.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O kit tem uma CPU de 32bits rodando a 100MHz, 2MB de Flash e 128KB de RAM, gravação e debugging pela USB, matriz de leds, potenciômetro, joystick de quatro direções, etc. A Renesas criou uma <a href="http://www.renesasrulz.com/community/demoboards/rx610stick" target="_blank">página no site de sua comunidade online</a> para este kit com bastante documentação e software de exemplos para a utilização do kit, além de um vídeo demonstrando seu funcionamento:</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;"><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/U4o5JzRGBek&#038;fs=1" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/U4o5JzRGBek&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></span></span></p>
<p style="text-align: justify; "><strike><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Se você quiser participar e receber um kit gratuitamente, basta fazer um cadastro no site da Renesas aqui.</span></span></strike></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Atualização: Infelizmente a Renesas não pode atender toda a demanda, e a promoção está cancelada.</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>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/' rel='bookmark' title='Permanent Link: Mini2440 — Memory layout e bootloader'>Mini2440 — Memory layout e bootloader</a></li>
<li><a href='http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/' rel='bookmark' title='Permanent Link: Kit de desenvolvimento FriendlyARM mini2440'>Kit de desenvolvimento FriendlyARM mini2440</a></li>
<li><a href='http://www.sergioprado.org/2010/07/15/nova-ferramenta-para-debug-de-consumo-de-energia/' rel='bookmark' title='Permanent Link: Nova ferramenta para debug de consumo de energia'>Nova ferramenta para debug de consumo de energia</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=-umemj5Qfak:fXSn4ilG6ZU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=-umemj5Qfak:fXSn4ilG6ZU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=-umemj5Qfak:fXSn4ilG6ZU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=-umemj5Qfak:fXSn4ilG6ZU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/-umemj5Qfak" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/08/11/renesas-oferece-kit-de-avaliacao-gratuitamente/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/08/11/renesas-oferece-kit-de-avaliacao-gratuitamente/</feedburner:origLink></item>
		<item>
		<title>Kit de desenvolvimento FriendlyARM mini2440</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/Vn2xfElK3tA/</link>
		<comments>http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 23:21:04 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Produtos]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[FriendlyARM]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mini2440]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=763</guid>
		<description><![CDATA[Kit de desenvolvimento ARM9 cheio de recursos para se usar como plataforma de aprendizado em ARM e Linux Embarcado.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A pouco menos de 2 meses comprei no site do <a href="http://ebay.com" target="_blank">eBay</a> o kit de desenvolvimento <a href="http://www.friendlyarm.net/products/mini2440" target="_blank">FriendlyARM mini2440</a>. O produto foi importado da China e chegou este fim de semana. Fui ao estabelecimento dos Correios, paguei os impostos devidos e retirei o produto.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">No total (valor do kit + frete + impostos) o kit saiu em torno de R$360,00. Valor bem mais barato do que se adquirisse por aqui, ou se comprasse um kit ARM similar.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">E realmente este kit tem algumas caracteristicas interessantes. A come&ccedil;ar pelo tamanho, de 10cm x 10cm. Veja uma foto com a placa do lado do meu Nokia E71:</span></span></p>
<p style="text-align: justify; "><font class="Apple-style-span" face="verdana, geneva, sans-serif" size="4"><span class="Apple-style-span" style="font-size: 14px;"><img alt="" height="367" src="http://www.sergioprado.org/wp-content/uploads/mini2440_size.png" width="580" /><br />
	</span></font></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Al&eacute;m da placa o kit acompanha&nbsp;um display touch screen de 3,5 polegadas e&nbsp;alguns cabos (serial, JTAG, USB, Ethernet), e vem pre-carregado com uma imagem rodando Linux e <a href="http://en.wikipedia.org/wiki/Qt_Extended" target="_blank">Qtopia</a>. Veja abaixo o kit montado e rodando:</span></span></p>
<p style="text-align: justify; "><font class="Apple-style-span" face="verdana, geneva, sans-serif" size="4"><span class="Apple-style-span" style="font-size: 14px;"><img alt="" height="377" src="http://www.sergioprado.org/wp-content/uploads/mini2440.png" width="580" /><br />
	</span></font></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Suas configura&ccedil;&otilde;es s&atilde;o impressionantes: CPU ARM9 da Samsung de 400MHz (S3C2440A), 64M de SDRAM, 64M de Nand Flash e 2M de NOR Flash, al&eacute;m de v&aacute;rias interfaces incluindo serial RS232, USB, Ethernet, Cart&atilde;o SD e JTAG.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">J&aacute; vem com um bootloader que possibilita carregar a aplica&ccedil;&atilde;o via USB, e &eacute; compat&iacute;vel com os sistemas operacionais Windows CE, GNU/Linux e Android.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Este kit ser&aacute;, durante as pr&oacute;ximas semanas, a plataforma que utilizarei para me aprofundar em ARM e linux embarcado, e especialmente no sistema operacional <a href="http://www.android.com/" target="_blank">Android</a> do Google.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Alguns posts interessantes sobre este kit est&atilde;o por vir. Aguardem!</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Um abra&ccedil;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>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/08/17/mini2440-memory-layout-e-bootloader/' rel='bookmark' title='Permanent Link: Mini2440 — Memory layout e bootloader'>Mini2440 — Memory layout e bootloader</a></li>
<li><a href='http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/' rel='bookmark' title='Permanent Link: Mini2440 — Linux com U-Boot e Emdebian'>Mini2440 — Linux com U-Boot e Emdebian</a></li>
<li><a href='http://www.sergioprado.org/2010/07/17/wind-river-apostando-na-plataforma-android/' rel='bookmark' title='Permanent Link: Wind River apostando na plataforma Android'>Wind River apostando na plataforma Android</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=Vn2xfElK3tA:mQFAn583qy8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=Vn2xfElK3tA:mQFAn583qy8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=Vn2xfElK3tA:mQFAn583qy8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=Vn2xfElK3tA:mQFAn583qy8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/Vn2xfElK3tA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/08/08/kit-de-desenvolvimento-friendlyarm-mini2440/</feedburner:origLink></item>
		<item>
		<title>Kernel Linux 2.6.35</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/b5AHdMlPnww/</link>
		<comments>http://www.sergioprado.org/2010/08/04/kernel-linux-2-6-35/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 02:17:31 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[btrfs]]></category>
		<category><![CDATA[etx4]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=758</guid>
		<description><![CDATA[No último dia 01/08 foi liberada a nova versão do kernel do Linux versão 2.6.35.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">No &uacute;ltimo dia 01/08 foi liberada a nova vers&atilde;o do kernel do Linux vers&atilde;o 2.6.35, que al&eacute;m de v&aacute;rios bug fixes, inclui tamb&eacute;m algumas altera&ccedil;&otilde;es para sistemas multicore.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Uma das principais altera&ccedil;&otilde;es &eacute; uma tecnologia desenvolvida pelo Google para o tratamento de pacotes de rede entre v&aacute;rias CPUs. Essa tecnologia &eacute; dividida em duas t&eacute;cnicas chamadas de RPS (Receive Packet Steering) e RFS (Receive Flow Steering), e consegue quase triplicar a performance da rede. Uma explica&ccedil;&atilde;o sobre seu funcionamento pode ser lida <a href="http://lwn.net/Articles/382428/" target="_blank">aqui</a>.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Esta nova vers&atilde;o tamb&eacute;m tem melhorias no sistema de arquivos <a href="http://en.wikipedia.org/wiki/Btrfs" target="_blank">Btrfs</a>, considerado como o sucessor do <a href="http://pt.wikipedia.org/wiki/Ext4" target="_blank">Ext4</a>, um frontend para o KDB (debugger do Kernel), um novo mecanismo de desfragmenta&ccedil;&atilde;o de mem&oacute;ria e muitas outras altera&ccedil;&otilde;es em drivers e corre&ccedil;&otilde;es de bugs.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Uma descri&ccedil;&atilde;o mais completa das altera&ccedil;&otilde;es pode ser lida <a href="http://kernelnewbies.org/Linux_2_6_35" target="_blank">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&ccedil;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>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/08/12/meld-2-0-para-desenvolvedores-de-linux-embarcado/' rel='bookmark' title='Permanent Link: Meld 2.0 para desenvolvedores de linux embarcado'>Meld 2.0 para desenvolvedores de linux embarcado</a></li>
<li><a href='http://www.sergioprado.org/2010/08/30/mini2440-linux-com-u-boot-e-emdebian/' rel='bookmark' title='Permanent Link: Mini2440 — Linux com U-Boot e Emdebian'>Mini2440 — Linux com U-Boot e Emdebian</a></li>
<li><a href='http://www.sergioprado.org/2010/05/25/video-introducao-ao-linux-embarcado/' rel='bookmark' title='Permanent Link: Vídeo: Introdução ao Linux Embarcado'>Vídeo: Introdução ao Linux Embarcado</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=b5AHdMlPnww:qcTgtXlJbgY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=b5AHdMlPnww:qcTgtXlJbgY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=b5AHdMlPnww:qcTgtXlJbgY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=b5AHdMlPnww:qcTgtXlJbgY:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/b5AHdMlPnww" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/08/04/kernel-linux-2-6-35/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/08/04/kernel-linux-2-6-35/</feedburner:origLink></item>
		<item>
		<title>Memory leak em linguagem C</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/CIMFYZ2O0xc/</link>
		<comments>http://www.sergioprado.org/2010/07/29/memory-leak-em-linguagem-c/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 00:01:49 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Linguagem C]]></category>
		<category><![CDATA[memory leak]]></category>
		<category><![CDATA[splint]]></category>
		<category><![CDATA[valgrind]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=739</guid>
		<description><![CDATA[Neste artigo vamos analisar algumas técnicas e ferramentas de identificação de memory leak em software para sistemas embarcados.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Dependendo do problema que queremos resolver, precisamos de uma quantidade vari&aacute;vel de espa&ccedil;o para armazenar alguma informa&ccedil;&atilde;o. Isso pode acontecer, por exemplo, quando estamos trabalhando com protocolos de comunica&ccedil;&atilde;o onde a quantidade de dados trafegados &eacute; vari&aacute;vel. Ou ent&atilde;o quando trabalhamos com estruturas de dados como listas ligadas, onde elementos desta lista s&atilde;o adicionados/removidos dinamicamente.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A biblioteca C padr&atilde;o fornece as fun&ccedil;&otilde;es malloc() para alocar mem&oacute;ria dinamicamente e free() para desalocar uma regi&atilde;o de mem&oacute;ria previamente alocada.</span></span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>malloc<span style="color: #009900;">&#40;</span>size_t size<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> free<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>ptr<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; ">Estas rotinas usam uma regi&atilde;o de mem&oacute;ria chamada de heap. &Eacute; no heap que os bytes s&atilde;o alocados com malloc() e liberados com free(). O tamanho do heap &eacute; vari&aacute;vel, dependendo de v&aacute;rios fatores como o tamanho da mem&oacute;ria, capacidade de endere&ccedil;amento da CPU, etc. Mas claramente &eacute; uma regi&atilde;o de mem&oacute;ria finita. A cada chamada a malloc(), uma pequena parte desta regi&atilde;o de mem&oacute;ria &eacute; consumida. E se n&atilde;o for liberada, corremos o risco de ficar sem mem&oacute;ria.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">O uso de malloc() e free() de maneira descontrolada pode causar dois principais problemas:</span></span></p>
<ol>
	<li style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Fragmenta&ccedil;&atilde;o de mem&oacute;ria: A cada malloc(), um peda&ccedil;o de mem&oacute;ria &eacute; alocado, e fica indispon&iacute;vel para a aplica&ccedil;&atilde;o. Se o software abusar das chamadas a malloc(), a mem&oacute;ria poder&aacute; ficar fragmentada em pequenos peda&ccedil;os alocados para a aplica&ccedil;&atilde;o. Depois as rotinas de aloca&ccedil;&atilde;o ter&atilde;o dificuldades de encontrar &quot;peda&ccedil;os&quot; de mem&oacute;ria que atendem &agrave;s novas chamadas &agrave; malloc(). A forma como ocorre esta fragmenta&ccedil;&atilde;o &eacute; dependente da biblioteca ou do sistema operacional respons&aacute;vel pela aloca&ccedil;&atilde;o de mem&oacute;ria.</span></span></li>
	<li style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Memory leak: Se voc&ecirc; alocar regi&otilde;es de mem&oacute;ria com malloc(), mas depois do uso n&atilde;o liberar estas regi&otilde;es com o free(), temos caracterizado o memory leak, um dos principais pesadelos do desenvolvedor de software embarcado. &Eacute; um pesadelo porque a memoria come&ccedil;a a ser consumida aos poucos, e a aplica&ccedil;&atilde;o pode ficar dias sem apresentar algum problema. Mas ent&atilde;o num belo dia, quando toda a mem&oacute;ria &eacute; consumida, coisas estranhas come&ccedil;am a acontecer. A performance da aplica&ccedil;&atilde;o come&ccedil;a a se degradar, e travamentos ou reboot automaticos ir&atilde;o invariavelmente acontecer.</span></span></li></ol>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Nosso foco neste artigo &eacute; o memory leak. Vamos analisar ent&atilde;o algumas t&eacute;cnicas para tratar e identificar este problema.</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">T&eacute;cnica 0: N&atilde;o usar malloc()</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Usar aloca&ccedil;&atilde;o dinamica de mem&oacute;ria em sistemas embarcados deve ser seu ultimo recurso. Padr&otilde;es como o MISRA-C, que tratei em um <a href="http://www.sergioprado.org/2010/05/27/misra-c-padrao-para-software-em-c/" target="_blank">artigo passado</a>, proibem categoricamente seu uso. Portanto pensem bastante na solu&ccedil;&atilde;o. Depois pensem de novo. E de novo. At&eacute; ter certeza de que aloca&ccedil;&atilde;o din&acirc;mica de mem&oacute;ria &eacute; a &uacute;nica solu&ccedil;&atilde;o para seu problema.</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">T&eacute;cnica 1: Code review</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Ent&atilde;o voc&ecirc; usou aloca&ccedil;&atilde;o din&acirc;mica de mem&oacute;ria em seu c&oacute;digo, e agora precisa garantir a aus&ecirc;ncia de memory leak na aplica&ccedil;&atilde;o. E uma das primeiras t&eacute;cnicas a serem aplicadas &eacute; o <a href="http://en.wikipedia.org/wiki/Code_review" target="_blank">Code Review</a>, ou revis&atilde;o de c&oacute;digo.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A t&eacute;cnica de revis&atilde;o de c&oacute;digo deveria ser aplicada independentemente do uso de malloc(). N&oacute;s devemos revisar nossos c&oacute;digos. E ent&atilde;o devemos pedir para outras pessoas revis&aacute;-los. E depois revisar o c&oacute;digo de outras pessoas. Uma boa parte dos bugs podem ser encontrados com esta t&eacute;cnica.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">A id&eacute;ia aqui &eacute; ler o c&oacute;digo, identificar todas as chamadas &agrave; malloc(), e verificar se existe o free() correspondente. D&ecirc; uma olhada na fun&ccedil;&atilde;o abaixo:</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
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> txData<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>data<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> NULL<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>buf <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> size <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* allocate buffer */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ptr <span style="color: #339933;">=</span> buf <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>size <span style="color: #339933;">+</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* STX */</span>
    <span style="color: #339933;">*</span>ptr<span style="color: #339933;">++</span> <span style="color: #339933;">=</span> STX<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* data */</span>
    strncpy<span style="color: #009900;">&#40;</span>ptr<span style="color: #339933;">,</span> data<span style="color: #339933;">,</span> size<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ptr <span style="color: #339933;">+=</span> size<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* ETX */</span>
    <span style="color: #339933;">*</span>ptr<span style="color: #339933;">++</span> <span style="color: #339933;">=</span> ETX<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* send data */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>txSerial<span style="color: #009900;">&#40;</span>buf<span style="color: #339933;">,</span> size <span style="color: #339933;">+</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* free buffer */</span>
    free<span style="color: #009900;">&#40;</span>buf<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 class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Temos aqui um exemplo cl&aacute;ssico de memory leak. Esta fun&ccedil;&atilde;o recebe uma string, formata em um buffer, e envia pela serial. Como o tamanho da string &eacute; vari&aacute;vel, o buffer de comunica&ccedil;&atilde;o &eacute; alocado dinamicamente. Veja que na linha 7 o buffer &eacute; alocado, e na linha 25 o buffer &eacute; liberado. Por&eacute;m, quando ocorre um erro ao enviar os dados (linha 21), a fun&ccedil;&atilde;o retorna sem desalocar o buffer, caracterizando o memory leak. Este erro &eacute; muito comum. Quando usamos malloc() devemos nos certificar de que todos os pontos de retorno da fun&ccedil;&atilde;o possuem uma chamada a free().</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Esta t&eacute;cnica pode ser muito custosa para aplica&ccedil;&otilde;es com milhares de linhas de c&oacute;digo, e isso nos leva ao uso de ferramentas para automatizar esta verifica&ccedil;&atilde;o.</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">T&eacute;cnica 2: Uso de ferramentas</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Ferramentas s&atilde;o uma parte essencial do processo de desenvolvimento, e n&atilde;o ser&aacute; diferente quando nosso objetivo &eacute; analisar um problema de memory leak. Existem v&aacute;rios tipos de ferramentas, algumas que fazem an&aacute;lise est&aacute;tica de c&oacute;digo (analisa diretamente o c&oacute;digo-fonte) e outras que fazem verifica&ccedil;&atilde;o din&acirc;mica (em tempo de execu&ccedil;&atilde;o).</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Para testar algumas ferramentas, vamos complementar a fun&ccedil;&atilde;o txData() com uma fun&ccedil;&atilde;o main(), e for&ccedil;ar um memory leak. Nosso c&oacute;digo final ficou assim:</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
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* leak.c */</span>
<span style="color: #339933;">#include &quot;stdio.h&quot;</span>
<span style="color: #339933;">#include &quot;string.h&quot;</span>
<span style="color: #339933;">#include &quot;malloc.h&quot;</span>
&nbsp;
<span style="color: #339933;">#define STX 0x02</span>
<span style="color: #339933;">#define ETX 0x03</span>
&nbsp;
<span style="color: #993333;">int</span> txSerial<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>buffer<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> size<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #993333;">int</span> txData<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>data<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> NULL<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>buf <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> size <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* allocate buffer */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ptr <span style="color: #339933;">=</span> buf <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>size <span style="color: #339933;">+</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* STX */</span>
    <span style="color: #339933;">*</span>ptr<span style="color: #339933;">++</span> <span style="color: #339933;">=</span> STX<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* data */</span>
    strncpy<span style="color: #009900;">&#40;</span>ptr<span style="color: #339933;">,</span> data<span style="color: #339933;">,</span> size<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ptr <span style="color: #339933;">+=</span> size<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* ETX */</span>
    <span style="color: #339933;">*</span>ptr<span style="color: #339933;">++</span> <span style="color: #339933;">=</span> ETX<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* send data */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>txSerial<span style="color: #009900;">&#40;</span>buf<span style="color: #339933;">,</span> size <span style="color: #339933;">+</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/* free buffer */</span>
    free<span style="color: #009900;">&#40;</span>buf<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: #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: #993333;">char</span> <span style="color: #339933;">*</span>msg <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;MemoryLeak&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>txData<span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Mensagem enviada com sucesso!<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;">else</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Erro ao enviar mensagem!<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></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; ">Primeiro vamos testar com uma ferramenta de analise est&aacute;tica de c&oacute;digo, o SPLINT, j&aacute; tratado anteriormente no meu <a href="http://www.sergioprado.org/2010/01/28/analise-estatica-codigo/" target="_blank">artigo aqui</a>.</span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">$ splint leak.<span style="color: #202020;">c</span>
Splint 3.1.2 <span style="color: #339933;">---</span> <span style="color: #208080;">03</span> May <span style="color: #0000dd;">2009</span>
....
<span style="color: #202020;">leak</span>.<span style="color: #202020;">c</span><span style="color: #339933;">:</span><span style="color: #0000dd;">37</span><span style="color: #339933;">:</span><span style="color: #0000dd;">20</span><span style="color: #339933;">:</span> Owned storage ptr not released before <span style="color: #b1b100;">return</span>
  A memory leak has been detected. <span style="color: #202020;">Only</span><span style="color: #339933;">-</span>qualified storage is not released
  before the last reference to it is lost. <span style="color: #009900;">&#40;</span>Use <span style="color: #339933;">-</span>mustfreeonly to inhibit
  warning<span style="color: #009900;">&#41;</span>
   leak.<span style="color: #202020;">c</span><span style="color: #339933;">:</span><span style="color: #0000dd;">22</span><span style="color: #339933;">:</span><span style="color: #0000dd;">10</span><span style="color: #339933;">:</span> Storage ptr becomes owned
....</pre></div></div>



<p style="text-align: justify; "><span class="Apple-style-span" style="font-family: verdana, geneva, sans-serif; font-size: 14px; ">Voil&aacute;! A ferramenta encontrou facilmente o memory leak que inserimos no c&oacute;digo. O interessante de uma ferramenta de an&aacute;lise est&aacute;tica &eacute; que, como a analisa &eacute; feita nos fontes da aplica&ccedil;&atilde;o, ela pode ser usada em qualquer c&oacute;digo-fonte, independente da arquitetura ou do sistema operacional que estamos usando, desde que esteja no padr&atilde;o ANSI C.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">J&aacute; o uso de ferramentas de an&aacute;lise din&acirc;mica podem pegar casos espec&iacute;ficos que passariam despercebidos quando usamos ferramentas de an&aacute;lise est&aacute;tica. Por outro lado, estas ferramentas s&atilde;o dependentes de determinado sistema operacional, ou ent&atilde;o exigem que voc&ecirc; compile seu c&oacute;digo com uma biblioteca espec&iacute;fica. Isso porque estas ferramentas adicionam uma camada extra na sua aplica&ccedil;&atilde;o, monitorando cada chamada a malloc() e free(), para depois gerar um relat&oacute;rio que pode indicar um memory leak quando a quantidade de chamadas a malloc() for diferente da quantidade de chamadas a free() por exemplo.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Uma destas ferramentas, muito utilizada para detectar memory leak em aplica&ccedil;&otilde;es para sistemas Unix, &eacute; o <a href="http://valgrind.org/" target="_blank">Valgring</a>. Esta ferramenta de debug, dentre outras funcionalidades, monitora o uso de mem&oacute;ria pela aplica&ccedil;&atilde;o em tempo de execu&ccedil;&atilde;o. Vamos testar o comportamento desta ferramenta com a nossa aplica&ccedil;&atilde;o.</span></span></p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">$ valgrind .<span style="color: #339933;">/</span>leak
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> Memcheck<span style="color: #339933;">,</span> a memory error detector
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> Copyright <span style="color: #009900;">&#40;</span>C<span style="color: #009900;">&#41;</span> <span style="color: #0000dd;">2002</span><span style="color: #339933;">-</span><span style="color: #0000dd;">2009</span><span style="color: #339933;">,</span> and GNU GPL<span style="color: #339933;">,</span> by Julian Seward et al.
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> Using Valgrind<span style="color: #339933;">-</span>3.6.0.<span style="color: #202020;">SVN</span><span style="color: #339933;">-</span>Debian and LibVEX<span style="color: #339933;">;</span> rerun with <span style="color: #339933;">-</span>h <span style="color: #b1b100;">for</span> copyright info
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> Command<span style="color: #339933;">:</span> .<span style="color: #339933;">/</span>leak
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> 
Erro ao enviar mensagem<span style="color: #339933;">!</span>
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> 
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> HEAP SUMMARY<span style="color: #339933;">:</span>
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span>     in use at exit<span style="color: #339933;">:</span> <span style="color: #0000dd;">13</span> bytes in <span style="color: #0000dd;">1</span> blocks
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span>   total heap usage<span style="color: #339933;">:</span> <span style="color: #0000dd;">1</span> allocs<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span> frees<span style="color: #339933;">,</span> <span style="color: #0000dd;">13</span> bytes allocated
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> 
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> LEAK SUMMARY<span style="color: #339933;">:</span>
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span>    definitely lost<span style="color: #339933;">:</span> <span style="color: #0000dd;">13</span> bytes in <span style="color: #0000dd;">1</span> blocks
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span>    indirectly lost<span style="color: #339933;">:</span> <span style="color: #0000dd;">0</span> bytes in <span style="color: #0000dd;">0</span> blocks
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span>      possibly lost<span style="color: #339933;">:</span> <span style="color: #0000dd;">0</span> bytes in <span style="color: #0000dd;">0</span> blocks
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span>    still reachable<span style="color: #339933;">:</span> <span style="color: #0000dd;">0</span> bytes in <span style="color: #0000dd;">0</span> blocks
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span>         suppressed<span style="color: #339933;">:</span> <span style="color: #0000dd;">0</span> bytes in <span style="color: #0000dd;">0</span> blocks
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> Rerun with <span style="color: #339933;">--</span>leak<span style="color: #339933;">-</span>check<span style="color: #339933;">=</span>full to see details of leaked memory
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> 
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> For counts of detected and suppressed errors<span style="color: #339933;">,</span> rerun with<span style="color: #339933;">:</span> <span style="color: #339933;">-</span>v
<span style="color: #339933;">==</span><span style="color: #0000dd;">3811</span><span style="color: #339933;">==</span> ERROR SUMMARY<span style="color: #339933;">:</span> <span style="color: #0000dd;">0</span> errors from <span style="color: #0000dd;">0</span> contexts <span style="color: #009900;">&#40;</span>suppressed<span style="color: #339933;">:</span> <span style="color: #0000dd;">13</span> from <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span></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 ap&oacute;s executar a aplica&ccedil;&atilde;o ela imprime um relat&oacute;rio do uso de mem&oacute;ria, indicando a ocorrencia do memory leak.</span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Se voc&ecirc; quiser, d&ecirc; uma olhada tamb&eacute;m na biblioteca <a href="http://dmalloc.com/" target="_blank">dmalloc</a>. Ela adiciona uma camada adicional na sua aplica&ccedil;&atilde;o, possibilitando o debug de aloca&ccedil;&atilde;o de mem&oacute;ria em tempo de execu&ccedil;&atilde;o. Esta biblioteca foi escrita em ANSI C e pode ser facilmente portada para qualquer arquitetura.</span></span></p>
<p style="text-align: justify; "><strong><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">T&eacute;cnica 3: Desenvolva sua pr&oacute;pria biblioteca</span></span></strong></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Se nenhuma solu&ccedil;&atilde;o dispon&iacute;vel lhe servir, sempre existe a possibilidade de voc&ecirc; colocar a m&atilde;o na massa e desenvolver suas pr&oacute;prias rotinas de aloca&ccedil;&atilde;o de mem&oacute;ria. Reinventar a roda &eacute; sempre mais trabalhoso e custoso, mas se voc&ecirc; se sentir aventureiro, pode analisar esta possibilidade. D&ecirc; uma olhada neste artigo <a href="http://www.eetimes.com/design/other/4023946/More-on-Memory-Leaks" target="_blank">aqui</a>.</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Normalmente, s&oacute; damos aten&ccedil;&atilde;o a um problema quando o vivenciamos. Sempre achamos que n&atilde;o vai acontecer conosco. E quando acontece, temos que lidar com as consequencias e aprender com os erros. Mas melhor do que aprender com seus pr&oacute;prios erros, &eacute; aprender com os erros dos outros. Portanto, seja mais proativo. memory leak &eacute; igual a press&atilde;o alta, uma doen&ccedil;a silenciosa, mas que quando apresenta os sintomas, estes provavelmente ser&atilde;o fatais!</span></span></p>
<p style="text-align: justify; "><span style="font-size:14px;"><span style="font-family:verdana,geneva,sans-serif;">Um abra&ccedil;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>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/06/12/tratamento-de-erros-em-linguagem-c/' rel='bookmark' title='Permanent Link: Tratamento de erros em Linguagem C'>Tratamento de erros em Linguagem C</a></li>
<li><a href='http://www.sergioprado.org/2009/10/03/otimizacao-de-codigo-em-linguagem-c-parte-2/' rel='bookmark' title='Permanent Link: Otimização de código em Linguagem C — Parte 2'>Otimização de código em Linguagem C — Parte 2</a></li>
<li><a href='http://www.sergioprado.org/2009/09/26/otimizacao-de-codigo-em-linguagem-c-parte-1/' rel='bookmark' title='Permanent Link: Otimização de código em Linguagem C — Parte 1'>Otimização de código em Linguagem C — Parte 1</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=CIMFYZ2O0xc:hDt7ry7RzbI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=CIMFYZ2O0xc:hDt7ry7RzbI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=CIMFYZ2O0xc:hDt7ry7RzbI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=CIMFYZ2O0xc:hDt7ry7RzbI:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/CIMFYZ2O0xc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/07/29/memory-leak-em-linguagem-c/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/07/29/memory-leak-em-linguagem-c/</feedburner:origLink></item>
		<item>
		<title>Microsoft em novo acordo com a ARM</title>
		<link>http://feedproxy.google.com/~r/blog_do_sergio_prado/~3/QUcx0nkDEiE/</link>
		<comments>http://www.sergioprado.org/2010/07/26/microsoft-em-novo-acordo-com-a-arm/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 01:21:36 +0000</pubDate>
		<dc:creator>sergioprado</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[a4]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[microsoft]]></category>

		<guid isPermaLink="false">http://www.sergioprado.org/?p=735</guid>
		<description><![CDATA[Microsoft anuncia novo acordo de licenciamento com a ARM.]]></description>
			<content:encoded><![CDATA[<p><span style="font-family:verdana,geneva,sans-serif;"><span style="font-size:14px;">No último dia 23 de julho a Microsoft anunciou um novo acordo de licenciamento com a ARM, dando a ela o acesso à arquitetura e à liberdade de produzir chips com a arquitetura ARM.</span></span></p>
<p><span style="font-family:verdana,geneva,sans-serif;"><span style="font-size:14px;">A Microsoft segue o mesmo caminho da Apple, que licenciou a arquitetura ARM para produzir seus chips <a href="http://en.wikipedia.org/wiki/Apple_A4" target="_blank">A4</a> para o iPad e o iPhone4.</span></span></p>
<p><span style="font-family:verdana,geneva,sans-serif;"><span style="font-size:14px;">Muito têm-se especulado sobre qual o objetivo da Microsoft ao licenciar a arquitetura ARM. Podem ser produtos voltados ao mercado de consumo como smartphones, netbooks e tablets, usando aí seu novo SO, o <a href="http://www.windowsphone7.com/" target="_blank">Windows Phone 7</a>.</span></span></p>
<p><span style="font-family:verdana,geneva,sans-serif;"><span style="font-size:14px;">Ou então especula-se também a utilização de chips ARM nos servidores que rodam o sistema de buscas da Microsoft, o <a href="http://www.bing.com" target="_blank">Bing</a>, principalmente porque ela divulgou recentemente uma <a href="http://www.eetimes.com/electronics-news/4088639/Microsoft-job-ad-hints-at-ARM-based-servers" target="_blank">posição aberta</a> para um engenheiro de software com experiencia em ARM para atuar em seus Data Centers.</span></span></p>
<p><span style="font-family:verdana,geneva,sans-serif;"><span style="font-size:14px;">É esperar para ver.</span></span></p>
<p><span style="font-family:verdana,geneva,sans-serif;"><span style="font-size:14px;">O press release do acordo pode ser lido <a href="http://www.arm.com/about/newsroom/microsoft-licenses-arm-architecture.php" target="_blank">aqui</a>.</span></span></p>
<p><span style="font-family:verdana,geneva,sans-serif;"><span style="font-size:14px;">Um abraço,</span></span></p>
<p><span style="font-family:verdana,geneva,sans-serif;"><span style="font-size:14px;">Sergio Prado</span></span></p>

<p>Posts relacionados:<ol><li><a href='http://www.sergioprado.org/2010/08/13/linuxcon-2010/' rel='bookmark' title='Permanent Link: Linuxcon 2010'>Linuxcon 2010</a></li>
<li><a href='http://www.sergioprado.org/2010/07/17/open-source-hardware/' rel='bookmark' title='Permanent Link: Open Source Hardware'>Open Source Hardware</a></li>
<li><a href='http://www.sergioprado.org/2009/10/03/ii-seminario-programacao-cc-para-sistemas-embarcados/' rel='bookmark' title='Permanent Link: Seminário Programação C/C++ para Sistemas Embarcados 2009'>Seminário Programação C/C++ para Sistemas Embarcados 2009</a></li>
</ol></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=QUcx0nkDEiE:5Ufky-QBGFM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=QUcx0nkDEiE:5Ufky-QBGFM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=QUcx0nkDEiE:5Ufky-QBGFM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?a=QUcx0nkDEiE:5Ufky-QBGFM:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/blog_do_sergio_prado?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/blog_do_sergio_prado/~4/QUcx0nkDEiE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sergioprado.org/2010/07/26/microsoft-em-novo-acordo-com-a-arm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sergioprado.org/2010/07/26/microsoft-em-novo-acordo-com-a-arm/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.474 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-09-02 19:12:27 -->
