Vai al contenuto
PLC Forum


Stack


kucaio

Messaggi consigliati

Salve a tutti ho un problema a me incomprensibile per cui richiamo le vs conoscenze.

Intanto invio due informazioni sul progetto e su come è stato costituito:

Software MLab IDE ver.8.53

Tools di programmazione : HI-TECH C lite v9.71a

Debugger/ programmer: Pickit 2 ICSP

MCU: PIC16F877A

Hardware STACK

Memory usage: 8112 su 8192

void
main(void)
	{
	TRISA=0b00001111; //255;//TRISA=0b00001111;
	TRISB=0;
	TRISC=0b10000000; 
	TRISD=0;
	TRISE=0b00000111;//0;//TRISE=0b00000111;

//setting_analogiche di ingresso 
	OPTION = 0b00000111;
	CCP1CON	=0b00001100; // 
	PR2 = 255; // 
	//T2CON=0b00000100;
	T2CON = 0b11111110; // 
	CCPR1L = 0; // 
	CCPR1H = 0; // 
	//setting();  // effettua il settaggio delle porte e la configurazione dei registri del microcontrollore


	INTCON = 0x0;


	LCD_RS = 0;
	LCD_EN = 0;
	LCD_RW = 0;

// prima istruzione	
//	__delay_ms(35);	// wait 35mSec after power applied,
	lcd_write(0b00111100);//init_value;

// secondo	istruzione
	DelayMs(50);	// wait 50mSec after power applied,
	lcd_write(0b00001111);

//	terza istruzione
	DelayMs(50);	// wait 50mSec after power applied,
	lcd_write(0b00000001);

//	quarta istruzione
	DelayMs(2);	// wait 2mSec after power applied,
	lcd_write(0b00000001);

	//lcd_write(0x28); // Set interface length
//	__delay_ms(1);
	lcd_write(0xF); // Display On, Cursor On, Cursor Blink
	DelayMs(1);
	lcd_clear();	// Clear screen
	DelayMs(1);
	lcd_write(0x6); // Set entry Mode

//	lcd_init(); // effettuta l'inizializzazione del display LCD
//	lcd_clear(); // pulisce lo schermo del display LCD
	lcd_blinkOFF();	
	lcd_pos_puts(0x0,"Benvenuti");
	lcd_pos_puts(0x45,"--.-");
	init_RTC(); // inizializza il real clock timer della dallas DS1302
	ciclo_main();
	}


//********************************************************************* INIZIO CICLO MAIN ****************************************************************************************
void
ciclo_main(void)
{
while(1)
	{
	if (primo_avvio == 0)
  {
  funzione_temp_primo_avvio();
  
  }
	//pulsante up

	if (pulsante_premuto(P_UP))
  {
  pagina_uno = 0;
  pagina_temp_min_max();
  }

	//pulsante down
	if (pulsante_premuto(P_DW))    // se pulsante è premuto (quando è premuto, porta il pin allo stato logico alto)
  {
  pagina_uno = 0;
  imposta_giorni(); 
  }
	//pulsante right
	if (pulsante_premuto(P_RIGHT))  	// se pulsante è premuto (quando è premuto, porta il pin allo stato logico alto)
  {
  pagina_uno = 0;
  pagina_setting_min(); 
  }
	//pulsante left
	if (pulsante_premuto(P_LEFT))    // se pulsante è premuto (quando è premuto, porta il pin allo stato logico alto)
  {
  pagina_uno = 0;
  pagina_data_estesa(); 
  }
	// effettua un count down per generere un evento ciclico , la stessa operazione si potrebbe realizzare un un interrupt su TMR0


	if (pippo>4000)
  {
  analogicaAN0();  // funzione di conversione del valore analogico di ingresso per la lettura della temperatura
  scrivi_orario();	// funzione di scittura dell'orario sulla pagina principale del display LCD
  funzione_temperatura();
  attiva_uscite();
  if (comando == 10)
  	{
  	scrivi_rs232();
  	comando = 0;
  	}
  pippo = 3000;
  }  
	else
  {
  pippo = pippo++;
  }
	}
}

Quando utilizzo il debugger in simulazione MLABSIM non ho nessun problema, quando invece testo il programma con il PicKIT2 con l'ICSP il program counter impazzisce e mi salta di palo in frasca e quanto chiamo una funzione qualsiasi lo stack non va a 1 ma rimane a 0.

Ho controllato il WDT è disabilitato e l'interrupt sono disabilitati, forse durante il ICSP vengono richiamate delle risorse per cui avendo usato il 99,6% della memoria del programma questo ha dei problemi in fase di esecuzione.

mi potete dare delle dritte se avete bisogno di ulteriori informazioni fatemi sapere.

Saluti.

Modificato: da kucaio
Link al commento
Condividi su altri siti


Non conosco il PicKit, ma sicuramente utilizza delle risorse del micro, generalmente gli ultimi 16 byte della memoria dati, per cui non credo che il problema sia questo.

Probabilmente l'Hi-Tech si costruisce uno stack software, ma 80 byte di stack (memoria che ti rimane) mi sembrano sufficienti per il numero di “call” che esegui.

Prova a eliminare, meglio commentare, alcune routine per alleggerire il sistema e se funziona, le aggiungi una alla volta, provando di nuovo tutte le volte che aggiungi una funzione.

Se è un problema di risorse lo scopri subito...

Una precisazione: non serve fare un “ciclo_main” se al suo interno fai un “while (1)”.

Metti il codice direttamente nel main, così risparmi una “call”.

Facci sapere.

Link al commento
Condividi su altri siti

Ciao,

grazie della risposta, stavo giusto provando a commentare delle routine ed il problema effettivamente mi si sposta.

il numero di call che eseguo è parecchio tant'e' che quando compilo il compilatore mi invia un bel po' di warning, potrebbe essere la causa dei miei mali? inoltre mi invia un messaggio di:" possible hardware stack overflow detected, estimated stack depth: 15".

In merito al ciclo_main ho chiamato la routine all'esterno della main pochè viene richiamata da altre routine.

Se posso ti posto il codice cosi' magari riesci a darmi una mano nel minor tempo grazie mille.

(1273) Omniscient Code Generation not available in Lite mode (warning)
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode)  V9.71a
Copyright (C) 2010 Microchip Technology Inc.
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 93. recursive function call to "_main"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 108. recursive function call to "_ciclo_main"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\impostazione.c; 32. recursive function call to "_imposta_giorni"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\impostazione.c; 155. recursive function call to "_impostazione_giorni"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\impostazione.c; 181. recursive function call to "_incrementa_posizione"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 414. recursive function call to "_pagina_setting_min"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 454. recursive function call to "_pagina_setting_ore"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 491. recursive function call to "_pagina_setting_mese"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 533. recursive function call to "_pagina_setting_anno"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 568. recursive function call to "_pagina_setting_giorno"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 607. recursive function call to "_pagina_setting_data"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 664. recursive function call to "_attiva_uscite"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 692. recursive function call to "_attiva_temporizzazione"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 641. recursive function call to "_salvataggio"
Warning [1089] X:\8_A_Progetti prova in C\Inizio\impostazione.c; 198. recursive function call to "_decrementa_posizione"
Warning [1393] X:\8_A_Progetti prova in C\Inizio\main.c; 95. possible hardware stack overflow detected, estimated stack depth: 15

Memory Summary:
    Program space        used  1DF2h (  7666) of  2000h words   ( 93.6%)
    Data space           used    68h (   104) of   170h bytes   ( 28.3%)
    EEPROM space         used     0h (     0) of   100h bytes   (  0.0%)
    Configuration bits   used     1h (     1) of     1h word    (100.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)

Running this compiler in PRO mode, with Omniscient Code Generation enabled,
produces code which is typically 40% smaller than in Lite mode.
The HI-TECH C PRO compiler output for this code could be 2975 words smaller.
See http://microchip.htsoft.com/portal/pic_pro for more information.

Link al commento
Condividi su altri siti

Il tuo errore e' nelle "recursive function". I motivi possono essere diversi.

Il piu' probabile e' che, ad esempio, la funzione A chiama la funzione B e la

funzione B chiama la funzione A. In questo modo bisogna stare attenti al sistema

con cui si "esce" dal possibile loop che si innesta.

Se vuoi usare questo metodo con sicurezza, devi fare funzioni "reentrand" (passaggio variabili nello stack) ma il "consumo" di risorse (memoria) aumenta parecchio in base al numero di "richiami" che si eseguono, cosa che tu devi evitare.

La cosa piu' semplice e' quella di evitare la recursivita'.

Devi cercare di "spezzare" le funzioni A e B in questo modo: la parte che ti interessa della funzione A che richiami nella funzione B deve diventare una funzione autonoma (al limite duplicandola sia per la funzione A, sia per la

funzione B ).

Spero di non averti confuso le idee...

Ciao.

Modificato: da Fulvio Persano
Link al commento
Condividi su altri siti

Fulvio Persano

Ciao.

kappa47+29/10/2010, 10:59--> (kappa47 @ 29/10/2010, 10:59)

Succede quando dopo la faccina si mette la parentesi (come nel tuo caso). Per ovviare a questo inconveniente, basta mettere uno "spazio" ed il gioco è fatto.

Ora è corretto.

smile.gif

Link al commento
Condividi su altri siti

Grazie mille kappa47 sei stato chiarissimo tant è che sono riuscito ad eliminare le recursività. L'unica domanda è: le recursività potrebbero causare quanto a me accade?

inolltre dato che ci sono ne approfitto mi rimangono alcuni warning quando compilo hai mica un'idea di quali possano essere le cause?:

grazie ancora.


Warning [339] X:\8_A_Progetti prova in C\Inizio\impostazione.h; 9.29 initializer in extern declaration
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\bin\picc.exe" --pass1 "X:\8_A_Progetti prova in C\Inizio\main.c" -q --chip=16F877A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" 
Warning [339] X:\8_A_Progetti prova in C\Inizio\impostazione.h; 9.29 initializer in extern declaration
Warning [358] X:\8_A_Progetti prova in C\Inizio\main.c; 845.13 illegal conversion of pointer to integer
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\bin\picc.exe" --pass1 "X:\8_A_Progetti prova in C\Inizio\set_reset.c" -q --chip=16F877A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" 
Warning [111] X:\8_A_Progetti prova in C\Inizio\set_reset.c; 13.39 redefining preprocessor macro "bitsetsingle" (X:\8_A_Progetti prova in C\Inizio\set_reset.h: 8)
Warning [111] X:\8_A_Progetti prova in C\Inizio\set_reset.c; 14.40 redefining preprocessor macro "bitcrlsingle" (X:\8_A_Progetti prova in C\Inizio\set_reset.h: 9)
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\bin\picc.exe" --pass1 "X:\8_A_Progetti prova in C\Inizio\settaggio.c" -q --chip=16F877A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" 
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\bin\picc.exe" -oLCD.cof -mLCD.map --summary=default,-psect,-class,+mem,-hex --output=default,-inhx032 eprom.p1 RTC.p1 delay.p1 lcd.p1 impostazione.p1 main.p1 set_reset.p1 settaggio.p1 --chip=16F877A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" 
(1273) Omniscient Code Generation not available in Lite mode (warning)
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode)  V9.71a
Copyright (C) 2010 Microchip Technology Inc.
Warning [1393] X:\8_A_Progetti prova in C\Inizio\main.c; 95. possible hardware stack overflow detected, estimated stack depth: 15

Memory Summary:
    Program space        used  1EACh (  7852) of  2000h words   ( 95.8%)
    Data space           used    67h (   103) of   170h bytes   ( 28.0%)
    EEPROM space         used     0h (     0) of   100h bytes   (  0.0%)
    Configuration bits   used     1h (     1) of     1h word    (100.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)

Running this compiler in PRO mode, with Omniscient Code Generation enabled,
produces code which is typically 40% smaller than in Lite mode.
The HI-TECH C PRO compiler output for this code could be 3015 words smaller.
See http://microchip.htsoft.com/portal/pic_pro for more information.

Link al commento
Condividi su altri siti

I problemi di stack sono imprevedibili e molto rognosi da trovare; se aggiungi che il compilatore C non fa nessun controllo o quasi (il bello e il brutto del C...) le cose si complicano. Hanno fatto C++ e C# per ovviare a questi problemi.

Veniamo ai warning:

1) initializer in extern declaration: fai un assegnamento ad una variabile esterna che non hai dichiarato nel modulo in cui la utilizzi.

2) illegal conversion of pointer to integer: piu' che un warning, per me e' un errore (dipende dal contesto in cui tu usi l'integer)

Quando si fanno conversioni, ad esempio da intero a byte, si perdono delle informazioni (lo stesso accade da byte ad intero se hanno segno)

Un puntatore (dipende dal compilatore) puo' occupare piu' di 2 byte (anche se sembra strano dato che l'indirizzamento del codice e' sicuramente inferiore ai 64k: pensa ad eventuale banchi di memoria...)

3) redefining preprocessor macro "bitsetsingle": probabilmente fai piu' di una "include" dello stesso file "*.h"

Vorrei ricordarti che queste sono indicazioni di massima; per avere le corrette informazioni, il manuale del compilatore e' la scelta migliore.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...