Customizando a memória Flash no Linker do IAR

No artigo anterior descobrimos onde fica o arquivo do Linker e entendemos o mapa de memória. Veja agora como customizar a memória Flash no Linker do IAR.
Linker do IAR

Recapitulando

Na parte 1 desta série vimos onde se encontra o arquivo do Linker na IDE IAR, a partir de um projeto gerado no STM32CubeMX, e detalhamos cada área do mapa de memória, tanto da Flash quanto da RAM. Deste modo, construímos uma base para prosseguirmos com o assunto para customizar o arquivo e, respectivamente, o projeto.

Projeto

Encontre o diretório no qual foi salvo o projeto gerado pelo STM32CubeMX e abra o projeto do IAR (extensão .eww). Já com a IDE aberta, juntamente com o arquivo do Linker (stm32f051x8.icf), faremos as seguintes alterações, as quais serão explicadas na sequência:

/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;

/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000400;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800DFFE;

define symbol routine_region_ROM_start__ = 0x0800DFFF;
define symbol routine_region_ROM_end__   = 0x0800FFFF;

define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;

/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__   = 2k;
define symbol __ICFEDIT_size_heap__     = 1k;

/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region        = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region ROUTINE_region    = mem:[from routine_region_ROM_start__   to routine_region_ROM_end__];
define region RAM_region        = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region     { readonly                };
place in ROUTINE_region { readonly section SERIAL_ENTRY      };
place in RAM_region     { readwrite, block CSTACK, block HEAP   };

export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;

Em “Specials”, o endereço inicial, tanto da memória Flash quanto do vetor de interrupções, foi mantido (0x08000000).

Em “Memory Regions”, alteramos o endereço inicial do programa de 0x08000000 para 0x08000400. Isto significa que atribuímos 1 kB somente para o vetor de interrupção. Porém, o leitor pode se perguntar: “Será que esta quantidade está correta?”. A resposta é SIM! Vide o tamanho do vetor no arquivo .map, o qual indica o atual tamanho no mapa de memória:

Tamanho do vetor de interrupção.
Figura 1 – Tamanho do vetor de interrupção.

Nesta figura, podemos extrair também: o tipo do código (Kind: ro code), a faixa de endereço (Address: 0x08000000 – 0x080000bc), o tamanho (0xbc = 188 bytes) e o objeto que é o arquivo de saída (pós compilação) do startup_stm32f051x8.s. Ou seja, todos os endereços de cada vetor de interrupção, stack, heap e apontamento para o SystemInit após o reset, estão neste arquivo. Vemos também que a memória reservada para ROUTINE_REGION é representada por “P2”. Outra conclusão é que superestimamos a área reservada para o vetor.

Com a determinação da região do vetor, alteramos o endereço de início e fim do programa para 0x08000400 – 0x0800DFFE. Além disso, determinamos os endereços iniciais e finais da rotina que criaremos: 0x0800DFFF – 0x0800FFFF, respectivamente representados por routine_region_ROM_start__ e routine_region_ROM_end__, cujo tamanho é de 8 kB.

Modificamos, para facilitação da leitura do código e também demonstrar outra maneira de atribuição, os valores de __ICFEDIT_size_cstack__ = 2k e __ICFEDIT_size_heap__   = 1k.

Por fim, determinamos a região da rotina, indicado por ROUTINE_region e, em seguida, a seção ROUTINE_REGION, que será invocada pela diretiva de compilação #pragma.

No próximo artigo mostraremos como fazer a mesma configuração utilizando os recursos gráficos do IAR.

Saiba mais

https://www.iar.com/support/tech-notes/linker/what-is-linker-created-and-lcgbwk-in-the-.map-file/
https://www.iar.com/support/tech-notes/compiler/linker-error-for-absolute-located-variable/

Criando um projeto no IAR com o FreeRTOS

GNU ARM Cross-toolchain – Configurando stack e heap

Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments

WEBINAR

Visão Computacional para a redução de erros em processos manuais

DATA: 23/09 ÀS 17:00 H