Creo que el problema es tu falta de entendimiento del scope de las variables y la ubicacion de las mismas.
Por otra parte C30 desaparecio hace mucho y ahora es XC16, aunque muchas cosas siguen con "C30"
Compilador usado:
MPLAB X IDE v2.26 y XC16 v1.24
Voy a intentar hacer unos ejemplos:
Programa, cree un template y use tu codigo:
uint16_t lecturas[120];
/******************************************************************************/
/* Main Program */
/******************************************************************************/
int16_t main(void)
{
ConfigureOscillator(); //Vino por default en el codigo para el dsPIC33
InitApp();
while(1)
{
uint8_t i = 0;
// static uint8_t probando[120];
while(1)
{
lecturas[i] = i;
// probando[i] = i;
if(++i == 120)
{
i = 0;
}
}
}
}
C scope : block , file , program (scope real y no simplificando en "local" y "global")
block = funciones, variable dinamica, por lo tanto es una "auto" variable de automatic allocation (ubicacion automatica)
file = es lo que se conoce como static. y es una variable non-auto, es decir que tiene un guardado de duracion permanente
program = extern ( justamente en todo el programa el scope ) igual que el anterior
Lo que es permanente ( non-auto ) se guarda en el espacio de datos
Lo que esta al alcance del scope del la funcion unicamente (auto) es ubicada dinamicamente, es decir en el stack
En fin mi codigo esta con 1 sola variable con scope program ("global")
Esto se guardo en la seccion de datos .nbss ( es decir seccion de datos NO inicializados parte baja (8KB o menos = near))
Program Memory [Origin = 0x200, Length = 0x1e00]
section address length (PC units) length (bytes) (dec)
------- ------- ----------------- --------------------
.text 0x200 0xce 0x135 (309)
.text 0x2ce 0x2e 0x45 (69)
.dinit 0x2fc 0x8 0xc (12)
.text 0x304 0xc 0x12 (18)
Total program memory used (bytes): 0x198 (408) 3%
Data Memory [Origin = 0x800, Length = 0x400]
section address alignment gaps total length (dec)
------- ------- -------------- -------------------
.nbss 0x800 0 0xf0 (240)
Total data memory used (bytes): 0xf0 (240) 23%
Dynamic Memory Usage
region address maximum length (dec)
------ ------- ---------------------
heap 0 0 (0)
stack 0x8f0 0x310 (784)
Maximum dynamic memory (bytes): 0x310 (784)Realizando unas pequeñas modificaciones.
Descomento el
static uint8_t probando[120];
y
Para ver que ocurre:
Program Memory [Origin = 0x200, Length = 0x1e00]
section address length (PC units) length (bytes) (dec)
------- ------- ----------------- --------------------
.text 0x200 0xce 0x135 (309)
.text 0x2ce 0x38 0x54 (84)
.dinit 0x306 0x8 0xc (12)
.text 0x30e 0xc 0x12 (18)
Total program memory used (bytes): 0x1a7 (423) 3%
Data Memory [Origin = 0x800, Length = 0x400]
section address alignment gaps total length (dec)
------- ------- -------------- -------------------
.nbss 0x800 0 0x168 (360)
Total data memory used (bytes): 0x168 (360) 35%
Dynamic Memory Usage
region address maximum length (dec)
------ ------- ---------------------
heap 0 0 (0)
stack 0x968 0x298 (664)
Maximum dynamic memory (bytes): 0x298 (664)Efectivamente puso los datos en el espacio de datos,, ahora tengo 360 bytes ( 120 de 16 bytes y 120 de 8 bytes )
Esta ves voy a probar que ocurre cuando no esta puesto como static.
section address length (PC units) length (bytes) (dec)
------- ------- ----------------- --------------------
.text 0x200 0xce 0x135 (309)
.text 0x2ce 0x38 0x54 (84)
.dinit 0x306 0x8 0xc (12)
.text 0x30e 0xc 0x12 (18)
Total program memory used (bytes): 0x1a7 (423) 3%
Data Memory [Origin = 0x800, Length = 0x400]
section address alignment gaps total length (dec)
------- ------- -------------- -------------------
.nbss 0x800 0 0xf0 (240)
Total data memory used (bytes): 0xf0 (240) 23%
Dynamic Memory Usage
region address maximum length (dec)
------ ------- ---------------------
heap 0 0 (0)
stack 0x8f0 0x310 (784)
Maximum dynamic memory (bytes): 0x310 (784)Exactamente lo previsto.. espacio de datos con 240 bytes, es decir solo los 120 de 16bytes, mientras que el otro a donde fue ? eso se va a encargar de manejarlo C con su stack, el stack se asigna como la maxima cantidad de memoria no utilizada, si ocurre un overflow de stack se produce una excepcion. Es exactamente el error que esta dandote el proteus
Creo que eso es ya mas asunto tuyo que del compilador, como es dinamico puede o no ser necesario mantener todos esos datos, por ejemplo si llamas una funcion y salis, ya no te importan sus variables y las desechas. ganando espacio de stack, en el main, asi de la misma forma lo toma el compilador.
Por curiosidad, dije que .bss es el espacio de datos NO inicializado, entonces que ocurre si lo inicializo con un valor, no puedo poner 0 por que es lo mismo que NO inicializarlo.
Cambio:
por
uint16_t lecturas[120] = {1,2,3,4,5};
Finalmente:
Program Memory [Origin = 0x200, Length = 0x1e00]
section address length (PC units) length (bytes) (dec)
------- ------- ----------------- --------------------
.text 0x200 0xce 0x135 (309)
.dinit 0x2ce 0xa8 0xfc (252)
.text 0x376 0x44 0x66 (102)
Total program memory used (bytes): 0x297 (663) 5%
Data Memory [Origin = 0x800, Length = 0x400]
section address alignment gaps total length (dec)
------- ------- -------------- -------------------
.ndata 0x800 0 0xf0 (240)
Total data memory used (bytes): 0xf0 (240) 23%Ahora nuestro espacio es .data, seccion near por ser de menos de 8k.
No veo NINGUN problema.Por otra parte veamos si le pongo un const lo cual lo ubicaria dentro de la memoria de programa.Mas que claro comento la linea que le asigna un valor a ese punto
section address length (PC units) length (bytes) (dec)
------- ------- ----------------- --------------------
.text 0x200 0xce 0x135 (309)
.const 0x2ce 0xf0 0x168 (360)
.text 0x3be 0x34 0x4e (78)
.dinit 0x3f2 0x2 0x3 (3)
Total program memory used (bytes): 0x2ee (750) 6%
Data Memory [Origin = 0x800, Length = 0x400]
section address alignment gaps total length (dec)
------- ------- -------------- -------------------
Total data memory used (bytes): 0 (0)
Dynamic Memory Usage
region address maximum length (dec)
------ ------- ---------------------
heap 0 0 (0)
stack 0x800 0x400 (1024)
Maximum dynamic memory (bytes): 0x400 (1024)Ahi aparece como const dentro de la memoria de programa, la memoria de datos esta en 0, y el stack es de 1024! es decir TODA la memoria de datos.
Hay muchas mas opciones, como elegir una seccion del espacio de programa para que pueda ser visto como una extension del espacio de datos, etc.
Eso lo vas a ver en el manual de XC16
Sobre near/far es por un tema del micro... se crea un codigo mas eficiente si las variables estan dentro del espacio near. Es lo que dice el manual.
Creo que esto soluciona todas las dudas que tienen.
El stack no aparece como "RAM" ocupada por que si viene por defecto usar todo el espacio de datos que no se usa como stack, seria siempre 100%.
Distinto es cuando usan un RTOS y definen un espacio de stack, imagino que el RTOS crea un stack para cada tarea.
Burdamente como crear una array de ese tamaño para cada tarea. Entonces ahi ya no contaria como stack.
Creo que es por la filosofia de Microchip al no estar declarado en ningun lado el tamaño de stack sino tomar todo lo NO utilizado.