www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Ojej, C velika tezava malega mojstra
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4770
Aktiv.: 20.09
Kraj: Kobarid

PrispevekObjavljeno: Čet Jan 10, 2008 9:39 pm    Naslov sporočila: icon_sad Ojej, C velika tezava malega mojstra Odgovori s citatom

Pozdrav
Ze 3. dni se mucim, pa zadevi ne pridem do dna. Gre za za en pojav, ki si ga ne znam razloziti.
Program deluje tako, da prvo iz main klice inicalizacijo, kar nastavi pac rabi (INT0, 2, 3 in RTC, ter nastavi vse pine) potem (v main) klice branje flasha. Potem program tece v main v neskoncni zanki. Po dolocenem casu (RTC) prekinitev postavi zastavico o prekinitvi ter seveda pocistimo za sabo in se vrnemo v main. Potem , ko main opazi zastavico klice rutino, kjer ponovno bere flash. Iz te rutine pa se ne vrne nazaj v main temvec gre na PC 0x00 (reset addr)?!?!?!?! To sem opazil iz simulatorja.
Ce pa umaknem branje flasha zadeva dela povsem normalno. Se pravi je nekaj tu narobe. Ni mi pa jasno, zakaj prvo povsem normano prebere v drugic pa noce Evil or Very Mad
Prilagam mojo IAP kodo
Koda:
int EraseSector (void)
{
  unsigned int save_VicInt;                // for saving of interrupt enable register
  save_VicInt = VICIntEnable;              // save interrupt enable status
  VICIntEnClr = 0xFFFFFFFF;                // disable all interrupts


  IAP.cmd    = PREPARE_FOR_WRITE;              /* Prepare Sector          */
  IAP.par[0] = START_SECTOR;                   /* Start Sector*/
  IAP.par[1] = END_SECTOR;                     /* End Sector               */
  IAP_Execute (&IAP);                         /* Execute IAP Command      */
  if (IAP.stat) return (1);                    /* Command Failed         */

  IAP.cmd    = ERASE_SECTOR;                   /* Erase Sector            */
  IAP.par[0] = START_SECTOR;                   /* Start Sector            */
  IAP.par[1] = END_SECTOR;                     /* End Sector             */
  IAP.par[2] = ECLK;                            /* CCLK in kHz            */
  IAP_Execute (&IAP);                         /* Execute IAP Command      */
  if (IAP.stat) return (1);                    /* Command Failed         */

  VICIntEnable = save_VicInt;              // enable interrupts

  return (0);                                  /* Finished without Errors  */
}

int ProgramPage (unsigned long addr, unsigned long *buf,unsigned int size)
{
//  unsigned int save_VicInt;                // for saving of interrupt enable register
//  save_VicInt = VICIntEnable;              // save interrupt enable status
//  VICIntEnClr = 0xFFFFFFFF;                // disable all interrupts

  IAP.cmd    = PREPARE_FOR_WRITE;              /* Prepare Sector for Write  */
  IAP.par[0] = START_SECTOR;                   /* Start Sector            */
  IAP.par[1] = END_SECTOR;                     /* End Sector             */
  IAP_Execute(&IAP);                           /* Execute IAP Command      */
  if (IAP.stat) return (1);                    /* Command Failed         */

  IAP.cmd    = COPY_RAM_TO_FLASH;              /* Copy RAM to Flash         */
  IAP.par[0] = addr;                           /* Destination Flash Address   */
  IAP.par[1] = (unsigned long)buf;             /* Source RAM Address      */
  IAP.par[2] = size;                            /* Fixed Page Size         */
  IAP.par[3] = ECLK;                            /* CCLK in kHz            */
  IAP_Execute(&IAP);                          /* Execute IAP Command      */
  if (IAP.stat) return (1);                    /* Command Failed          */

//  VICIntEnable = save_VicInt;              // enable interrupts

  return (0);                                  /* Finished without Errors   */
}


void ReadPage(unsigned long addr, unsigned long *buf,unsigned int size)
{
  unsigned int save_VicInt;                // for saving of interrupt enable register
  unsigned int i=0;
  unsigned long *buff;
  save_VicInt = VICIntEnable;              // save interrupt enable status
  VICIntEnClr = 0xFFFFFFFF;                // disable all interrupts
  buff = (unsigned long*)addr;
  for(i=0;i<size;i++)
      *(buf+i)=*(buff+i);
  VICIntEnable = save_VicInt;              // enable interrupts
}

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
piflar
Član
Član



Pridružen-a: Čet 06 Dec 2007 17:56
Prispevkov: 246
Aktiv.: 1.15
Kraj: Krško

PrispevekObjavljeno: Čet Jan 10, 2008 11:52 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
*(buf+i)=*(buff+i);
Tole pa prvič vidim. Kaj naj bi ta vrstica počela?

edit: Eh, že vidim, tazadnji ma dva fja. Laughing Kopiraš... nea vem kaj je tu narobe.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70653.30

PrispevekObjavljeno: Pet Jan 11, 2008 12:04 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.65
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Pet Jan 11, 2008 11:05 am    Naslov sporočila:   Odgovori s citatom

Zadeva se dogaja točno tako, kot da bi bil problem z stackom. Ne vprašaj pa kje je problem. Verjetno tale priložena koda tudi ni vsa koda...?

Jur
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4770
Aktiv.: 20.09
Kraj: Kobarid

PrispevekObjavljeno: Pet Jan 11, 2008 11:08 am    Naslov sporočila:   Odgovori s citatom

Mare hvala za odgovor.
1. v "realnem svetu" se procesor obesi. Se pravi simulacija drzi
2. ojoj, prosim nasvet, kako lahko preklopis v thumb nacin????
3. imam onemogocene ze pred klicanjem same IAP. Samo kar vidis to je vse posledica obupa in raznoraznih poiskusanj Sad

Cudi pa me, da ko jo prej klicem (v mainu) deluje povsem normalno!

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4770
Aktiv.: 20.09
Kraj: Kobarid

PrispevekObjavljeno: Pet Jan 11, 2008 11:29 am    Naslov sporočila:   Odgovori s citatom

Jur
Ta koda je vsa koda za pisanje v IAP (ki povzroca tezave)
Drugace koda celega programa pa je zelo dolga. Ne verjamem, da je tezave drugje, saj gre samo za enostavno klicanje podrutine, ki izvaja IAP branje flasha. Kot sem ze napisal, ce ne izvajam branja flasha zadeva tece normalno. No lahko prilozim se IAP.H
Koda:

#define ECLK (12000000/1000)  // kristal v Hz

/* IAP sector select, if the data in inside only one sector start_sector=end_sector */
#define START_SECTOR       10    //10
#define END_SECTOR         10    //10

/* define IAP commands */
#define PREPARE_FOR_WRITE    50
#define COPY_RAM_TO_FLASH    51
#define ERASE_SECTOR         52
#define BLANK_CHECK_SECTOR  53
#define READ_PART_ID       54
#define READ_BOOT_CODE_VER  55
#define COMPARE          56
#define REINVOKE_ISP       57

/* IAP execute data & funciton */

struct sIAP {                  /* IAP Structure */
  unsigned long cmd;           /* Command       */
  unsigned long par[4];        /* Parameters    */
  unsigned long stat;          /* Status        */
} IAP;


/*
 * IAP Execute
 *    Parameter:      pIAP:  Pointer to IAP
 *    Return Value:   None (stat in IAP)
 */

extern void IAP_Execute(struct sIAP *pIAP);

Sicer mi prevajalnik napise opozorilo
IAP.S: warning: A1608W: MOV pc,<rn> instruction used, but BX <rn> is preferred
To je del tu
Koda:
;/***********************************************************************/
;/*  This file is part of the ARM Toolchain package                     */
;/*  Copyright KEIL ELEKTRONIK GmbH 2003 - 2004                         */
;/***********************************************************************/
;/*                                                                     */
;/*  IAP.S:  IAP Execution Function                                     */
;/*                                                                     */
;/***********************************************************************/


                AREA    IAPEXE, CODE, READONLY


;void IAP_Execute (struct sIAP *pIAP);
                EXPORT  IAP_Execute

IAP_Execute     STMFD   SP!,{LR}               ; Save Return Address
                ADD     R1,R0,#0x14            ; R0 = &IAP.cmd, R1 = &IAP.stat
                ADR     LR,IAP_Exit            ; Return Address
                LDR     R2,=0x7FFFFFF1         ; IAP Entry (Thumb Mode)
                BX      R2                     ; Execute IAP Command

IAP_Exit        LDMFD   SP!,{LR}               ; Restore Return Address
                MOV     PC,LR                  ; Return


                END
ki pa je original keilova zadeva
_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Pet Jan 11, 2008 11:42 am    Naslov sporočila:   Odgovori s citatom

SimonS je napisal/a:
Mare hvala za odgovor.
2. ojoj, prosim nasvet, kako lahko preklopis v thumb nacin????


Kot pise v komentarju ob kodi, ki si jo pripel spodaj, je za to ze poskrbljeno.

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.65
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Pet Jan 11, 2008 12:30 pm    Naslov sporočila:   Odgovori s citatom

Ali pri ReadPage(unsigned long... na koncu namenoma manjka return(0) ?
ProgramPage (unsigned long ... ga ima.

Jur
_________________
Koda:
return(fucked_stack)
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pet Jan 11, 2008 12:41 pm    Naslov sporočila:   Odgovori s citatom

jur je napisal/a:
Ali pri ReadPage(unsigned long... na koncu namenoma manjka return(0) ?


ReadPage je void funkcija ...

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4770
Aktiv.: 20.09
Kraj: Kobarid

PrispevekObjavljeno: Pet Jan 11, 2008 12:44 pm    Naslov sporočila:   Odgovori s citatom

Jur
Ne je ze prav tako. To je samo zastavica o napaki. Klicanje ReadPage pa ne zahvteva povratne informacije

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pet Jan 11, 2008 12:54 pm    Naslov sporočila:   Odgovori s citatom

A si poizkusil iti po korakih skozi kodo? Pri katerem ukazu ti pa procesor skoči na naslov 0?

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4770
Aktiv.: 20.09
Kraj: Kobarid

PrispevekObjavljeno: Pet Jan 11, 2008 1:25 pm    Naslov sporočila:   Odgovori s citatom

Sel sem korak po koraku in na zadnjem zaklepaju, ko bi se moralo vrniti na main gre PC na 0x00. Prilagam se kodo
Koda:
void cas(void)   //tu nastavljamo rezim dela v dolocenem casovnem obdobju
   {
   unsigned char katira;
    unsigned char RAMdata[256];          
   unsigned int save_VicInt;                // for saving of interrupt enable register
   
     save_VicInt = VICIntEnable;              // save interrupt enable status
     VICIntEnClr = 0xFFFFFFFF;                // disable all interrupts
//      CCR = 0x2;                      
        ReadPage(0x00018000,(unsigned long*)RAMdata,256);  //branje iz FLASHa
   katira = stanje.rezim + 10;
   tnas = RAMdata[(katira+2)];
   ttol = RAMdata[(katira+3)];
   hnas = RAMdata[(katira+4)];
   htol = RAMdata[(katira+5)];

   ALSEC = RAMdata[katira];       
   ALMIN = RAMdata[(katira+1)];
   ILR =2;                        //brisemo prekinitve
//   CCR = 0x1;                      

     VICIntEnable = save_VicInt;              // enable interrupts

lcd_2_line();
      lcd_print ("sp");
katira =0;
   }

Sicer ena varjanta bi bila, da bi dal spremenljivko RAMdata (ki je vsebina flasha) kot globalno spremenljivko, ampak se mi zdi skoda rama

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.65
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Pet Jan 11, 2008 1:37 pm    Naslov sporočila:   Odgovori s citatom

V tej proceduri imaš zakomentirana disable in save interruptov (// VICIntEnClr = 0xFFFFFFFF; ), zato se lahko tukaj izvede nazaželjen interrupt..?

int ProgramPage (unsigned long addr, unsigned long *buf,unsigned int size)
{
// unsigned int save_VicInt; // for saving of interrupt enable register
// save_VicInt = VICIntEnable; // save interrupt enable status
// VICIntEnClr = 0xFFFFFFFF; // disable all interrupts

Jur


Nazadnje urejal/a jur Pet Jan 11, 2008 1:55 pm; skupaj popravljeno 2 krat
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pet Jan 11, 2008 1:47 pm    Naslov sporočila:   Odgovori s citatom

SimonS je napisal/a:
Sel sem korak po koraku in na zadnjem zaklepaju, ko bi se moralo vrniti na main gre PC na 0x00. Prilagam se kodo


V kodi ni videti nič posebnega. Bi lahko priložil še ISR-je? Obstaja možnost, da se ti interrupti vgnezdijo? Meni stvar deluje kot napačen izhod iz ISR-ja ...

Bi lahko prilepil registre procesorja, tik pred ukazom, ki postavi PC na 0? Pa še mogoče assembler tistega dela (konec funkcije)?

Aja - a si poizkusil funkcijo s tistim IAR-jevim keywordom __monitor ?

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Pet Jan 11, 2008 2:22 pm    Naslov sporočila:   Odgovori s citatom

SimonS je napisal/a:
Sel sem korak po koraku in na zadnjem zaklepaju, ko bi se moralo vrniti na main gre PC na 0x00. ...


Torej gre za povozen stack, tako kot je jur ze prej napisal. Glede na to, da CPU preklaplja med dvema nacinoma delovanja, je mozno, da vmes pregazni oz. spremeni vsebine kaksnih registrov (ali fizcno spremeni vsebino stacka ali pa spremeni stack pointer).

Poglej izvajanje cele funkcije (en opcode naenkrat) in spremljaj obnasanje stacka in kazalca nanj; tako bos videl od kje pride napacen return address.

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 6 dni


Powered by phpBB © 2001, 2005 phpBB Group