Com tantos ARM Cortex, MSP430 e Arduinos por aí, fica difícil pensar em utilizar um núcleo tão antigo quanto o 8051. No entanto, esse velho amigo ainda tem seu espaço nas universidades e em algumas aplicações muito específicas. Apesar de se tratar de um núcleo dos primórdios do desenvolvimento embarcado microcontrolado, não precisamos necessariamente trabalhar com ele fazendo uso apenas de Assembly.
Neste artigo vamos apresentar uma ferramenta Open Source que se propõe a trabalhar com esses “pequenos dispositivos”. Estamos falando do SDCC (Small Device C Compiler). Esse compilador também é capaz de compilar para outros núcleos, como o Z80, 68HC08, e até mesmo nossos amigos PIC16 e PIC18. No entanto, vamos nos ater ao núcleo que deixou o SDCC conhecido, nosso amigo 8051.
8051
Criado pela Intel em 1980, esse núcleo possui tão somente 128 Bytes de memória RAM e 4KB de memória ROM. Hoje ainda é fabricado por uma série de empresas de semicondutores, como por exemplo:
| Fabricante | Part-number | RAM | ROM | Velocidade |
| Analog | ADuC841 | 2.304 Bytes | 62 KBytes | 20 MIPS @ 20MHz |
| Atmel | AT89S51 | 128 Bytes | 4 KBytes | 2 MIPS @ 24MHz |
| NXP | P89LPC933 | 256 Bytes | 4 KBytes | 9 MIPS @ 18MHz |
Cada fabricante adiciona novas funcionalidades ao dispositivo, como o portas de comunicação SPI, I2C, novos timers, mais memória Flash e RAM. No entanto, seu funcionamento permanece o mesmo.
SDCC
| O projeto desse compilador começou em 1995, quando Sandeep Dutta precisava desenvolver para uma pequena placa com um 8051 que havia desenvolvido. Demorou 3 anos para o lançamento da sua primeira versão, na época em uma pequena página do Geocities. Assumiu a licença GPL logo nas suas primeiras versões, hoje compilando para uma série de outros processadores. |
Hoje, o SDCC é o único compilador C open-source compatível com o núcleo 8051. É capaz de compilar projetos complexos, como o port do FreeRTOS para o 8051 da Silicon Labs.
Hello World
Nossa proposta aqui não é estudar o 8051, e sim conhecer o SDCC. Portanto, vamos utilizar a biblioteca 8051.h presente no compilador e fazer uso de port digital P1.0 do dispositivo. Faremos um fonte que piscará um LED, nada mais simples. O código será:
#include <8051.h>
void main( void )
{
unsigned short int i ;
for( i = 0 ; ; i++ )
{
if( i & 0x1000 )
{
P1_0 = 0 ;
}
else
{
P1_0 = 1 ;
}
}
}
Esse exemplo será salvo com o nome exemplo.c para que possamos compilar. Como o núcleo 8051 é o padrão para esse compilador, não há a necessidade de indicar qual o microcontrolador utilizado neste caso. Dessa forma, a linha de comando fica conforme abaixo.
Podemos perceber que o compilador gerou uma série de arquivos durante o processo. São eles:
| Nome | |
| exemplo.asm | Fonte em código Assembly. |
| exemplo.ihx | Saída em formato Intel HEX. Objeto que será convertido para gravação. |
| exemplo.lk | Arquivo Linker Script. Uma vez que ele não exista, o compilador cria um padrão. |
| exemplo.map | Mapa de memória dos módulos carregados. |
| exemplo.mem | Sumário da memória do dispositivo. |
| exemplo.rel | Arquivo objeto criado pelo Assembly. |
| exemplo.rst exemplo.lst | Arquivos de listagem criados, contendo informações da linkedição. |
| exemplo.sym | Listagem de símbolos. |
Embora não seja fundamental, algumas linhas do arquivo IHX criado podem não estar alinhadas. Isso pode causar problemas na hora da gravação. Dessa forma, é conveniente reempacotar o arquivo, de forma a deixar a memória alinhada. Para isso, o SDCC possui uma ferramenta chamada PACKIHX. Podemos executar essa função com a linha abaixo:
:03000000020006F5 :03005F0002000399 :0300030002006296 :100062007E007F00EF30E404C2908002D2900EBE88 :0500720000F20F80EF19 :06003500E478FFF6D8FD9F :100013007900E94400601B7A0090007B780075A0AA :1000230000E493F2A308B8000205A0D9F4DAF2754C :02003300A0FF2C :10003B007800E84400600A790075A000E4F309D861 :10004B00FC7800E84400600C7900900000E4F0A319 :04005B00D8FCD9FAFA :0D000600758107120077E582600302000398 :04007700758200226C :00000001FF
Referências
SDCC Compiler User Guide










Olá Francesco Sacco. Muito legal esse artigo sobre o compilador SDCC, eu havia lido sobre ele em um livro de linguagem C para 8051, do Nicolosi. Seria muito legal fazer um artigo que mostre o uso também para os microcontroladores PIC. Eu estava pesquisando sobre os compiladores e alternativas de projetos para microcontroladores, o problema é que as ferramentas de desenvolvimento, como por exemplo, o CCS Compiler, o Mikro C, são ferramentas com um valor considerável, até o mesmo o compilador da própria Microchip. Talvez outros fabricantes ofereçam alternativas que seja free. Valeu.