{"id":274,"date":"2016-08-23T17:22:13","date_gmt":"2016-08-23T17:22:13","guid":{"rendered":"http:\/\/leandroip.com\/?p=274"},"modified":"2016-08-23T18:33:42","modified_gmt":"2016-08-23T18:33:42","slug":"utilizando-a-ide-codeblocks-com-sdcc","status":"publish","type":"post","link":"https:\/\/www.leandroip.com\/?p=274","title":{"rendered":"Utilizando a IDE Code::Blocks com SDCC"},"content":{"rendered":"<p>Ap\u00f3s muito tempo de pesquisas e tentativas, finalmente consegui configurar o Code::Blocks para usar o SDCC de forma satisfat\u00f3ria.<\/p>\n<p>Ent\u00e3o, neste post vamos configurar o <a href=\"http:\/\/www.codeblocks.org\/\">Code::Blocks<\/a> para utilizar o compilador <a href=\"http:\/\/sdcc.sourceforge.net\/\">SDCC (Small Device C Compiler)<\/a>. Al\u00e9m de todas as vantagens do uso de uma IDE, como auto-completar, o Code::Blocks compila automaticamente todas as bibliotecas necess\u00e1rias e gera o arquivo .hex pronto para utilizar com apenas 1 clique.<\/p>\n<p>Ap\u00f3s instalar o Code::Blocks, vamos configurar o compilador SDCC:<\/p>\n<ol>\n<li>Acesse Settings\u2192Compiler;<\/li>\n<li>Selecione o Compilador: Small Device C Compiler;<\/li>\n<li>Na aba &#8220;Compiler settings&#8221;, deixe tudo desmarcado;<\/li>\n<li>Na aba &#8220;Linker Settings&#8221;, deixe tudo em branco, remova qualquer biblioteca se tiver;<\/li>\n<li>Fa\u00e7a o mesmo na aba &#8220;Search directories&#8221; e suas sub-abas;<\/li>\n<li>Na aba &#8220;Toolchain executables&#8221;, corrija o diret\u00f3rio do compilador, no meu caso \u00e9 &#8220;C:\\Program Files\\SDCC&#8221;;<\/li>\n<li>Na aba &#8220;Other Settings&#8221;, clique em &#8220;Avanced Options&#8221; e Yes;\n<ol>\n<li>Na aba &#8220;Commands&#8221;, selecione o comando &#8220;Link object files to executable&#8221; e, no campo &#8220;Command line macro&#8221;, remova &#8220;-o $exe_output&#8221;;<\/li>\n<li>Fa\u00e7a o mesmo para &#8220;Link object files to console executable&#8221;<\/li>\n<li>Fa\u00e7a o mesmo para\u00a0&#8220;Link object files to native executable&#8221;;<\/li>\n<\/ol>\n<\/li>\n<li>Voc\u00ea pode clicar em &#8220;Set as default&#8221; se s\u00f3 usa o sdcc;<\/li>\n<\/ol>\n<p>Feita a configura\u00e7\u00e3o do compilador, criamos um novo projeto. Nesse novo projeto fazemos as configura\u00e7\u00f5es locais.<\/p>\n<blockquote><p>Para n\u00e3o ter que fazer toda a configura\u00e7\u00e3o a seguir, voc\u00ea pode baixar um modelo de projeto. Assim, basta abrir e alterar\/compilar. Mas, se quiser entender como funciona, siga os passos abaixo.<\/p><\/blockquote>\n<p>Aqui temos algumas ressalvas:<\/p>\n<p><em><a href=\"http:\/\/leandroip.com\/wp-content\/uploads\/2016\/08\/workspace1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-276\" src=\"http:\/\/leandroip.com\/wp-content\/uploads\/2016\/08\/workspace1.png\" alt=\"workspace1\" width=\"102\" height=\"85\" \/><\/a><\/em><\/p>\n<ul>\n<li>Voc\u00ea deve ter uma pasta de trabalho, a qual contem os seus projetos, um em cada pasta, e as bibliotecas compartilhadas numa outra pasta, assim:\n<ul>\n<li>workspace <em>(minha pasta de trabalho)<\/em>libs <em>(bibliotecas compartilhadas)<\/em>\n<ul>\n<li>projeto_1<\/li>\n<li>projeto_2<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>Parte 2<\/h2>\n<p>Vamos criar um projeto. No Code::Blocks, v\u00e1 em File\u2192New Project:<\/p>\n<ol>\n<li>Selecione &#8220;Empty project&#8221;;<\/li>\n<li>Clique em Go e em Next;<\/li>\n<li>D\u00ea um nome, de prefer\u00eancia sem espa\u00e7os e outros caracteres que n\u00e3o sejam letras, n\u00fameros e underline;<\/li>\n<li>Selecione a pasta &#8220;workspace&#8221;. N\u00e3o crie uma pasta para seu projeto l\u00e1, o Code::Blocks ir\u00e1 fazer isso usando o nome que voc\u00ea deu ao projeto;<\/li>\n<li>Clique em Next;<\/li>\n<li>Desmarque a op\u00e7\u00e3o &#8216;Create &#8220;Debug&#8221; configurations&#8217; e clique em Finish;<\/li>\n<li>Adicione um novo arquivo ao seu projeto em File\u2192New\u2192Empty File ou usando o \u00edcone &#8220;New File&#8221;. A IDE perguntar\u00e1 se deseja salva, clique em Yes e salve na mesma pasta do projeto. <strong>Salve como main.c<\/strong>, pois usaremos esse nome novamente depois.<\/li>\n<li>Crie outros dois arquivos, picsetup.c e picsetup.h;<\/li>\n<li>V\u00e1 em Project\u2192Properties;\n<ol>\n<li>Na aba &#8220;Build targets&#8221;\n<ol>\n<li>Altere Type para Native;<\/li>\n<li>Apague o Output filename (deixe em branco);<\/li>\n<li>Desmarque &#8220;Auto-generate filename extension;<\/li>\n<li>Clique OK;<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>V\u00e1 em Project\u2192Build Options;\n<ol>\n<li>Na aba Compiler Settings e na sub-aba Compiler Flags, marque PIC 16-bit (p18f452&#8230;). Use PIC 14-bit se seu pic for da Familia 16F;<\/li>\n<li>Na sub-aba Other compiler options acrescente:\u00a0<em>&#8211;use-non-free -p18f4550 -I ..\/libs<\/em>. Veja que inclu\u00edmos o diret\u00f3rio de bibliotecas compartilhadas &#8216;libs&#8217;. Tamb\u00e9m indicamos qual \u00e9 o pic a ser programado.<\/li>\n<li>Na aba &#8220;Linker settings&#8221; acrescente &#8220;main.c&#8221; no campo &#8220;Other linker options&#8221;;<\/li>\n<\/ol>\n<\/li>\n<li>Abra o Arquivo main.c e v\u00e1 em File\u2192Properties, na aba Build, desmarque &#8220;Compile File&#8221; e &#8220;Link File&#8221;<\/li>\n<\/ol>\n<p>Coloque o c\u00f3digo de exemplo nos arquivos que foram criados:<\/p>\n<p>main.c<\/p>\n<pre class=\"lang:c decode:true\" title=\"main.c\">#include \"picsetup.h\"\r\n\r\n#pragma config FOSC = HSPLL_HS\r\n#pragma config PWRT = OFF, BOR = OFF\r\n#pragma config WDT = OFF\r\n#pragma config DEBUG = OFF\r\n#pragma config PLLDIV = 5\r\n#pragma config USBDIV = 1\r\n#pragma config CPUDIV = OSC1_PLL2\r\n#pragma config XINST = OFF\r\n\r\n#define LOOPS_PER_MS 820\r\n#include &lt;delays.h&gt;\r\n#define LED PORTEbits.RE1\r\n#define LED2 PORTEbits.RE2\r\n\r\nvoid main()\r\n{\r\n    hdw_setup();\r\n    LED = 0;\r\n    delay_ms(500);\r\n    LED = 1;\r\n    delay_ms(500);\r\n    LED=0;\r\n    delay_ms(500);\r\n    while(1)\r\n    {\r\n        LED = 1;\r\n        delay_ms(100);\r\n        LED = 0;\r\n        delay_ms(100);\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>NOTA: evite LED = !LED, por algum motivo, o SDCC n\u00e3o gera o c\u00f3digo corretamente.<\/p>\n<p>picsetup.h<\/p>\n<pre class=\"lang:c decode:true\" title=\"picsetup.h\">#include &lt;pic18fregs.h&gt;\r\n\r\nvoid hdw_setup();\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>picsetup.c<\/p>\n<pre class=\"lang:default decode:true\" title=\"picsetup.c\">#include \"picsetup.h\"\r\n\r\nvoid hdw_setup(){\r\n\r\n\tTRISA = 0b00000011;\r\n\tTRISB = 0b00000000;\r\n\tTRISC = 0b10000000;\r\n\tTRISD = 0b00000000;\r\n\tTRISE = 0b00000000;\r\n\r\n\tPORTA = 0;\r\n\tPORTB = 0b00000000;\r\n\tPORTC = 0;\r\n\tPORTD = 0;\r\n\tPORTE = 0;\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Salve os arquivos e clique em Build\u2192Rebuild.<\/p>\n<p>Prefira usar sempre o Rebuild, pois o Code::Blocks pode n\u00e3o detectar altera\u00e7\u00f5es das bibliotecas.<\/p>\n<p>O resultado deve ser o seguinte:<\/p>\n<pre class=\"lang:default decode:true\">-------------- Clean: Release in protest (compiler: Small Device C Compiler)---------------\r\n\r\nCleaned \"protest - Release\"\r\n\r\n-------------- Build: Release in protest (compiler: Small Device C Compiler)---------------\r\n\r\nsdcc.exe  -mpic16 --use-non-free -p18f4550 -I ..\/libs     -c picsetup.c -o obj\\Release\\picsetup.o\r\nsdcc.exe    -mpic16 --use-non-free -p18f4550 -I ..\/libs    main.c   obj\\Release\\picsetup.o\r\nmessage: Using default linker script \"C:\\Program Files (x86)\\gputils\\lkr\\18f4550_g.lkr\".\r\nOutput file is main.hex with size 1.35 KB\r\nProcess terminated with status 0 (0 minute(s), 1 second(s))\r\n0 error(s), 0 warning(s) (0 minute(s), 1 second(s))<\/pre>\n<p>&nbsp;<\/p>\n<p>Os passos que envolvem o arquivo main.c foram necess\u00e1rios para que o Code::Blocks executasse a seguinte linha de comando:<\/p>\n<p>sdcc.exe \u00a0 \u00a0-mpic16 &#8211;use-non-free -p18f4550 -I ..\/libs \u00a0 \u00a0main.c \u00a0 obj\\Release\\picsetup.o<\/p>\n<p>De outro modo, o compilador iria primeira gerar um arquivo objeto (-c main.c -o main.o) e depois tentar linkar. E,\u00a0quando voc\u00ea precisar usar bibliotecas como stdio (para printf, por exemplo), obteria um erro dizendo que falta a biblioteca. Executando a linha acima, o compilador encontra as bibliotecas corretas automaticamente.<\/p>\n<p>D\u00favidas, entre em contato ou deixe um coment\u00e1rio.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ap\u00f3s muito tempo de pesquisas e tentativas, finalmente consegui configurar o Code::Blocks para usar o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":285,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-274","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","entry","grid"],"_links":{"self":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts\/274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=274"}],"version-history":[{"count":13,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts\/274\/revisions"}],"predecessor-version":[{"id":293,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/posts\/274\/revisions\/293"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=\/wp\/v2\/media\/285"}],"wp:attachment":[{"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leandroip.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}