Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8867c3e

Browse files
committed
dicas para portar FreeRTOS - ATmega - Tamanho do Stack
1 parent be7b883 commit 8867c3e

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
layout: post
3+
title: Tamanho do Stack - Dicas para portar o FreeRTOS para ATMega328 e ATMega2560
4+
description: Dicas para portar o FreeRTOS para a família ATMega328 e ATMega2560 (e suas variántes)
5+
image: assets/images/avr/avr-logo.png
6+
tags: ATMega, 328, 2560, AVR, Microchip
7+
category : avr
8+
---
9+
10+
O port mais simples do Arduino é para os chips da familia AVR, em especial ATMega328 e ATMega2560, Arduino UNO e Arduino Mega respectivamente, mas isso não quer dizer que não seja preciso tomar alguns cuidados.
11+
12+
<!--more-->
13+
14+
Vamos là.
15+
16+
## Tamanho do Stack
17+
18+
O Stack no ATMega2560 é limitado da mesma forma que que no ATMega328, e qualquer outro AVR (salvo que seja especificado ao contrário em algum datasheet), não utiliza mais que dois bytes normalmente para endereçar sua alocação, já que o ATmega2560 tem uma mémoria de 8KBs e o ATMega328 tem 2KBs, (0x2000 e 0x0800 respectivamente).
19+
20+
Mesmo o ATMega640 ao ATMega2561 tendo a possibilidade de expandir sua memória com chips externos e com registradores especiais para tal manejo, sempre usaremos nesta versão do DuinOS o stack na mémoria interna. Tais chips tem um contador de memória com 3 bytes, diferentemente do demais ATMegas.
21+
22+
Portanto o tamanho do Stack estará limitado ao tamanho da memória interna, tipicamente metade desta memória, já que o restante é usado para HEAP (que crescendo no sentido oposto ao Stack, podendo vir a colidir).
23+
24+
Veja a figura abaixo para entender como a memória é alocada tipicamente (não se está considerando o uso de memória externa);
25+
26+
![Mapeamento Padrão para alocação de memória]({{site.url}}{{site.baseurl}}/assets/images/gcc/malloc-std.png)
27+
28+
Porém quando se está trabalhando com endereços de retorno de funções, gerados com instruções RET/CALL ou RETI/CALLI, na maioria das implementações AVR usa dois bytes no stack para armazenar o endereço de retorno, mas no caso do ATmega2560/2561 usa 3 bytes, tal necessidade, é identificada pela presença da macro de compilação `__AVR_HAVE_RAMPZ__` ou `__AVR_3_BYTE_PC__`
29+
30+
## Referências
31+
32+
* https://www.nongnu.org/avr-libc/user-manual/malloc.html
33+
* https://embeddedgurus.com/stack-overflow/category/efficient-cc/
34+
* Datasheets for ATmega/AVR cores
35+
* Appnotes for ATmega/AVR Cores

0 commit comments

Comments
 (0)