Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

control reaches end

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: control reaches end

Messaggioda Foto UtenteGuidoB » 11 gen 2019, 23:57

EcoTan ha scritto:... noto un messaggio in rosso del compilatore: warning: control reaches end of non-void function.
Aggiungo while(1); prima della parentesi graffa finale e tutto va a posto. Chissà cosa succedeva?


int main(void), per come è dicharata, deve ritornare un int.

Quindi, o aggiungi un return 0 alla fine, o dichiari la funzione come void main(void).

Perché, aggiungendo while(1), il warning sparisca non so, ma suppongo che succede perché con quell'istruzione il controllo non raggiunge mai la fine della funzione.
Big fan of ƎlectroYou!
Avatar utente
Foto UtenteGuidoB
14,2k 6 12 13
G.Master EY
G.Master EY
 
Messaggi: 2198
Iscritto il: 3 mar 2011, 16:48
Località: Madrid

0
voti

[12] Re: control reaches end

Messaggioda Foto Utentegvee » 12 gen 2019, 0:18

Per curiosità io ho provato a fare il disassembling del codice.

Debug → Discrete Debugger Operations → Build for Debugging Main Project

e poi

Windows → Debugging → Output → Dissassembly Listing File

Codice: Seleziona tutto
8:                 #include "p33FJ128MC802.h"        //fusebit fastRC wPLL e tutto libero
9:                 //_FOSCSEL (FNOSC_FRCPLL & IESO_ON) //Oscillatore FastRC 7,37 MHZ with PLL
10:                //pin 12 ledv, 14 ledr,
11:                #define ledv _LATA4        // RA4 pin12 led verde
12:                #define ledr _LATB5        // RB5 pin14 led rosso
13:               
14:                int main (void)
15:                {                   //Main Program
0002CE  FA0000     LNK #0x0
16:                    PLLFBDbits.PLLDIV=41;               // M=43 PLLDIV=41 clock oscillator Tcy=25 ns
0002D0  803A31     MOV PLLFBD, W1
0002D2  2FE000     MOV #0xFE00, W0
0002D4  608080     AND W1, W0, W1
0002D6  200290     MOV #0x29, W0
0002D8  700001     IOR W0, W1, W0
0002DA  883A30     MOV W0, PLLFBD
17:                    CLKDIVbits.PLLPOST=0;               // N1=2  N2=2(default) 7.37*M/N1/N2=79Mhz~40MIPS
0002DC  803A21     MOV CLKDIV, W1
0002DE  2FF3F0     MOV #0xFF3F, W0
0002E0  608000     AND W1, W0, W0
0002E2  883A20     MOV W0, CLKDIV
18:                    while (OSCCONbits.COSC != 0b001){}; // Sure for FastRC w PLL   
0002E4  000000     NOP
0002E6  803A11     MOV OSCCON, W1
0002E8  270000     MOV #0x7000, W0
0002EA  608080     AND W1, W0, W1
0002EC  210000     MOV #0x1000, W0
0002EE  508F80     SUB W1, W0, [W15]
0002F0  3AFFFA     BRA NZ, .L2
19:                    while(OSCCONbits.LOCK!=1) {};       // Wait for PLL to lock
0002F2  000000     NOP
0002F4  803A11     MOV OSCCON, W1
0002F6  200200     MOV #0x20, W0
0002F8  608000     AND W1, W0, W0
0002FA  E00000     CP0 W0
0002FC  32FFFB     BRA Z, .L3
20:               
21:                    TRISA = 0b1111111111101111;         //OUT RA4 PIN12 LED verde
0002FE  2FFEF0     MOV #0xFFEF, W0
000300  881600     MOV W0, TRISA
22:                    TRISB = 0b1111111111011111;         //OUT RB5 PIN14 LED rosso
000302  2FFDF0     MOV #0xFFDF, W0
000304  881640     MOV W0, TRISB
23:               
24:                    ledv=1; ledr=1;
000306  A882C4     BSET LATA, #4
000308  A8A2CC     BSET LATB, #5
25:                }
00030A  FA8000     ULNK
00030C  060000     RETURN


Si vede come il programma esegue le istruzioni ULNK e RETURN, le cui descrizioni secondo il set di istruzioni dal datasheet tabella 29.2 sono:

ULNK: Unlink Frame Pointer
RETURN: Return from Subroutine

Credo che poi ricominci l'esecuzione da 0, ma non avendo il PIC a disposizione, non ho fatto il debug su di esso. È solo una supposizione.

PS: ovviamente non dispongo del file fusebit.c.

O_/
Avatar utente
Foto Utentegvee
540 1 6
Frequentatore
Frequentatore
 
Messaggi: 186
Iscritto il: 11 feb 2018, 20:34

0
voti

[13] Re: control reaches end

Messaggioda Foto UtenteEcoTan » 12 gen 2019, 0:36

Codice: Seleziona tutto
// DSPIC33FJ128MC802 Configuration Bit Settings
// 'C' source line config statements
// FBS
#pragma config BWRP = WRPROTECT_OFF     // Boot Segment Write Protect (Boot Segment may be written)
#pragma config BSS = NO_FLASH           // Boot Segment Program Flash Code Protection (No Boot program Flash segment)
#pragma config RBS = NO_RAM             // Boot Segment RAM Protection (No Boot RAM)

// FSS
#pragma config SWRP = WRPROTECT_OFF     // Secure Segment Program Write Protect (Secure segment may be written)
#pragma config SSS = NO_FLASH           // Secure Segment Program Flash Code Protection (No Secure Segment)
#pragma config RSS = NO_RAM             // Secure Segment Data RAM Protection (No Secure RAM)

// FGS
#pragma config GWRP = OFF               // General Code Segment Write Protect (User program memory is not write-protected)
#pragma config GSS = OFF                // General Segment Code Protection (User program memory is not code-protected)

// FOSCSEL
#pragma config FNOSC = FRCPLL           // Oscillator Mode (Internal Fast RC (FRC) w/ PLL)
#pragma config IESO = ON                // Internal External Switch Over Mode (Start-up device with FRC, then automatically switch to user-selected oscillator source when ready)

// FOSC
#pragma config POSCMD = NONE            // Primary Oscillator Source (Primary Oscillator Disabled)
#pragma config OSCIOFNC = ON            // OSC2 Pin Function (OSC2 pin has digital I/O function)
#pragma config IOL1WAY = ON             // Peripheral Pin Select Configuration (Allow Only One Re-configuration)
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor (Both Clock Switching and Fail-Safe Clock Monitor are disabled)

// FWDT
#pragma config WDTPOST = PS32768        // Watchdog Timer Postscaler (1:32,768)
#pragma config WDTPRE = PR128           // WDT Prescaler (1:128)
#pragma config WINDIS = OFF             // Watchdog Timer Window (Watchdog Timer in Non-Window mode)
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (Watchdog timer enabled/disabled by user software)

// FPOR
#pragma config FPWRT = PWR128           // POR Timer Value (128ms)
#pragma config ALTI2C = OFF             // Alternate I2C  pins (I2C mapped to SDA1/SCL1 pins)
#pragma config LPOL = ON                // Motor Control PWM Low Side Polarity bit (PWM module low side output pins have active-high output polarity)
#pragma config HPOL = ON                // Motor Control PWM High Side Polarity bit (PWM module high side output pins have active-high output polarity)
#pragma config PWMPIN = ON              // Motor Control PWM Module Pin Mode bit (PWM module pins controlled by PORT register at device Reset)

// FICD
#pragma config ICS = PGD1               // Comm Channel Select (Communicate on PGC1/EMUC1 and PGD1/EMUD1)
#pragma config JTAGEN = OFF             // JTAG Port Enable (JTAG is Disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
Avatar utente
Foto UtenteEcoTan
5.262 4 10 13
Expert EY
Expert EY
 
Messaggi: 3089
Iscritto il: 29 gen 2014, 8:54

0
voti

[14] Re: control reaches end

Messaggioda Foto Utentegvee » 12 gen 2019, 0:48

Grazie. Non cambia nulla.

O_/
Avatar utente
Foto Utentegvee
540 1 6
Frequentatore
Frequentatore
 
Messaggi: 186
Iscritto il: 11 feb 2018, 20:34

0
voti

[15] Re: control reaches end

Messaggioda Foto UtenteEcoTan » 12 gen 2019, 8:09

Non ho usato il debug, ho fatto la compilazione tipo release.
Avatar utente
Foto UtenteEcoTan
5.262 4 10 13
Expert EY
Expert EY
 
Messaggi: 3089
Iscritto il: 29 gen 2014, 8:54

0
voti

[16] Re: control reaches end

Messaggioda Foto UtenteEcoTan » 12 gen 2019, 8:36

GuidoB ha scritto:o aggiungi un return 0 alla fine

Con return 0; non dà nessun errore ma i led accendono malissimo
GuidoB ha scritto:o dichiari la funzione come void main(void)

Il compilatore dà un warning blu (return type of 'main' is not 'int') e i led accendono malissimo. Basta, per me è risolto così, gli errori vanno corretti e non ho mai considerato che sia necessario sviscerarli, tanto più che c'è di mezzo un compilatore (tipo student free di Microchip).

P.S.Può darsi che sia successo questo: i pin rimangono configurati come input ed i led, funzionando come fotodiodi, introducono il disturbo.

P.P.S. No, configurando i pin a bella posta come input, i led rimangono spenti e basta.
Avatar utente
Foto UtenteEcoTan
5.262 4 10 13
Expert EY
Expert EY
 
Messaggi: 3089
Iscritto il: 29 gen 2014, 8:54

1
voti

[17] Re: control reaches end

Messaggioda Foto UtenteIlGuru » 13 gen 2019, 17:48

Intanto bisogna sapere se il main viene eseguito come una funzione, quindi con una call e poi terminato con una return, oppure se è codice che inizia dall indirizzo 0 del program counter. Nel secondo caso se la memoria flash non contiene istruzioni dopo quelle compilate, ipotizzo che esegua nop incrementando il program counter fino a ripartire da 0x0000
Se la flash non conteneva nop, perché prima c'era dell'altro codice flashato, potrebbe eseguire del codice dagli effetti impredicibili. Nell altro caso bisogna capire dove finisce il program counter dopo che ritorna dalla funzione main. Io credo che continui a resettarsi riinizializzando le periferiche, spiegherebbe la luce fioca del led.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
3.930 1 9 13
Master
Master
 
Messaggi: 1255
Iscritto il: 31 lug 2015, 23:32

0
voti

[18] Re: control reaches end

Messaggioda Foto UtenteGuidoB » 13 gen 2019, 17:59

Anch'io ritengo che sia così.

Comunque un programma che gestisce un micro normalmente non va fatto terminare, ma girare all'infinito per gestire gli eventi che si presentano nel tempo.
Big fan of ƎlectroYou!
Avatar utente
Foto UtenteGuidoB
14,2k 6 12 13
G.Master EY
G.Master EY
 
Messaggi: 2198
Iscritto il: 3 mar 2011, 16:48
Località: Madrid

0
voti

[19] Re: control reaches end

Messaggioda Foto UtenteIlGuru » 13 gen 2019, 18:05

Per quanto sembri crudele nei loro confronti è così.
Devono essere tutti condannati come Sisifo ad eseguire sempre la stessa operazione.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
3.930 1 9 13
Master
Master
 
Messaggi: 1255
Iscritto il: 31 lug 2015, 23:32

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti