|
| 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 | + |
| 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