• Nenhum resultado encontrado

Gerenciador de aplicativos carregáveis dinamicamente em plataformas embarcadas com RTOS de pequeno porte

N/A
N/A
Protected

Academic year: 2021

Share "Gerenciador de aplicativos carregáveis dinamicamente em plataformas embarcadas com RTOS de pequeno porte"

Copied!
74
0
0

Texto

(1)

CURSO DE ENGENHARIA DE COMPUTAC¸ ˜AO

LEANDRO FABIAN JUNIOR

GERENCIADOR DE APLICATIVOS CARREG ´AVEIS DINAMICAMENTE EM PLATAFORMAS EMBARCADAS COM RTOS DE PEQUENO PORTE

TRABALHO DE CONCLUS ˜AO DE CURSO

PATO BRANCO 2016

(2)

GERENCIADOR DE APLICATIVOS CARREG ´AVEIS DINAMICAMENTE EM PLATAFORMAS EMBARCADAS COM RTOS DE PEQUENO PORTE

Trabalho de Conclus˜ao de Curso apresentado ao Curso Superior de Engenharia de Computac¸˜ao da Universidade Tecnol´ogica Federal do Pa-ran´a - UTFPR, como requisito parcial para obtenc¸˜ao do t´ıtulo de bacharel em Engenharia de Computac¸˜ao.

Orientador: Prof. Dr. Gustavo Weber Denardin

PATO BRANCO 2016

(3)

TERMO DE APROVAÇÃO

Às 10h horas e 30 minutos do dia 06 de dezembro de 2016, na sala V006, da Universidade Tecnológica Federal do Paraná, Câmpus Pato Branco, reuniu-se a banca examinadora composta pelos professores Gustavo Weber Denardin (orientador), Giovanni Alfredo Guarneri e Robison Cris Brito para avaliar o trabalho de conclusão de curso com o título Gerenciador de aplicativos carregáveis dinamicamente em plataformas embarcadas com RTOS de pequeno porte, do aluno Leandro Fabian Junior, matrícula 01376896, do curso de Engenharia de Computação. Após a apresentação o candidato foi arguido pela banca examinadora. Em seguida foi realizada a deliberação pela banca examinadora que considerou o trabalho aprovado.

______________________________

Gustavo Weber Denardin Orientador (UTFPR)

______________________________ ______________________________ Giovanni Alfredo Guarneri Robison Cris Brito

(UTFPR) (UTFPR)

______________________________ ______________________________ Beatriz Terezinha Borsoi Pablo Gauterio Cavalcanti

Coordenador de TCC Coordenador do Curso de

Engenharia de Computação

A Folha de Aprovação assinada encontra-se na Coordenação do Curso. Universidade Tecnológica Federal do Paraná

Câmpus Pato Branco

Departamento Acadêmico de Informática Curso de Engenharia de Computação

(4)

Agradec¸o a todos que acompanharam meus anos de graduac¸˜ao e que de alguma forma contribu´ıram para a minha formac¸˜ao, desde o simples apoio verbal at´e o aux´ılio t´ecnico por horas a fio.

Agradec¸o em especial `a professora Beatriz Terezinha Borsoi, que, como faz a muitos, me auxiliou desde o primeiro dia que entrei na universidade. Agradec¸o tamb´em ao meu professor orientador Gustavo Weber Denardin e aos professores da banca: Giovanni Alfredo Guarneri e Robison Cris Brito, que muito contribu´ıram no desenvolvimento deste trabalho.

Agradec¸o aos meus pais e minha irm˜a, que s˜ao os principais apoiadores de meus estudos e realizac¸˜oes, tanto financeira como emocionalmente, obrigado por terem me dado essa oportuni-dade. Agradec¸o aos muitos amigos que me acompanharam por esses anos e que, com certeza, continuar˜ao fazendo parte das minhas realizac¸˜oes futuras.

Agradec¸o, por fim, ao Programa de Fomento `as Ac¸˜oes da Graduac¸˜ao - EDITAL No08/2016 - APOIO AOS TRABALHOS DE CONCLUS ˜AO DE CURSO 2 – TCC – 2 da Universi-dade Tecnol´ogica Federal do Paran´a, pelo qual fui contemplado com uma bolsa aux´ılio para a execuc¸˜ao desse trabalho.

(5)

FABIAN JUNIOR, Leandro. Gerenciador de Aplicativos Carreg´aveis Dinamicamente em Pla-taformas Embarcadas com RTOS de Pequeno Porte. 2016. 74 f. Trabalho de Conclus˜ao de Curso – Curso de Engenharia de Computac¸˜ao, Universidade Tecnol´ogica Federal do Paran´a. Pato Branco, 2016.

A atualizac¸˜ao do firmware de um sistema embarcado em funcionamento pode representar perdas graves em alguns casos, levando em conta o tempo em que sua execuc¸˜ao precisa ser suspensa. Al´em do mais, se n˜ao forem tomadas as devidas precauc¸˜oes no carregamento do c´odigo para a m´aquina, a aplicac¸˜ao pode apresentar problemas por conta de uma atualizac¸˜ao corrompida. Sis-temas com maiores recursos de hardware e software, contornam muitos desses problemas com a implementac¸˜ao de um mecanismo de gerenciamento de aplicativos. Desse modo, as aplicac¸˜oes podem ser desenvolvidas exteriormente ao sistema principal e, somente depois, instaladas, sem interferir nas aplicac¸˜oes em execuc¸˜ao. O seguinte trabalho tem como proposta principal trazer tais facilidades `as plataformas embarcadas baseadas em sistemas com menores recursos, que utilizem sistemas operacionais de tempo real.

Palavras-chave: Aplicativo dinˆamico. Recursos computacionais escassos. RTOS. Sistemas de tempo real. Sistemas embarcados.

(6)

FABIAN JUNIOR, Leandro. Dynamically Loadable Application Manager on Small RTOS Embedded Platforms. Trabalho de Conclus˜ao de Curso – Curso de Engenharia de Computac¸˜ao, Universidade Tecnol´ogica Federal do Paran´a. Pato Branco, 2016.

Upgrading the firmware of a live-in system may represent serious losses in some cases, taking into account the time when its execution must be suspended. In addition, if you do not take proper precautions when loading code into the machine, the application may experience pro-blems due to a corrupted update. Systems with greater hardware and software resources bypass many of these problems by implementing an application management mechanism. Thus, the applications can be developed outside the main system and then installed without interfering with the running applications. The main goal of this text is to bring such facilities to embedded platforms based on lower-resource systems using real-time operating systems.

Keywords: Downloadable Applications. Embedded systems. Real-Time Systems. RTOS. Scarce computing resources.

(7)

Figura 1 – Diagrama representativo de um sistema de tempo real. . . 16

Figura 2 – Componentes comuns em um kernel de RTOS, incluindo objetos, o escalo-nador e alguns servic¸os . . . 18

Figura 3 – Esquema do processo de compilac¸˜ao e ligac¸˜ao de um c´odigo-fonte . . . 19

Figura 4 – Visualizac¸˜ao da estrutura de um arquivo ELF pelo processo de ligac¸˜ao e pelo de execuc¸˜ao . . . 24

Figura 5 – Exemplo de sec¸˜ao do tipo string table de um arquivo ELF. . . 26

Figura 6 – Barramento m´ınimo da SPI entre o microcontrolador e o cart˜ao SD . . . 30

Figura 7 – Posic¸˜ao do m´odulo FatFs na aplicac¸˜ao . . . 32

Figura 8 – Esquema da arquitetura do sistema pretendido . . . 34

Figura 9 – Acesso `as func¸˜oes da base pelos aplicativos atrav´es da estrutura da API . . . 37

Figura 10 – Relac¸˜ao das etapas de extrac¸˜ao de programa com as partes do arquivo ELF . . 38

Figura 11 – Kit de desenvolvimento Tiva conectado a um leitor de cart˜ao SD e um po-tenciˆometro de 50 kΩ . . . 57

Figura 12 – Resposta do comando de inicializac¸˜ao do cart˜ao SD . . . 58

Figura 13 – Resposta do comando de listagem de arquivos . . . 58

Figura 14 – Resposta do comando de inicializac¸˜ao do cart˜ao SD . . . 59

Figura 15 – Comportamento do led na aplicac¸˜ao adcn.out . . . 59

Figura 16 – Resposta da sequˆencia de comandos: clean, cd leds e ls . . . 60

Figura 17 – Sa´ıda apresentada a partir da sequˆencia de comandos executada . . . 61

Figura 18 – Leds demonstrando a execuc¸˜ao de duas aplicac¸˜oes em paralelo . . . 61

Figura 19 – Sa´ıda apresentada pelo comando de listagem de aplicativos em execuc¸˜ao . . . . 62

Figura 20 – Resposta dos comandos utilizados . . . 62

Figura 21 – Oscilac¸˜ao dos 3 leds, cada um em seu tempo de execuc¸˜ao . . . 63

Figura 22 – Sa´ıda apresentada a partir da sequˆencia de comandos executada . . . 63

Figura 23 – Sa´ıda apresentada a partir da sequˆencia de comandos executada . . . 64

(8)

Quadro 1 – Tipos de dado de um arquivo ELF para arquiteturas de 32 bits . . . 24

Quadro 2 – Definic¸˜oes de tipo (sh type) de um arquivo ELF . . . 27

Quadro 3 – Principais sec¸˜oes especiais de um arquivo ELF . . . 27

Quadro 4 – Definic¸˜oes de tipo de s´ımbolo de um arquivo ELF . . . 29

(9)

Listagem 1 – Exemplo de um linker script m´ınimo · · · 20

Listagem 2 – Exemplo de uso do comando MEMORY em um linker script · · · 21

Listagem 3 – Exemplo de criac¸˜ao de nova sec¸˜ao no linker script · · · 22

Listagem 4 – Exemplo de declarac¸˜ao de um dado inteiro em uma sec¸˜ao fixa da mem´oria 22 Listagem 5 – Estrutura de um cabec¸alho ELF · · · 25

Listagem 6 – Estrutura de um cabec¸alho de sec¸˜ao ELF · · · 26

Listagem 7 – Estrutura de uma tabela de s´ımbolos ELF · · · 28

Listagem 8 – Leitura de valor de tipo e vinculac¸˜ao · · · 28

Listagem 9 – Definic¸˜ao da estrutura utilizada na API com 3 atributos de acesso aos servic¸os do sistema base · · · 36

Listagem 10 – Camada de abstrac¸˜ao com as redefinic¸˜oes dos atributos da estrutura da API · · · 36

Listagem 11 – Declarac¸˜ao da estrutura da API de acesso · · · 36

Listagem 12 – Estrutura de um aplicativo dinˆamico j´a instalado· · · 40

Listagem 13 – Estrutura de valores de enderec¸o dos c´odigos dos aplicativos instalados · · 40

Listagem 14 – Exemplo de declarac¸˜ao de nova string· · · 43

Listagem 15 – C´alculo da nova posic¸˜ao de uma string no aplicativo · · · 43

Listagem 16 – Estrutura de uma vari´avel global implementada pelo sistema · · · 44

Listagem 17 – Exemplo de definic¸˜ao necess´aria para a instalac¸˜ao de rotinas de interrupc¸˜ao em aplicativos · · · 46

Listagem 18 – Exemplo de instalac¸˜ao de rotinas de interrupc¸˜ao em aplicativos · · · 46

Listagem 19 – C´odigo-fonte adcn - Lˆe da entrada anal´ogica do microcontrolador e con-verte para a sa´ıda de PWM. Para microcontroladores Tiva TM4C1294· · · 70

Listagem 20 – C´odigo-fonte blink - Faz todos os leds oscilarem entre aceso e apagado · · 72

Listagem 21 – C´odigo-fonte ledN - Faz um dos leds oscilar entre aceso e apagado. Para microcontroladores Tiva TM4C1294 · · · 73

(10)

ADC Analog-to-Digital Converter

API Application Programming Interface ARM Advanced RISC Machine

EEPROM Electrically-Erasable Programmable Read Only Memory ELF Executable and Linkable Format

FAT File Allocation Table GCC GNU Compiler Collection GPL GNU General Public License IBM International Business Machines IDE Integrated Development Environment MS-DOS Microsoft Disk Operating System PWM Pulse Width Modulation

RAM Random-Access Memory

RTOS Real Time Operating System SD Secure Digital

SO Sistema Operacional SPI Serial Peripheral Interface TIS Tool Interface Standards

UART Universal Asynchronous Receiver/Transmitter UHS Ultra High Speed

(11)

1 INTRODUC¸ ˜AO . . . 12 1.1 JUSTIFICATIVA . . . 13 1.2 OBJETIVOS . . . 14 1.2.1 Objetivo Geral. . . 14 1.2.2 Objetivos Espec´ıficos . . . 14 1.3 ORGANIZAC¸ ˜AO DO DOCUMENTO . . . 14 2 FUNDAMENTAC¸ ˜AO TE ´ORICA . . . 15

2.1 SISTEMA OPERACIONAL DE TEMPO REAL. . . 15

2.1.1 RTOS em Sistemas Embarcados . . . 15

2.1.2 Estrutura de um RTOS . . . 17

2.2 LINKER . . . 18

2.2.1 Formato de um Linker Script . . . 20

2.3 PADR ˜AO ELF . . . 23 2.3.1 Formato do arquivo . . . 23 2.3.2 Cabec¸alho ELF . . . 25 2.3.3 Sec¸˜oes ELF . . . 25 2.3.4 Sec¸˜oes Especiais. . . 27 2.3.5 Tabela de S´ımbolos . . . 28 2.4 CART ˜AO SD . . . 29

2.4.1 Sistema de Arquivos FAT . . . 30

2.4.2 FatFs. . . 31

2.5 UTILIZAC¸ ˜AO DOS CONHECIMENTOS. . . 32

3 METODOLOGIA. . . 34

3.1 VIS ˜AO GERAL . . . 34

3.2 ETAPAS DO PROJETO . . . 35

3.2.1 Etapa 1 - API de Acesso . . . 35

3.2.2 Etapa 2 - Leitura de arquivo ELF . . . 37

3.2.3 Etapa 3 - Leitura de um Cart˜ao SD. . . 39

3.2.4 Etapa 4 - Gerenciamento dos Aplicativos . . . 40

3.2.5 Etapa 5 - Problemas de referˆencia . . . 42

3.2.5.1 Utilizac¸˜ao de strings . . . 42

3.2.5.2 Criac¸˜ao de vari´aveis globais . . . 43

3.2.5.3 Restric¸˜oes de ponteiros. . . 45

3.2.5.4 Instalac¸˜ao de rotinas de tratamento de interrupc¸˜oes . . . 45

3.3 ARQUIVO DE PORT . . . 47

4 UTILIZANDO O SISTEMA . . . 51

(12)

4.4 CARREGANDO E EXECUTANDO UM APLICATIVO . . . 55 5 RESULTADOS. . . 56 5.1 RECURSOS UTILIZADOS . . . 56 5.2 IMPLEMENTAC¸ ˜AO E TESTES . . . 57 5.3 AN ´ALISE DA IMPLEMENTAC¸ ˜AO . . . 65 6 CONCLUS ˜AO . . . 66 6.1 TRABALHOS FUTUROS . . . 66 REFER ˆENCIAS. . . 68 7 AP ˆENDICES. . . 70 7.1 AP ˆENDICE A. . . 70 7.2 AP ˆENDICE B. . . 72 7.3 AP ˆENDICE C. . . 73

(13)

1 INTRODUC¸ ˜AO

Um sistema embarcado ´e um sistema microcontrolado ou microprocessado dedicado a um prop´osito espec´ıfico e geralmente parte de um sistema maior. Alguns exemplos de siste-mas embarcados s˜ao: o sistema microprocessado usado no controle da mistura ar/combust´ıvel de carburadores automobil´ısticos, softwares embarcados em avi˜oes, controle de fornos micro-ondas, equipamentos m´edicos e ajuste autom´atico de foco de cˆameras (MEGHANATHAN; BASKIYAR, 2005).

Sistemas embarcados s˜ao compostos por hardware, como processador, mem´orias, pe-rif´ericos e por software, podendo esse incluir ou n˜ao um sistema operacional (SO). H´a v´arias definic¸˜oes para um SO. No entanto, suas func¸˜oes b´asicas, tanto em sistemas embarcados quanto em computadores de prop´osito geral, podem ser descritas como o gerenciamento de recursos compartilhados em um sistema computadorizado e o fornecimento de meios de acesso a esses recursos pela aplicac¸˜ao programada (TANENBAUM; WOODHULL, 2009). O n´ucleo super-vis´orio que provˆe os algoritmos base de gerenciamento de recursos, escalonamento de tarefas e l´ogica do SO ´e chamado de n´ucleo (ou no inglˆes, kernel) (LI; YAO, 2003).

Um sistema embarcado que possui metas a atingir em determinados per´ıodos r´ıgidos de tempo ´e chamado de sistema embarcado de tempo real (TAN; TRAN NGUYEN, 2009). Esses tipos de sistema costumam utilizar sistemas operacionais de tempo real (do inglˆes Real Time Operating System, RTOS) para tal prop´osito. Existem implementac¸˜oes de RTOSs de v´arios tamanhos e formas, dos maiores como o VxWorks (WIND RIVER, 2016), aos mais compactos como o ThreadX (EXPRESS LOGIC, 2016).

RTOSs robustos oferecem v´arias aplicac¸˜oes adaptadas dos SOs para desktop. Essas, nor-malmente n˜ao s˜ao encontradas em outros RTOSs mais compactos. Isso se deve ao fato de exe-cutarem c´odigos extensos e, consequentemente, ocuparem uma quantidade maior de mem´oria, ocasionando uma resposta de tempo real mais lenta (CARBONE, 2011).

Na maioria dos casos, a arquitetura de um RTOS de pequeno porte ´e tal que, tanto as rotinas da aplicac¸˜ao quanto as dos servic¸os do RTOS, s˜ao compiladas individualmente e posteriormente ligadas, formando uma ´unica imagem execut´avel. Essa imagem ´e carregada na mem´oria e executada quando o dispositivo ´e ligado. Essa estrutura ´e conhecida como monol´ıtica (MAIA; MACHADO, 2007).

O software que interage diretamente com o hardware de um sistema embarcado, tamb´em chamado de firmware, utiliza dessa abordagem monol´ıtica, pois apresenta maior eficiˆencia quanto ao tempo de execuc¸˜ao e o espac¸o de mem´oria ocupado. Por´em, o sistema perde fle-xibilidade, visto que qualquer mudanc¸a necess´aria na aplicac¸˜ao requer uma nova compilac¸˜ao e uma nova ligac¸˜ao. Al´em disso, o novo arquivo execut´avel precisa ser carregado por inteiro novamente para a mem´oria.

Sistemas operacionais para desktops, como o Windows (MICROSOFT CORPORATION, 2016); o de c´odigo aberto Linux (THE LINUX FOUNDATION, 2016) , dispon´ıvel sob a

(14)

Licenc¸a P´ublica Geral GNU; alguns RTOSs de maior porte, como o VxWorks, citado ante-riormente; e o QNX (QNX SOFTWARE SYSTEMS LIMITED, 2016), mantido por empresa homˆonima, possuem uma arquitetura, pode-se dizer, dividida em “SO/Aplicac¸˜ao” (CARBONE, 2011). Nesses sistemas, h´a um kernel residente contendo todos os servic¸os necess´arios para a inicializac¸˜ao e a execuc¸˜ao do sistema. Ainda provˆe o acesso das aplicac¸˜oes aos recursos de hardware e demais servic¸os necess´arios. Tudo isso numa ´unica imagem execut´avel distinta. Essa imagem inicia o sistema e continua sendo executada durante o tempo em que o sistema estiver ligado, providenciando meios para que as aplicac¸˜oes sejam carregadas dinamicamente no sistema e executadas. Este trabalho tem como finalidade desenvolver uma estrutura baseada nessa abordagem SO/Aplicac¸˜ao, adaptada para sistemas de menor porte, que utilizam RTOSs mais compactos.

1.1 JUSTIFICATIVA

Apesar de uma implementac¸˜ao monol´ıtica ocupar um tamanho menor de mem´oria em uma aplicac¸˜ao embarcada, ela carece de flexibilidade. Com aplicac¸˜oes carreg´aveis dinamicamente, o sistema ´e capaz de aumentar suas funcionalidades utilizando os mesmos recursos de hardware. Em um sistema j´a em funcionamento, essa abordagem proporciona o uso de reconfigurac¸˜oes sob demanda e atualizac¸˜oes de firmware mais seguras.

Aplicac¸˜oes embarcadas que necessitam de atualizac¸˜oes de firmware s˜ao submetidas a ris-cos de integrabilidade do sistema. Como esse deve ser recarregado por completo na mem´oria embarcada, uma parada inesperada durante o processo facilmente resultaria em uma quebra do sistema. M´etodos de prevenc¸˜ao tomados normalmente no momento de uma atualizac¸˜ao, como a suspens˜ao total das tarefas e o uso de baterias na alimentac¸˜ao do sistema, n˜ao seriam mais necess´arios com o uso do sistema proposto.

Na imagem com o kernel contida no sistema, podem haver rotinas que gerenciem o car-regamento das atualizac¸˜oes de firmware. Se houver mem´oria dispon´ıvel, essas atualizac¸˜oes podem ser carregadas em uma nova regi˜ao de mem´oria. Se ocorrida uma queda de energia du-rante o carregamento, ´e poss´ıvel conferir a porc¸˜ao de c´odigo recebida e instalar a nova aplicac¸˜ao ou requerer uma nova atualizac¸˜ao. Ainda, utilizando desta abordagem ´e poss´ıvel manter tarefas paralelas em execuc¸˜ao enquanto ocorre uma atualizac¸˜ao.

(15)

1.2 OBJETIVOS

1.2.1 Objetivo Geral

Implementar um sistema de gerenciamento de aplicac¸˜oes que possibilite a instalac¸˜ao e/ou remoc¸˜ao de pequenas porc¸˜oes do firmware de forma dinˆamica em um sistema embarcado base-ado em um RTOS de pequeno porte.

1.2.2 Objetivos Espec´ıficos

• Desenvolver uma Application Programming Interface (API) que fornec¸a m´etodos de comunicac¸˜ao entre as func¸˜oes do RTOS e as aplicac¸˜oes carreg´aveis dinamicamente. • Criar um m´etodo de extrac¸˜ao da parte execut´avel de um arquivo Executable and Linkable

Format(ELF) e copi´a-la de uma mem´oria externa para a Random-Access Memory (RAM) do microcontrolador.

• Implementar a leitura de um arquivo execut´avel contido em um cart˜ao Secure Digital (SD).

• Implementar um m´etodo de gerenciamento de mem´oria e execuc¸˜ao dos aplicativos car-reg´aveis.

1.3 ORGANIZAC¸ ˜AO DO DOCUMENTO

O documento est´a organizado da seguinte forma. O Cap´ıtulo 2 introduz e revisa conceitos pertinentes ao desenvolvimento do trabalho proposto. Inicialmente ´e apresentado o uso de RTOSs em sistemas embarcados, abordando definic¸˜oes e estruturac¸˜ao. Em seguida, ´e feita uma revis˜ao sobre as fases de um software em C e, s˜ao discutidos t´opicos mais espec´ıficos como o linkere o padr˜ao de arquivos ELF. Ao fim, s˜ao apresentadas algumas definic¸˜oes de cart˜oes SD, como padr˜oes utilizados e sua estrutura de dados.

A metodologia utilizada se encontra no Cap´ıtulo 3, em que s˜ao descritas todas as etapas para o desenvolvimento do projeto e poss´ıveis melhorias futuras. O Cap´ıtulo 4 apresenta a estruturac¸˜ao de arquivos do sistema e o modo como ele deve ser manuseado. J´a no Cap´ıtulo 5, s˜ao listados os recursos de software e hardware utilizados e os resultados obtidos com a implementac¸˜ao e testes do sistema. Por fim, o Cap´ıtulo 6, apresenta a conclus˜ao e poss´ıveis trabalhos futuros e pontos onde o sistema ainda precisa ser melhorado

(16)

2 FUNDAMENTAC¸ ˜AO TE ´ORICA

Neste cap´ıtulo s˜ao revisados os assuntos pertinentes ao desenvolvimento do trabalho. Inicia-se com uma introduc¸˜ao ao uso de RTOSs em sistemas embarcados. Logo ap´os, s˜ao abordadas algumas fundamentac¸˜oes necess´arias sobre o processo de ligac¸˜ao do c´odigo-fonte de um soft-waree uma vis˜ao sobre o formato de arquivos execut´aveis e lig´aveis (do inglˆes Executable and Linkable Format, ELF). Ao fim, s˜ao comentados alguns conceitos referentes ao funcionamento de um cart˜ao SD.

2.1 SISTEMA OPERACIONAL DE TEMPO REAL

Nos primeiros computadores program´aveis a c´odigo, as aplicac¸˜oes eram todas desenvol-vidas a baixo n´ıvel e sem divis˜ao alguma nos programas. Um ´unico c´odigo abrangia desde a inicializac¸˜ao do sistema `a qualquer outra interac¸˜ao com o hardware. Essa integrac¸˜ao muito pr´oxima entre o software e o hardware resultava em c´odigos nada port´aveis entre arquiteturas distintas. Com isso, se fosse necess´ario fazer uma pequena mudanc¸a no hardware, grandes quantias do c´odigo-fonte deveriam ser alteradas. A manutenc¸˜ao desses sistemas era muito cus-tosa e demorada (LI; YAO, 2003).

Com o progresso da ind´ustria de software, fez-se necess´ario um modo de desenvolvimento que facilitasse a manutenc¸˜ao dos sistemas. A partir da evoluc¸˜ao dos m´etodos de implementac¸˜ao surge o sistema operacional, fornecendo ao desenvolvedor uma base de interfaceamento com o hardware. Tal interface permitiu uma maior portabilidade das aplicac¸˜oes desenvolvidas, bem como simplificac¸˜ao na sua manutenc¸˜ao. Al´em disso, foi poss´ıvel dar mais modularidade ao sistema, pois a aplicac¸˜ao agora comec¸ou a ser executada no topo do ambiente do sistema ope-racional e, pˆode ser desenvolvida sem uma preocupac¸˜ao direta com a arquitetura utilizada.

O uso de sistemas operacionais popularizou-se sobre os computadores de prop´osito geral, fazendo que surgissem v´arias vers˜oes desses sistemas ao longo do tempo. Com o in´ıcio da ´epoca chamada “era p´os-PC”(LI; YAO, 2003), o desenvolvimento de eletrˆonicos aumentou e, com isto, os recursos utilizados tamb´em aumentaram. Para suprir a necessidade de um melhor gerenciamento desse hardware no desenvolvimento de sistemas embarcados, surge o RTOS.

2.1.1 RTOS em Sistemas Embarcados

Comumente, autores definem sistemas embarcados como sendo dispositivos sem teclado, tela ou mouse. Tais definic¸˜oes utilizam de caracter´ısticas de aparˆencia como fator de diferenciac¸˜ao para expressar que sistemas embarcados n˜ao s˜ao como computadores pessoais comuns. Uma definic¸˜ao geral pode ser simplificada como: sistemas embarcados s˜ao sistemas de computac¸˜ao

(17)

que possuem uma integrac¸˜ao fortemente acoplada entre hardware e software, com o intuito de cumprir uma func¸˜ao dedicada (LI; YAO, 2003). Portanto, m´ultiplos sistemas embarcados podem coexistir em uma ´unica aplicac¸˜ao.

Sendo assim, o termo sistema embarcado representa uma classe de computadores desen-volvidos para um prop´osito espec´ıfico. Seus recursos s˜ao inteiramente dedicados `a uma, ou a um conjunto pequeno de tarefas. Esse tipo de implementac¸˜ao garante um maior proveito dos recursos, diminui custos, aumenta a agilidade do sistema e, por exigir um espac¸o menor para a aplicac¸˜ao, possibilita a construc¸˜ao de soluc¸˜oes de tamanho m´ınimo e at´e port´ateis.

Um tipo especial de sistema embarcado se distingue de outros por suas exigˆencias de res-postas `a eventos externos em tempo real. Essa categoria ´e classificada por sistemas embarcados de tempo real (LI; YAO, 2003). Um evento externo ´e causado pelo meio em que o sistema embarcado est´a inserido. Tais eventos podem vir sozinhos ou como m´ultiplos eventos e em per´ıodos s´ıncronos ou ass´ıncronos. Um sistema de tempo real, como o representado no es-quema da Figura 1, deve receber esses eventos, trat´a-los e devolver as ac¸˜oes que devem ser tomadas, tudo isso em um per´ıodo de tempo h´abil e limitado, independente do evento de en-trada. O sistema deve possuir um tempo de resposta determin´ıstico.

Figura 1 – Diagrama representativo de um sistema de tempo real Fonte: Li e Yao (2003, p. 10).

Sistemas embarcados que s˜ao desenvolvidos sobre um hardware mais simples e que pos-suem um n´umero reduzido de aplicac¸˜oes normalmente levam implementac¸˜oes que ocupam me-nos mem´oria, com um firmware escrito de forma bem pr´oxima `a linguagem de m´aquina. Isso proporciona um processamento menos elevado e de resposta r´apida. Por´em, por exigir um fun-cionamento muito pr´oximo ao hardware, o desenvolvimento de um sistema embarcado pode ser dif´ıcil, uma vez que ´e necess´ario que o desenvolvedor possua um consider´avel conhecimento sobre os recursos que est˜ao sendo utilizados.

Um sistema operacional de tempo real ´e uma alternativa muito utilizada no desenvolvi-mento de aplicac¸˜oes embarcadas. Esse proporciona uma plataforma pronta j´a idealizada para

(18)

o desenvolvimento de aplicac¸˜oes e, na maioria das vezes, com o m´ınimo de preocupac¸˜ao com o hardware. Em sistemas embarcados com um n´umero moderado de aplicac¸˜oes, ´e interessante o uso de t´ecnicas de escalonamento de tarefas. Os RTOSs j´a implementam soluc¸˜oes para tais requisitos, portanto s˜ao de uso indispens´avel nesses tipos de sistema.

2.1.2 Estrutura de um RTOS

Um RTOS ´e o programa respons´avel por escalonar a execuc¸˜ao de tarefas, gerenciando seus per´ıodos de tempo em execuc¸˜ao e seus acessos aos recursos do sistema. Al´em disso, provˆe uma base consistente para o desenvolvimento de c´odigo de aplicac¸˜oes em plataformas embarcadas (LI; YAO, 2003).

As aplicac¸˜oes de um RTOS podem variar muito, desde um simples rel´ogio despertador a sistemas de maior complexidade e risco, como o controle de navegac¸˜ao de aeronaves. Muitas boas implementac¸˜oes de RTOSs s˜ao escalon´aveis e podem atender a diferentes tipos de requi-sitos para diferentes aplicac¸˜oes. Existem diversas formas de se implementar um RTOS, sendo que algumas delas podem reduzir-se a um n´ucleo. O n´ucleo provˆe os algoritmos m´ınimos de es-calonamento, gerenciamento de mem´oria/recursos e de sincronizac¸˜ao. Al´em do n´ucleo presente em todo RTOS, h´a tamb´em implementac¸˜oes que combinam diferentes m´odulos, como sistemas de arquivos, pilhas de protocolos e demais componentes que podem ser ´uteis dependendo da aplicac¸˜ao.

Implementac¸˜oes comuns de RTOSs podem ser divididas em 3 partes b´asicas como na Fi-gura 2. S˜ao elas (LI; YAO, 2003):

Escalonador (Scheduler) – est´a contido em todos os kernels e segue um conjunto de algorit-mos que determina quando e qual tarefa ser´a executada. Exemplos comuns de algoritalgorit-mos de escalonamento s˜ao o round-robin e o escalonamento preemptivo.

Objetos (Objects) – s˜ao estruturas especiais do kernel e s˜ao ´uteis no desenvolvimento de aplicac¸˜oes de sistemas embarcados de tempo real. Alguns dos mais comuns s˜ao as tarefas, os sem´aforos e as filas.

Servic¸os (Services) – operac¸˜oes que o kernel aplica em um objeto ou, operac¸˜oes comuns como gerenciamentos de tempo, de interrupc¸˜oes e de recursos.

(19)

Figura 2 – Componentes comuns em um kernel de RTOS, incluindo objetos, o escalonador e alguns servic¸os

Fonte: Li e Yao (2003, p. 56).

O desenvolvimento de aplicac¸˜oes utilizando um RTOS ´e feito de modo que, o uso de recursos do sistema pelo programa ´e dado por chamadas de func¸˜oes do kernel. Cada objeto ou servic¸o implementado pelo RTOS ´e disponibilizado em uma biblioteca que deve ser utilizada na codificac¸˜ao da aplicac¸˜ao.

2.2 LINKER

Um software em C possui um ciclo de vida que pode ser dividido em 5 est´agios bem definidos (STEVANOVIC, 2014):

1. Criac¸˜ao do c´odigo-fonte: desenvolvimento do software, escrito em linguagem de progra-mac¸˜ao em formato de texto.

2. Compilac¸˜ao: convers˜ao dos arquivos de texto em bin´ario na linguagem de m´aquina da arquitetura utilizada, chamados de arquivos objeto.

3. Ligac¸˜ao (Linking): junc¸˜ao dos arquivos objeto. Tamb´em ´e respons´avel pelo mapeamento e seccionamento de mem´oria.

4. Carregamento: preparac¸˜ao do hardware para a execuc¸˜ao do programa, copiando sec¸˜oes necess´arias do arquivo execut´avel para a mem´oria e populando registradores.

(20)

5. Execuc¸˜ao: funcionamento do software, mandando os comandos para o processador e gerenciando mem´orias de programa.

Dentre essas fases do software, ´e na de ligac¸˜ao que s˜ao organizados os c´odigos-objeto e as demais informac¸˜oes para a gerac¸˜ao dos arquivos de sa´ıda necess´arios `a execuc¸˜ao. A Figura 3 apresenta um esquema da evoluc¸˜ao de um software partindo de seu c´odigo-fonte e chegando no arquivo de sa´ıda.

Figura 3 – Esquema do processo de compilac¸˜ao e ligac¸˜ao de um c´odigo-fonte Fonte: Li e Yao (2003, p. 20).

Um programa ´e composto pelos c´odigos-fonte e pelos arquivos de cabec¸alho. O modo como esse c´odigo fonte ´e compilado e constru´ıdo pode ser descrito em um Makefile, um script que configura os s´ımbolos e opc¸˜oes de compilac¸˜ao e invoca o compilador. A partir dos arquivos fonte, o compilador e o assembler produzem c´odigos-objeto contendo c´odigos bin´arios em

(21)

linguagem de m´aquina e dados de programa. Podem ser geradas bibliotecas est´aticas para o programa utilizando um arquivador (Archive utility). Ao fim da construc¸˜ao dos arquivos eles s˜ao ligados, e deles s˜ao retirados os arquivos necess´arios para o carregamento e execuc¸˜ao do software(LI; YAO, 2003).

Essa fase de ligac¸˜ao ´e executada pelo linker e arquitetada pelo arquivo de comandos do linker(Linker Command File) ou linker script. O linker script tem como principal prop´osito mapear os c´odigos-objeto dentro do arquivo de sa´ıda e controlar o layout da mem´oria na imagem do programa (CHAMBERLAIN; TAYLOR, 2009). O arquivo de sa´ıda gerado ´e um arquivo objeto e tamb´em ´e chamado de arquivo execut´avel.

No processo de ligac¸˜ao s˜ao resolvidas as dependˆencias dos arquivos do c´odigo-fonte, ou seja, as chamadas de func¸˜oes, mem´orias globais e locais, arrays de caracteres e tudo o mais que possa estar sendo chamado em um arquivo do c´odigo-fonte e n˜ao possua uma ligac¸˜ao direta com o mesmo.

2.2.1 Formato de um Linker Script

Sendo um arquivo de texto, um linker script ´e escrito como uma s´erie de comandos. Cada comando ´e ou uma palavra-chave, podendo conter argumentos em seguida, ou uma atribuic¸˜ao a algum s´ımbolo. Os comandos podem ser separados com v´ırgula e os espac¸os em branco s˜ao geralmente ignorados (CHAMBERLAIN; TAYLOR, 2009).

O linker script mais simples poss´ıvel, no padr˜ao utilizado pelo GNU Compiler Collection (GCC), ´e mostrado na Listagem 1 e cont´em apenas um comando: SECTIONS. Esse ´e usado para descrever o layout da mem´oria do arquivo de sa´ıda.

1 SECTIONS 2 { 3 . = 0x10000 ; 4 . text : { ∗ ( . text ) } 5 . = 0x8000000 ; 6 . data : { ∗ ( . data ) } 7 . bss : { ∗ ( . bss ) } 8 }

Listagem 1 – Exemplo de um linker script m´ınimo

Os s´ımbolos ‘.text’, ‘.data’ e ‘.bss’ representam sec¸˜oes especiais e contˆem, res-pectivamente: c´odigos, dados inicializados e dados n˜ao inicializados. O s´ımbolo especial ‘.’ representa o contador da posic¸˜ao atual no arquivo. No in´ıcio da sec¸˜ao esse valor ´e zero. A pri-meira linha dentro do comando SECTIONS no exemplo atribui o valor hexadecimal 0x10000 ao contador. Portanto, a primeira sec¸˜ao iniciar´a nesse enderec¸o do arquivo de sa´ıda. Tal sec¸˜ao ´e declarada na segunda linha.

A declarac¸˜ao da sec¸˜ao leva o nome da sec¸˜ao seguido por ‘:’ e entre as chaves o nome de todas as sec¸˜oes dos arquivos de entrada do linker que ser˜ao alocadas nessa sec¸˜ao do arquivo de

(22)

sa´ıda. O uso dos parˆenteses precedidos por ‘*’ em torno do nome da sec¸˜ao, faz com que todas as sec¸˜oes presentes nos arquivos de entrada que contenham esse nome sejam selecionadas. A sec¸˜ao de dados inicializados (.data) ´e criada na posic¸˜ao 0x8000000 do arquivo de sa´ıda, seguida pela sess˜ao de dados n˜ao inicializados (.bss).

Por padr˜ao, o linker pode acessar toda a mem´oria dispon´ıvel. ´E poss´ıvel descrever blocos de mem´oria, tornando-os acess´ıveis ao linker ou n˜ao, atrav´es do comando MEMORY. A Listagem 2 mostra um exemplo de uso desse comando. No exemplo, a mem´oria acess´ıvel ´e dividida em dois blocos: FLASH e SRAM.

1 MEMORY

2 {

3 FLASH ( RX ) : ORIGIN = 0x00000000 , LENGTH = 0x00100000

4 SRAM ( WX ) : ORIGIN = 0x20000000 , LENGTH = 0x00040000

5 }

Listagem 2 – Exemplo de uso do comando MEMORY em um linker script

Semelhante ao comando SECTIONS, o comando MEMORY ´e seguido de chaves quando possui mais de um comando interno. O padr˜ao de declarac¸˜ao de um bloco de mem´oria inicia com o nome que deseja-se atribuir a esse, que pode ser qualquer palavra que n˜ao esteja reser-vada. No exemplo, ‘FLASH’ e ‘SRAM’. Em seguida, entre parˆenteses, encontram-se os atributos do bloco de mem´oria. Esses n˜ao s˜ao obrigat´orios. Os valores poss´ıveis para esses atributos s˜ao: R Sec¸˜ao apenas de leitura

W Sec¸˜ao de leitura e escrita X Sec¸˜ao execut´avel

A Sec¸˜ao alocada I Sec¸˜ao inicializada

L O mesmo que I

! Inverte o sentido de qualquer um dos s´ımbolos anteriores

Ap´os ‘:’, ´e indicada a posic¸˜ao de origem da regi˜ao de mem´oria, ou seja, o enderec¸o em que se inicia o bloco de mem´oria, atrav´es da palavra-chave ORIGIN. Separada por uma v´ırgula, a palavra-chave LENGTH indica o tamanho que o bloco de mem´oria ocupa a partir do enderec¸o de origem.

´

E poss´ıvel criar um pseudˆonimo que represente um desses blocos de mem´oria declarados, atrav´es do comando REGION ALIAS. Assim, deixando o script mais intelig´ıvel. Para criar, por exemplo, um “apelido” nomeado ‘minha regiao’ a regi˜ao FLASH, o comando fica:

REGION ALIAS("minha regiao", FLASH);

H´a ainda, como definir s´ımbolos de referˆencia com valores atribu´ıdos. Tais s´ımbolos s˜ao v´alidos somente internamente ao conjunto de chaves em que foram criados. A criac¸˜ao de tais s´ımbolos ´e poss´ıvel atrav´es do comando PROVIDE. Esse recebe o nome do s´ımbolo e o valor

(23)

que lhe ser´a atribu´ıdo. Por exemplo, a declarac¸˜ao do s´ımbolo ‘meu simbolo’, que representa o valor hexadecimal 0x10, ´e feita da seguinte forma:

PROVIDE(meu simbolo = 0x10);

Um exemplo de criac¸˜ao de uma sec¸˜ao fixa em um enderec¸o de mem´oria ´e mostrado na Listagem 3. A sec¸˜ao .minha secao ´e criada na posic¸˜ao de mem´oria 0x000F0000, no caso, na mem´oria FLASH, apelidada de ‘MINHA REGIAO’.

1 MEMORY

2 {

3 FLASH ( RX ) : ORIGIN = 0x00000000 , LENGTH = 0x00100000

4 . . .

5 }

6

7 REGION_ALIAS(”MINHA REGIAO”, FLASH ) ;

8 9 SECTIONS { 10 PROVIDE ( _endereco_minha_secao = 0x000F0000 ) ; 11 12 . minha_secao : AT ( _endereco_minha_secao ) { 13 KEEP( ∗ ( . secao_qualquer ) ) 14 } > MINHA_REGIAO 15 16 . . . 17 }

Listagem 3 – Exemplo de criac¸˜ao de nova sec¸˜ao no linker script

Ao caso de n˜ao ser referenciada nenhuma sec¸˜ao dos arquivos de entrada do linker para popular a sec¸˜ao .minha secao no arquivo de sa´ıda, ´e mantida uma sec¸˜ao padr˜ao nomeada de .secao qualquer que sempre existir´a mesmo que n˜ao seja declarada. Isso ´e poss´ıvel atrav´es do comando KEEP que recebe o nome da sec¸˜ao padr˜ao como parˆametro.

´

E poss´ıvel atribuir um tipo de dado criado no c´odigo-fonte diretamente em uma sess˜ao, declarando-o como um atributo dessa sec¸˜ao. Para tal prop´osito, no compilador GCC ´e utilizada a palavra-chave atribute antes da declarac¸˜ao. A criac¸˜ao de um dado do tipo inteiro, nomeado de meuInteiro dentro da sec¸˜ao .minha secao ´e mostrada na Listagem 4 como exemplo.

1 __attribute__( ( section (” . m i n h a s e c a o ”) ) )

2 i n t meuInteiro = 4 2 ;

Listagem 4 – Exemplo de declarac¸˜ao de um dado inteiro em uma sec¸˜ao fixa da mem´oria

Al´em dessas informac¸˜oes, um linker script pode conter v´arias outras informac¸˜oes ´uteis. Para uma consulta mais ampla sobre o formato, aconselha-se a leitura dos documento de especifi-cac¸˜ao, que podem ser encontrados em Chamberlain e Taylor (2009).

(24)

2.3 PADR ˜AO ELF

O arquivo objeto gerado ap´os o processo de ligac¸˜ao do programa precisa seguir um mo-delo espec´ıfico. Um padr˜ao fortemente utilizado, tanto pelo GCC como tamb´em por outros compiladores, ´e o padr˜ao ELF. Originalmente desenvolvido e publicado pela UNIX System Laboratories(USL), o padr˜ao ELF foi selecionado pela Tool Interface Standards (TIS) como um formato de arquivo de objetos port´avel e hoje trabalha em v´arias arquiteturas para v´arios sistemas operacionais (TIS COMMITTEE, 1995).

Por ser gerado como formato de sa´ıda no desenvolvimento do firmware de v´arias arquite-turas e, possuir uma estrutura de organizac¸˜ao que possibilita que a parte execut´avel do c´odigo seja extra´ıda separadamente, o padr˜ao ELF adapta-se muito bem `a proposta desse trabalho e, portanto, ser´a utilizado como formato do aplicativo dinˆamico.

O padr˜ao ELF foi desenvolvido para simplificar o desenvolvimento de software. Sua es-trutura e conte´udo proporcionam uma interface bin´aria que se estende por v´arios ambientes operacionais, diminuindo a necessidade de diferentes implementac¸˜oes para diferentes sistemas e ainda reduzindo o processo de reformulac¸˜ao e recompilac¸˜ao do c´odigo.

2.3.1 Formato do arquivo

Por ser um arquivo objeto, o arquivo ELF tem envolvimento tanto com a ligac¸˜ao do pro-grama quanto com sua execuc¸˜ao. Portanto, conv´em adotar duas vis˜oes paralelas sobre seu conte´udo, como mostrado na Figura 4, uma para cada diferente necessidade desses processos envolvidos. Pelo uso do arquivo ELF ser amplo no processo de gerac¸˜ao de um software, ele possui v´arias informac¸˜oes que s˜ao desnecess´arias para este trabalho. Por esse motivo, ser˜ao focados aqui somente os dados pertinentes ao trabalho em quest˜ao. Para mais informac¸˜oes ´e recomendada a leitura dos documentos de especificac¸˜ao que podem ser encontrados em TIS Committee (1995).

(25)

_ _____________________ _ ______________________ _ _____________________ _ ______________________ _ _____________________ _ ______________________ _ _____________________ _ _____________________ _ ______________________ _ _____________________ _ _____________________ _ ______________________ . . . . . . _ _____________________ _ ______________________ _ _____________________ _ ______________________                                                        

Cabeçalhos de Programa Cabeçalhos de Programa opcional

Seção 1

Seção n

Cabeçalhos de Seção Cabeçalhos de Seção Segmento 2 Segmento 1 Cabeçalho ELF Cabeçalho ELF

Visão de Ligação Visão de Execução

opcional

Figura 4 – Visualizac¸˜ao da estrutura de um arquivo ELF pelo processo de ligac¸˜ao e pelo de execuc¸˜ao

Fonte: TIS Committee (1995, p. 1).

O cabec¸alho ELF (ELF header) situa-se no in´ıcio do arquivo e cont´em informac¸˜oes que descrevem o mapeamento das partes do arquivo. As sec¸˜oes (sections) carregam os arquivos objeto gerados no processo de ligac¸˜ao. Podem conter instruc¸˜oes, dados, tabelas de s´ımbolos e outras informac¸˜oes necess´arias para o funcionamento do software. Os segmentos (segments) s˜ao compostos por uma ou mais sec¸˜oes que s˜ao agrupadas na forma em que devem ser copiadas para a mem´oria na hora da execuc¸˜ao do programa. Se dispon´ıvel, a tabela de cabec¸alho de programa (program header table) cont´em a descric¸˜ao dos segmentos e auxilia na criac¸˜ao da imagem de processo na execuc¸˜ao do programa. Por fim, a tabela de cabec¸alho de sec¸˜ao (section header table) descreve as sec¸˜oes do arquivo e ´e utilizada em tempo de ligac¸˜ao dos objetos.

Para arquiteturas de 32 bits os dados de um arquivo ELF s˜ao representados como no Qua-dro 1. S˜ao utilizados somente esses tipos de dado em todo o contexto do arquivo.

Nome Bytes Tipo standard Prop´osito

Elf32 Addr 4 unsigned long Enderec¸o de programa Elf32 Half 2 unsigned short Inteiro m´edio sem sinal Elf32 Off 4 unsigned long Deslocamento no arquivo Elf32 Sword 4 signed long Inteiro grande com sinal Elf32 Word 4 unsigned long Inteiro grande sem sinal unsigned char 1 unsigned char Inteiro pequeno sem sinal

Quadro 1 – Tipos de dado de um arquivo ELF para arquiteturas de 32 bits Fonte: TIS Committee (1995, p. 2)

Por ser idealizado para ser um arquivo port´avel e ´unico tanto em tempo de ligac¸˜ao como de execuc¸˜ao, um arquivo ELF possui v´arias informac¸˜oes que podem n˜ao ser relevantes dependendo da aplicac¸˜ao proposta. Para este trabalho, somente algumas partes do arquivo s˜ao ´uteis. Tais partes s˜ao descritas a seguir.

(26)

2.3.2 Cabec¸alho ELF

O cabec¸alho de um arquivo ELF 32 bits possui tamanho e estrutura fixos, sendo assim, pode ser lido como uma struct em C. A declarac¸˜ao de tal estrutura pode ser vista na Listagem 5.

1 # d e f i n e EI NIDENT 16

2

3 t y p e d e f s t r u c t {

4 u n s i g n e d c h a r e_ident [ EI_NIDENT ] ; / ∗ Magic number and o t h e r i n f o ∗ / 5 Elf32_Half e_type; / ∗ O b j e c t f i l e t y p e ∗ / 6 Elf32_Half e_machine; / ∗ A r c h i t e c t u r e ∗ / 7 Elf32_Word e_version; / ∗ O b j e c t f i l e v e r s i o n ∗ / 8 Elf32_Addr e_entry; / ∗ E n t r y p o i n t v i r t u a l a d d r e s s ∗ / 9 Elf32_Off e_phoff; / ∗ P r o g r a m h e a d e r t a b l e f i l e o f f s e t ∗ / 10 Elf32_Off e_shoff; / ∗ S e c t i o n h e a d e r t a b l e f i l e o f f s e t ∗ / 11 Elf32_Word e_flags; / ∗ P r o c e s s o r − s p e c i f i c f l a g s ∗ /

12 Elf32_Half e_ehsize; / ∗ ELF h e a d e r s i z e i n b y t e s ∗ /

13 Elf32_Half e_phentsize; / ∗ P r o g r a m h e a d e r t a b l e e n t r y s i z e ∗ / 14 Elf32_Half e_phnum; / ∗ P r o g r a m h e a d e r t a b l e e n t r y c o u n t ∗ / 15 Elf32_Half e_shentsize; / ∗ S e c t i o n h e a d e r t a b l e e n t r y s i z e ∗ / 16 Elf32_Half e_shnum; / ∗ S e c t i o n h e a d e r t a b l e e n t r y c o u n t ∗ / 17 Elf32_Half e_shstrndx; / ∗ S e c t i o n h e a d e r s t r i n g t a b l e i n d e x ∗ / 18 } Elf32_Ehdr ;

Listagem 5 – Estrutura de um cabec¸alho ELF

A estrutura do cabec¸alho possui algumas informac¸˜oes sobre o tipo do arquivo como flags de vers˜ao e arquitetura para qual o arquivo fora compilado. Al´em disso, informa posic¸˜oes de enderec¸o de in´ıcio de algumas partes do arquivo, bem como os tamanhos que ocupam na mem´oria. Ainda ´e informado o enderec¸o em que o programa deve ser iniciado em sua execuc¸˜ao. As partes do cabec¸alho que ser˜ao ´uteis para este trabalho s˜ao aquelas que descrevem a tabela de cabec¸alhos de sec¸˜ao do arquivo. S˜ao elas:

e shoff enderec¸o de in´ıcio da tabela de cabec¸alhos de sec¸˜ao no arquivo ELF. e shentsize tamanho em bytes de cada cabec¸alho de sec¸˜ao na tabela. e shnum quantidade de cabec¸alhos de sec¸˜ao na tabela do arquivo ELF.

e shstrndx n´umero da sec¸˜ao que cont´em a tabela com os nomes de cada sec¸˜ao.

2.3.3 Sec¸˜oes ELF

Uma sec¸˜ao ELF ´e um arquivo objeto ou de texto que cont´em partes ou informac¸˜oes impor-tantes `a ligac¸˜ao ou execuc¸˜ao do programa. Func¸˜oes declaradas no c´odigo-fonte do programa s˜ao compiladas para arquivos objeto e alocadas cada uma em uma sec¸˜ao diferente do arquivo ELF.

(27)

Por possu´ırem informac¸˜oes variadas, as sec¸˜oes podem ter diferentes tamanhos e tipos. Para o controle delas ser poss´ıvel, um arquivo ELF possui uma tabela composta por estruturas chamadas de cabec¸alhos de sec¸˜ao. Essa tabela na verdade ´e um vetor de estruturas como as descritas na Listagem 6. A posic¸˜ao de enderec¸o inicial dessa tabela ´e dada por e shoff. Ela ´e formada por e shnum estruturas de tamanho e shentsize bytes. O primeiro cabec¸alho de sec¸˜ao da tabela ´e sempre nulo.

1 t y p e d e f s t r u c t {

2 Elf32_Word sh_name; / ∗ S e c t i o n name ( s t r i n g t b l i n d e x ) ∗ / 3 Elf32_Word sh_type; / ∗ S e c t i o n t y p e ∗ / 4 Elf32_Word sh_flags; / ∗ S e c t i o n f l a g s ∗ / 5 Elf32_Addr sh_addr; / ∗ S e c t i o n v i r t u a l a d d r a t e x e c u t i o n ∗ / 6 Elf32_Off sh_offset; / ∗ S e c t i o n f i l e o f f s e t ∗ / 7 Elf32_Word sh_size; / ∗ S e c t i o n s i z e i n b y t e s ∗ / 8 Elf32_Word sh_link; / ∗ L i n k t o a n o t h e r s e c t i o n ∗ / 9 Elf32_Word sh_info; / ∗ A d d i t i o n a l s e c t i o n i n f o r m a t i o n ∗ / 10 Elf32_Word sh_addralign; / ∗ S e c t i o n a l i g n m e n t ∗ / 11 Elf32_Word sh_entsize; / ∗ E n t r y s i z e i f s e c t i o n h o l d s t a b l e ∗ / 12 } Elf32_Shdr ;

Listagem 6 – Estrutura de um cabec¸alho de sec¸˜ao ELF

Uma das sec¸˜oes existentes em um arquivo ELF ´e dedicada `a guardar o nome das sec¸˜oes em modo de texto (strings) e organizada em formato de string table. A posic¸˜ao dessa sec¸˜ao na tabela de sec¸˜oes ´e dada pelo valor e shstrndx. Uma string table ´e composta por um conjunto de nomes separados pelo byte ’\0’ de fim de string e tamb´em possui esse s´ımbolo em seu in´ıcio. Um exemplo de string table pode ser visto na Figura 5 ao lado de uma tabela representando cada string nela contida.

+ 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 ______________________________________________________ 0 ______________________________________________________\0 n a m e . \0 V a r 10 ______________________________________________________i a b l e \0 a b l e 20 ______________________________________________________ \0 \0 x x \0                                            String _ _________________ 0 none 1 name. 7 Variable 11 able 16 able 24 null string _ _________________        Índice Índice

Figura 5 – Exemplo de sec¸˜ao do tipo string table de um arquivo ELF Fonte: TIS Committee (1995, p. 16).

Uma estrutura de cabec¸alho de sec¸˜ao descreve, basicamente, como uma sec¸˜ao est´a alocada no arquivo ELF e quais e que tipos de informac¸˜ao ela cont´em. Dentre os v´arios dados existentes num cabec¸alho de sec¸˜ao, os pertinentes a este trabalho s˜ao destacados a seguir:

sh name posic¸˜ao na string table de cabec¸alhos de sec¸˜ao em que inicia a string que cont´em o nome da sec¸˜ao.

sh type constante que representa o tipo da sec¸˜ao. Os principais valores e suas definic¸˜oes s˜ao descritos no Quadro 2. Al´em destes, h´a outros valores padr˜ao que podem ser usados e ainda h´a um conjunto de valores reservados para assinalar uma sec¸˜ao como de um tipo espec´ıfico de processador ou arquitetura.

(28)

sh offset enderec¸o de in´ıcio da sec¸˜ao no arquivo ELF. sh size tamanho da sec¸˜ao em bytes.

Definic¸˜ao Valor Descric¸˜ao

SHT NULL 0 Sec¸˜ao inativa. Cont´em valores indefinidos

SHT PROGBITS 1 Sec¸˜ao com informac¸˜oes com sentido definido pelo programa SHT SYMTAB 2 Sec¸˜ao contendo uma tabela de s´ımbolos

SHT STRTAB 3 Sec¸˜ao contendo uma string table

SHT DYNAMIC 6 Sec¸˜ao contendo informac¸˜oes de ligac¸˜ao dinˆamica

SHT NOTE 7 Sec¸˜ao com informac¸˜oes de algum tipo de marcac¸˜ao do arquivo SHT NOBITS 8 Sec¸˜ao n˜ao ocupa espac¸o

Quadro 2 – Definic¸˜oes de tipo (sh type) de um arquivo ELF Fonte: TIS Committee (1995, p. 2)

2.3.4 Sec¸˜oes Especiais

As sec¸˜oes de um arquivo ELF podem levar nomes variados dependendo do compilador, da arquitetura ou at´e mesmo da aplicac¸˜ao. Alguns nomes de sec¸˜ao s˜ao padronizados e indicam que a sec¸˜ao possui fins espec´ıficos na montagem da imagem de mem´oria constru´ıda na execuc¸˜ao. As sec¸˜oes especiais mais comuns s˜ao listadas no Quadro 3.

Nome Tipo Descric¸˜ao

.bss SHT NOBITS Marca dados n˜ao inicializados do programa .comment SHT PROGBITS Cont´em informac¸˜oes de controle de vers˜ao .data SHT PROGBITS Cont´em dados inicializados do programa .data1 SHT PROGBITS Complemento de .data

.debug SHT PROGBITS Cont´em informac¸˜oes de debug

.dynamic SHT DYNAMIC Cont´em informac¸˜oes de ligac¸˜ao dinˆamica

.fini SHT PROGBITS C´odigos executados ao fim da execuc¸˜ao do programa .init SHT PROGBITS C´odigos executados na inicializac¸˜ao do programa .note SHT NOTE Informac¸˜oes de compatibilidade e checagem .rodata SHT PROGBITS Cont´em dados do tipo somente leitura (constantes) .rodata1 SHT PROGBITS Complemento de .rodata

.shstrtab SHT STRTAB Cont´em string table com o nome das sec¸˜oes .strtab SHT STRTAB Cont´em string table com o nome dos s´ımbolos .symtab SHT SYMTAB Cont´em a tabela de s´ımbolos do programa .text SHT PROGBITS Cont´em o ”texto”execut´avel do programa

Quadro 3 – Principais sec¸˜oes especiais de um arquivo ELF Fonte: TIS Committee (1995, p. 2)

(29)

2.3.5 Tabela de S´ımbolos

Uma tabela de s´ımbolos ELF ´e uma sec¸˜ao que guarda informac¸˜oes necess´arias para a alocac¸˜ao e realocac¸˜ao de definic¸˜oes e referˆencias simb´olicas do programa. Tal tabela ´e formada por estruturas tais como a mostrada na Listagem 7. A primeira estrutura da tabela ´e sempre nula. Cada valor da tabela ´e descrito a seguir.

1 t y p e d e f s t r u c t {

2 Elf32_Word st_name; / ∗ Symbol name ( s t r i n g t b l i n d e x ) ∗ / 3 Elf32_Addr st_value; / ∗ Symbol v a l u e ∗ /

4 Elf32_Word st_size; / ∗ Symbol s i z e ∗ /

5 u n s i g n e d c h a r st_info ; / ∗ Symbol t y p e and b i n d i n g ∗ / 6 u n s i g n e d c h a r st_other ; / ∗ Symbol v i s i b i l i t y ∗ /

7 Elf32_Half st_shndx; / ∗ S e c t i o n i n d e x ∗ / 8 } Elf32_Sym ;

Listagem 7 – Estrutura de uma tabela de s´ımbolos ELF

st name posic¸˜ao na string table de s´ımbolos em que inicia a string que cont´em o nome do s´ımbolo. Se o valor for nulo o s´ımbolo n˜ao possui nome.

sh value valor associado ao s´ımbolo. Dependendo do tipo de s´ımbolo, esse valor pode ser um valor absoluto, um enderec¸o ou outro tipo de informac¸˜ao.

st size valor associado ao tamanho do s´ımbolo. Se o valor for nulo o s´ımbolo possui tama-nho nulo ou desconhecido.

st info especifica atributos de tipo (type) ou vinculac¸˜ao (binding) do s´ımbolo. Os valores s˜ao manipulados da forma mostrada na Listagem 8. As definic¸˜oes de tipo s˜ao mostradas no Quadro 4 e as de vinculac¸˜ao no Quadro 5

st other normalmente cont´em valor nulo e n˜ao possui significado definido. st shndx n´umero da sec¸˜ao ao qual o s´ımbolo est´a relacionado.

1 / ∗ How t o e x t r a c t and i n s e r t i n f o r m a t i o n h e l d i n t h e s t i n f o f i e l d . ∗ / 2 # d e f i n e ELF32 ST BIND ( v a l ) ( ( ( u n s i g n e d c h a r ) ( v a l ) ) >> 4 )

3 # d e f i n e ELF32 ST TYPE ( v a l ) ( ( v a l ) & 0 x f )

4 # d e f i n e ELF32 ST INFO ( b i n d , t y p e ) ( ( ( b i n d ) << 4 ) + ( ( t y p e ) & 0 x f ) )

(30)

Definic¸˜ao Valor Descric¸˜ao STT NOTYPE 0 Tipo n˜ao especificado

STT OBJECT 1 Objeto de dados, como uma vari´avel, um vetor, etc. STT FUNC 2 Associado `a uma func¸˜ao ou outro c´odigo execut´avel

STT SECTION 3 S´ımbolo associado com uma sec¸˜ao. Normalmente usado em realocac¸˜oes.

STT FILE 4 Nome do arquivo associado ao arquivo objeto

STT LOPROC 13 In´ıcio de intervalo reservado para definic¸˜oes espec´ıficas de pro-cessador

STT HIPROC 15 Fim de intervalo reservado para definic¸˜oes espec´ıficas de proces-sador

Quadro 4 – Definic¸˜oes de tipo de s´ımbolo de um arquivo ELF Fonte: TIS Committee (1995, p. 19)

Definic¸˜ao Valor Descric¸˜ao

STB LOCAL 0 S´ımbolo vis´ıvel somente no arquivo objeto em que ´e criado STB GLOBAL 1 S´ımbolo vis´ıvel em todo os arquivos objetos

STB WEAK 2 Semelhante ao STB GLOBAL mas com definic¸˜oes de menor pre-cedˆencia

STB LOPROC 13 In´ıcio de intervalo reservado para definic¸˜oes espec´ıficas de proces-sador

STB HIPROC 15 Fim de intervalo reservado para definic¸˜oes espec´ıficas de proces-sador

Quadro 5 – Definic¸˜oes de vinculac¸˜ao (bind) de s´ımbolo de um arquivo ELF Fonte: TIS Committee (1995, p. 18)

Conhecendo a estruturac¸˜ao do arquivo ELF ´e poss´ıvel encontrar os blocos de byte que guardam os comandos de cada func¸˜ao, inclusive a main. Com isso, utilizando da mesma arquitetura, ´e poss´ıvel instalar novas func¸˜oes em um sistema j´a em execuc¸˜ao extraindo esses blocos do arquivo e carregando para a mem´oria.

2.4 CART ˜AO SD

O Secure Digital (SD) ´e um formato de cart˜ao de mem´oria n˜ao vol´atil desenvolvido pela Associac¸˜ao SD Card (SD CARD ASSOCIATION, 2016) e que ´e amplamente usado em aplica-c¸˜oes que demandem o uso de mem´orias port´ateis por ser um m´etodo seguro, de implementac¸˜ao simples e proporcionar consider´avel capacidade de armazenamento e desempenho. Um cart˜ao SD ´e um dispositivo Flash, uma variac¸˜ao da Electrically-Erasable Programmable Read Only

(31)

Memory(EEPROM) tradicional. A principal diferenc¸a, al´em da taxa de escrita e leitura, ´e que na EEPROM ´e poss´ıvel apagar 1 byte em espec´ıfico e na Flash deve-se apagar um bloco de mem´oria. A gravac¸˜ao e eliminac¸˜ao de dados ´e feita eletricamente e n˜ao ´e necess´ario o uso de fontes externas de energia para garantir o armazenamento dos dados (SD GROUP; SD CARD ASSOCIATION, 2013).

O padr˜ao utilizado no cart˜ao SD oferece trˆes m´etodos poss´ıveis de acesso. Os protocolos SD Bus e Ultra High Speed (UHS) Bus, criados exclusivamente para o padr˜ao SD, prometem maior desempenho no acesso aos dados na mem´oria do cart˜ao. Por´em, muitos microcontro-ladores/processadores n˜ao possuem o perif´erico que possibilite o uso desses padr˜oes e, ainda, ocupam um n´umero maior de pinos. Como um modo secund´ario, o protocolo Serial Peripheral Interface(SPI) pode ser usado para a comunicac¸˜ao f´ısica com o cart˜ao.

H´a uma queda de desempenho na troca do protocolo padr˜ao de acesso ao cart˜ao SD, que possui 4 vias paralelas de dados, pelo SPI, que possui somente uma. Por´em, destaca-se a vanta-gem de que, utilizando ele, ´e poss´ıvel criar uma comunicac¸˜ao a partir da maioria dos microcon-troladores existentes, com menor esforc¸o por parte do programador e menos mem´oria utilizada. Isso ´e poss´ıvel pois, atualmente, o barramento SPI ´e encontrado por padr˜ao em praticamente todas as plataformas microcontroladas. A Figura 6 ilustra a configurac¸˜ao m´ınima necess´aria de barramento para a conex˜ao do microcntrolador ao cart˜ao SD.

MCU

SD

CS SCLK DI DO SCLK GPIO MOSI MISO SPI RPU

Figura 6 – Barramento m´ınimo da SPI entre o micro-controlador e o cart˜ao SD

Fonte: Chan (2016).

2.4.1 Sistema de Arquivos FAT

Os dados do cart˜ao SD, fazem uso da estrutura de um sistema de arquivos para o controle de armazenamento, leitura e gravac¸˜ao de seus dados. Um padr˜ao comumente utilizado ´e o File Allocation Table(FAT), por ser acess´ıvel e oferecer simplicidade e relativa robustez. O sistema de arquivos FAT utiliza de um m´etodo de organizac¸˜ao dos dados bem como especifica o seu nome: uma tabela de alocac¸˜ao de arquivos. Os dados s˜ao paginados em blocos de mesmo ta-manho, chamados de clusters, e no in´ıcio do volume de mem´oria encontra-se uma tabela que cont´em a localizac¸˜ao de todos os dados contidos dentro desse volume (MICROSOFT CORPO-RATION, 2000).

(32)

O padr˜ao FAT teve origem no fim da d´ecada de 1970 e foi originalmente desenvolvido para arquiteturas de computadores pessoais International Business Machines (IBM) atuando como o sistema de arquivos padr˜ao do sistema operacional Microsoft Disk Operating System (MS-DOS). Inicialmente suportava discos de mem´oria menores que 500 KB e, com o passar do tempo, fora aprimorado para suportar m´ıdias de tamanhos cada vez maiores e com menores desperd´ıcios.

Os trˆes formatos mais conhecidos de FAT s˜ao o FAT12, FAT16 e o FAT32. S˜ao padr˜oes que foram sendo desenvolvidos sobre o FAT padr˜ao ao passar do tempo, conforme as necessidades de armazenamento. Basicamente, a diferenc¸a entre cada um est´a no tamanho da representac¸˜ao do enderec¸o dos clusters na tabela FAT. Assim, utilizam enderec¸os de 12, 16 e 32 bits respecti-vamente (MICROSOFT CORPORATION, 2000).

A gravac¸˜ao de um arquivo no sistema FAT ´e feita de forma que o arquivo ´e dividido em um n´umero de clusters que possibilite seu armazenamento. Por exemplo, em um sistema FAT com clusters de 32 KB, um arquivo de 34 KB ocuparia dois desses para ser armazenado. Um com 32 KB e outro com os 2 KB restantes. Levando ao desperd´ıcio de 30 KB do volume.

Um volume de mem´oria FATn (sendo n a vers˜ao do sistema de arquivos) pode possuir no m´aximo 2nclusters. Se esse volume for de um tamanho relativamente grande, ´e necess´ario que os clusters tenham tamb´em um tamanho relativamente grande para poder cobrir toda sua ex-tens˜ao de mem´oria. Por´em, quanto maior o tamanho dos clusters, maior ´e a perda de mem´oria. Por esse motivo, o padr˜ao comumente utilizado em sistemas FAT ´e o FAT32, que possibilita um n´umero maior de clusters, fazendo que esses sejam de tamanhos menores e ainda cubram todo o volume necess´ario, com menos desperd´ıcio (MICROSOFT CORPORATION, 2007).

2.4.2 FatFs

Apesar da simplicidade do sistema de arquivos FAT, a implementac¸˜ao do controle de tal formato pode ser extensa e um tanto complicada, por conta do n´umero de informac¸˜oes envol-vidas. Por esse motivo, v´arias aplicac¸˜oes utilizam de m´odulos de sistemas de arquivos FAT dispon´ıveis tanto comercialmente, quanto de forma gratuita e com c´odigo aberto. Um desses ´e o FatFs (CHAN, 2016).

(33)

Figura 7 – Posic¸˜ao do m´odulo FatFs na aplicac¸˜ao

Fonte: Chan (2016).

Com manutenc¸˜ao constante, at´e a atual data deste trabalho, o m´odulo FatFs ´e um soft-warelivre de c´odigo aberto para o gerenciamento de volumes FAT voltado ao uso em sistemas embarcados com recursos reduzidos. ´E escrito em ANSI C (C89) e completamente separado da camada de controle de entrada e sa´ıda f´ısica com os dispositivos de armazenamento, como mostrado na Figura 7. Portanto, independe de plataforma (CHAN, 2016).

Em conjunto com a comunicac¸˜ao SPI, a biblioteca FatFs possibilita a leitura, escrita, criac¸˜ao e remoc¸˜ao de arquivos no cart˜ao SD. Bem como a navegac¸˜ao e gerenciamento de seus diret´orios internos.

2.5 UTILIZAC¸ ˜AO DOS CONHECIMENTOS

A partir dos conhecimentos adquiridos no decorrer dessa sec¸˜ao, as etapas necess´arias para a elaborac¸˜ao do gerenciador de aplicativos dinˆamicos podem ser iniciadas. Utilizando a descric¸˜ao do arquivo ELF, apresentada na Sec¸˜ao 2.3, torna-se poss´ıvel encontrar sua parte que refere-se ao c´odigo execut´avel da aplicac¸˜ao. Ela ´e necess´aria para a instalac¸˜ao dos aplicativos, como ser´a visto no cap´ıtulo seguinte.

A API respons´avel pela comunicac¸˜ao dos aplicativos com o sistema, pode ser armazenada em uma porc¸˜ao reservada da mem´oria Flash fazendo uso das descric¸˜oes do arquivo Linker, apresentadas na Subsec¸˜ao 2.2.1.

O arquivo ELF ser´a carregado para o sistema atrav´es da comunicac¸˜ao com um cart˜ao SD. Esse cart˜ao utiliza o protocolo SPI e o sistema de arquivos Fat32, como apresentado ao longo da Sec¸˜ao 2.4. Os aplicativos carregados ser˜ao instalados como tarefas do RTOS presente no sistema, introduzido na Sec¸˜ao 2.1, .

Com as informac¸˜oes at´e aqui levantadas, d´a-se in´ıcio `as etapas de implementac¸˜ao do sis-tema. O pr´oximo cap´ıtulo, traz as implementac¸˜oes necess´arias para a construc¸˜ao do sistema de gerenciamento de aplicativos proposto.

(34)

3 METODOLOGIA

Neste cap´ıtulo s˜ao descritas as etapas do trabalho e o modo com que elas s˜ao executadas. A seguir, ´e exposta uma vis˜ao geral sobre a arquitetura proposta. Logo ap´os, s˜ao listadas e expla-nadas as etapas da construc¸˜ao do sistema e alguns problemas enfrentados e suas soluc¸˜oes. S˜ao apresentadas tamb´em as definic¸˜oes contidas no arquivo de port, para a adaptac¸˜ao do sistema. Ao fim, s˜ao introduzidos alguns poss´ıveis trabalhos futuros.

3.1 VIS ˜AO GERAL

O sistema proposto ´e dividido em dois grandes n´ucleos: os aplicativos carreg´aveis e a imagem contida na mem´oria do microcontrolador, a qual ser´a chamada de base, e que cont´em o kernel, o gerenciador dos aplicativos e a API de acesso ao kernel e drivers de sistema. Um esquema simplificado da arquitetura proposta ´e apresentado na Figura 8.

Cartão SD Aplicativos carregáveis Gerenciamento de aplicativos em módulos Chamadas de funções do RTOS do RTOS Imagem executável na memória do embarcado hardware Kernel

Figura 8 – Esquema da arquitetura do sistema pretendido

Pela leitura de um cart˜ao SD, o microcontrolador recebe o aplicativo carreg´avel em formato ELF. Esse aplicativo ´e desenvolvido normalmente no ambiente de desenvolvimento padr˜ao, da mesma forma que uma aplicac¸˜ao normal para a arquitetura em uso. Por´em, com a diferenc¸a da necessidade da inclus˜ao de um arquivo de cabec¸alho contendo a API de acesso `as func¸˜oes e s´ımbolos dispon´ıveis no RTOS e na base, e, algumas poucas mudanc¸as, citadas no decorrer deste cap´ıtulo. Al´em disso, o aplicativo deve ser obrigatoriamente carregado para a base.

(35)

Ao ser recebido na base, o aplicativo ´e instalado na mem´oria de acesso randˆomico (do inglˆes Random-Access Memory, RAM) em forma de tarefa do RTOS. A implementac¸˜ao das chamadas do RTOS estar˜ao contidas em uma sec¸˜ao reservada da mem´oria Flash do microcon-trolador. O acesso a elas ´e dado atrav´es de uma API de estruturas de ponteiros que apontam aos enderec¸os de cada func¸˜ao.

3.2 ETAPAS DO PROJETO

O projeto do sistema est´a dividido nas seguintes etapas:

Etapa 1 Desenvolvimento de uma API que possibilite `as aplicac¸˜oes carreg´aveis o acesso `as chamadas do RTOS e func¸˜oes dispon´ıveis no sistema base.

Etapa 2 Implementac¸˜ao de um algoritmo de extrac¸˜ao da parte execut´avel do arquivo bin´ario gerado pela compilac¸˜ao dos aplicativos carreg´aveis constru´ıdos.

Etapa 3 Implementac¸˜ao da leitura de um arquivo contido em um cart˜ao SD.

Etapa 4 Implementac¸˜ao do sistema de carregamento, execuc¸˜ao e gerenciamento dos aplicati-vos carreg´aveis.

Etapa 5 Desenvolvimento de m´etodos de resoluc¸˜ao de perdas de referˆencia, encontrados na execuc¸˜ao dos aplicativos.

3.2.1 Etapa 1 - API de Acesso

Como o RTOS e outras func¸˜oes importantes ao funcionamento dos aplicativos estar˜ao contidas na base do sistema, e esses aplicativos ser˜ao desenvolvidos em outro ambiente no qual n˜ao h´a o RTOS instalado ou as func¸˜oes dispon´ıveis, ´e necess´ario um meio de acesso a seus objetos e servic¸os. Para tal prop´osito ´e desenvolvida uma API de acesso.

As APIs implementadas s˜ao formadas por uma ´unica estrutura de dados contendo ponteiros de mem´oria para a localizac¸˜ao de cada s´ımbolo acess´ıvel na base, seja esse de chamadas do RTOS ou outras implementac¸˜oes dispon´ıveis. Por exemplo, func¸˜oes de acesso a drivers de algum hardware espec´ıfico.

Essa estrutura da API possui uma declarac¸˜ao padr˜ao, sendo seu nome “System struct”e o nome de cada um de seus atributos como “attr n”, cada um com seu tipo “type n”. Em que n ´e um n´umero que varia de 0 ao n´umero de atributos contidos na estrutura menos 1. O modelo de uma estrutura da API com 3 atributos pode ser visto na Listagem 9.

(36)

1 t y p e d e f i n t ( ∗ type_0 ) ( v o i d ) ; 2 t y p e d e f v o i d ( ∗ type_1 ) ( i n t ) ; 3 t y p e d e f c h a r ( ∗ type_2 ) ( i n t , c h a r ) ; 4 5 t y p e d e f s t r u c t { 6 type_0 atr_0; 7 type_1 atr_1; 8 type_2 atr_2; 9 } System_struct ;

Listagem 9 – Definic¸˜ao da estrutura utilizada na API com 3 atributos de acesso aos servic¸os do sistema base

Visando a f´acil adaptac¸˜ao de um c´odigo desenvolvido para ser executado de modo habitual em uma arquitetura, para um aplicativo dinˆamico dessa mesma arquitetura, ´e criada uma camada de abstrac¸˜ao entre as chamadas do c´odigo-fonte da aplicac¸˜ao e a estrutura da API. Essa camada nada mais ´e que um amontoado de definic¸˜oes que “apelidam”os nomes padr˜oes dos atributos das estruturas da API para os das func¸˜oes e objetos chamados no c´odigo.

Se um determinado aplicativo utiliza as func¸˜oes RTOS func A(), RTOS func B() e Driver func A(), a estrutura da API ter´a 3 atributos, cada um com um tipo pr´oprio que receber˜ao os ponteiros dessas func¸˜oes. Cada um desses atributos ser´a redefinido pelo nome original das func¸˜oes de modo com que essas possam ser chamadas no c´odigo do aplicativo da mesma maneira em que s˜ao no c´odigo de um programa normal. As redefinic¸˜oes s˜ao feitas como mostrado na Listagem 10. Al´em das redefinic¸˜oes dos atributos, a camada de abstrac¸˜ao define uma chamada para a posic¸˜ao em que a estrutura da API se encontra na mem´oria da base (no exemplo, 0x000F0000).

1 # d e f i n e SYSTEM ( ( S y s t e m s t r u c t ∗ ) 0 x000F0000 )

2

3 # d e f i n e RTOS func A SYSTEM−>a t r 0 0 0

4 # d e f i n e RTOS func B SYSTEM−>a t r 0 0 1

5 # d e f i n e D r i v e r f u n c A SYSTEM−>a t r 0 0 2

Listagem 10 – Camada de abstrac¸˜ao com as redefinic¸˜oes dos atributos da estrutura da API

1 __attribute__ ( ( section (” . a p i S e c t i o n ”) ) ) 2 c o n s t System_struct system = { 3 RTOS_func_A, 4 RTOS_func_B, 5 Driver_func_A 6 } ;

Listagem 11 – Declarac¸˜ao da estrutura da API de acesso

Ap´os todas as declarac¸˜oes de tipos e s´ımbolos serem feitas, as estruturas podem ser decla-radas, como no modelo da Listagem 11. Como a API ser´a chamada no c´odigo do aplicativo, ele deve saber onde encontr´a-la na mem´oria do microcontrolador, podendo assim execut´a-la. Por esse motivo, a API ´e gravada em uma sec¸˜ao fixa da mem´oria, que deve ser criada no linker scriptdo projeto, como mostrado na Listagem 3. No modelo de exemplo, essa sec¸˜ao ´e nomeada

(37)

“.apiSection”. A atribuic¸˜ao da estrutura a essa sec¸˜ao fixa ´e poss´ıvel fazendo uso da palavra chave atribute , apresentada na Sec¸˜ao 2.2.1.

A API ´e constitu´ıda por 3 arquivos e um esquema de seu funcionamento b´asico pode ser visto na Figura 9. Os arquivos API.c e API.h encontram-se no sistema base. Cada um cont´em, respectivamente, a declarac¸˜ao que atribui as chamadas de func¸˜ao na estrutura da API e as definic¸˜oes da estrutura, dos tipos de seus atributos e da posic¸˜ao em que a estrutura encontra-se na mem´oria. O ´ultimo arquivo ´e o API include.h e deve estar em todos os aplicativos. Esencontra-se cont´em as mesmas definic¸˜oes do API.h mais a camada de abstrac¸˜ao com as redefinic¸˜oes dos atributos da estrutura da API para os nomes originais das func¸˜oes atribu´ıdas a cada atributo.

Aplicativo carregável Kernel do RTOS (API.c e API.h) Base Estruturas de ponteiros (API_include.h) Chamadas de funções do sistema base

Figura 9 – Acesso `as func¸˜oes da base pelos aplicativos atrav´es da estrutura da API

Como os arquivos da API devem ser modificados sempre que novas func¸˜oes da base s˜ao disponibilizadas `as aplicac¸˜oes, foi criado uma rotina em linguagem C, nomeada API Generator.c, que recebendo um arquivo nomeado API.txt monta os 3 arquivos necess´arios ao funcionamento da API, bastando apenas copi´a-los para seus devidos diret´orios de projeto. Tal arquivo deve encontrar-se no mesmo diret´orio que a rotina compilada e conter, estritamente nesta ordem, as inclus˜oes de arquivos de cabec¸alho, as declarac¸˜oes das func¸˜oes e os s´ımbolos definidos que podem ser utilizados pelos aplicativos.

3.2.2 Etapa 2 - Leitura de arquivo ELF

O aplicativo carregado no microcontrolador ´e lido em formato ELF. Logo, para que seu carregamento e execuc¸˜ao sejam poss´ıveis, ´e necess´ario que sua imagem de execuc¸˜ao seja mon-tada na mem´oria da base. Isso se d´a pela implementac¸˜ao de uma rotina que, a partir do arquivo ELF recebido, extrai o conte´udo execut´avel e o carrega para uma nova tarefa do RTOS. Usando as tarefas do RTOS, h´a a vantagem do escalonamento entre as aplicac¸˜oes, e ainda o gerencia-mento dos recursos por elas utilizados.

A partir da descric¸˜ao da estrutura do arquivo ELF, apresentada na Sec¸˜ao 2.3, ´e constru´ıda uma rotina que encontre o c´odigo objeto que cont´em a func¸˜ao principal (main()) do aplicativo

(38)

e demais func¸˜oes que ela utiliza, dentro do arquivo recebido. Um esquema representativo das etapas e cada parte do arquivo que elas utilizam pode ser visto na Figura 10.

Cabeçalho ELF Seção 1 Seção 2 Seção com string

table de seções

Cabeçalho de Seção 1

...

...

Seção com string

table de símbolos Cabeçalho de Seção 2 ... Tabela de símbolos Arquivo ELF Leitura do cabeçalho ELF Carregamento da .shstrtab Procura das seções .symtab, .strtab e .rodata Procura do símbolo main Procura do símbolo de função após o símbolo main Procura de símbolo informado como nal Carregamento do código executável Carregamento da .rodata 5 4 3 2 A B 6 7 1

Figura 10 – Relac¸˜ao das etapas de extrac¸˜ao de programa com as partes do arquivo ELF

O sistema implementa dois modos de carregamento da parte execut´avel:

Modo A: mais simples, carrega apenas a func¸˜ao main() para a base, sendo que desse modo o aplicativo deve ser desenvolvido sem func¸˜oes extras, toda a execuc¸˜ao acontece dentro da func¸˜ao main().

Modo B: carrega tamb´em as func¸˜oes extras criadas na aplicac¸˜ao, para isso ´e necess´ario que as func¸˜oes sejam criadas ap´os a main() e apenas declaradas antes dela no c´odigo-fonte do aplicativo. Isso ´e necess´ario, pois o sistema implementado parte do princ´ıpio que o c´odigo das func¸˜oes extras est´a mapeado ap´os o c´odigo da main(), e o modo como o mapeamento do arquivo ELF ´e feito depende da posic¸˜ao dessas func¸˜oes. Al´em disso, ´e necess´ario tamb´em informar no arquivo de port, pela definic¸˜ao END SYMBOL NAME, o nome da func¸˜ao que ´e mapeada ap´os as func¸˜oes extras no arquivo ELF na fase de ligac¸˜ao do projeto. ´E poss´ıvel descobri-la consultando o arquivo de mapeamento (.map) gerado ap´os a compilac¸˜ao.

Inicia-se a leitura do arquivo pelo cabec¸alho, extrai-se as informac¸˜oes dos cabec¸alhos de sec¸˜ao e da posic¸˜ao da string table .shstrtab, que guarda os nomes das sec¸˜oes ELF. Percor-rendo os cabec¸alhos de sec¸˜ao e consultando a string table, s˜ao procurados trˆes cabec¸alhos: o

Referências

Documentos relacionados

Os maiores coeficientes da razão área/perímetro são das edificações Kanimbambo (12,75) e Barão do Rio Branco (10,22) ou seja possuem uma maior área por unidade de

II - os docentes efetivos, com regime de trabalho de 20 (vinte) horas semanais, terão sua carga horária alocada, preferencialmente, para ministrar aulas, sendo o mínimo de 8 (oito)

Os resultados indicaram que, em ambas as espécies, a seção transversal exerceu influência na propagação da onda de ultrassom e que a velocidade longitudinal foi fortemente afetada

grandiflora por estaquia, foram avaliados dois ambientes (viveiro e ambiente / condições de ocorrência natural), assim como o efeito do hormônio de enraizamento, o ácido

Em relação ao art. 557 do CPC, muitos também afirmam a sua importância normativa para embasar este processo de aproximação entre os modelos de controle

Convencionam as partes que, exclusivamente para os empregados que mantêm contrato de trabalho com a mesma empresa ou, empresa do mesmo grupo econômico há mais de 10 (dez) anos e

A presente revisão bibliográfica abordará polímeros molecularmente impressos, onde aprofundamos os processos de obtenção desses materiais através dos métodos de

Nos grupos 7, 14 e 21 dias, não existiram diferenças estatisticamente significativas nas 4 etapas de remodelamento tecidual avaliadas infiltrado inflamatório, edema, necrose e