 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Čet Jan 10, 2008 9:39 pm Naslov sporočila: Ojej, C velika tezava malega mojstra |
|
|
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
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 |
|
 |
piflar Član

Pridružen-a: Čet 06 Dec 2007 17:56 Prispevkov: 246 Aktiv.: 1.15 Kraj: Krško
|
Objavljeno: Čet Jan 10, 2008 11:52 pm Naslov sporočila: |
|
|
Citiram: |
*(buf+i)=*(buff+i); |
Tole pa prvič vidim. Kaj naj bi ta vrstica počela?
edit: Eh, že vidim, tazadnji ma dva fja. Kopiraš... nea vem kaj je tu narobe. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70653.18
|
Objavljeno: Pet Jan 11, 2008 12:04 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.65 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Pet Jan 11, 2008 11:05 am Naslov sporočila: |
|
|
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 |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Pet Jan 11, 2008 11:08 am Naslov sporočila: |
|
|
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
Cudi pa me, da ko jo prej klicem (v mainu) deluje povsem normalno! _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Pet Jan 11, 2008 11:29 am Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Pet Jan 11, 2008 11:42 am Naslov sporočila: |
|
|
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 |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.65 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Pet Jan 11, 2008 12:30 pm Naslov sporočila: |
|
|
Ali pri ReadPage(unsigned long... na koncu namenoma manjka return(0) ?
ProgramPage (unsigned long ... ga ima.
Jur
_________________
Koda: |
return(fucked_stack) |
|
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Pet Jan 11, 2008 12:41 pm Naslov sporočila: |
|
|
jur je napisal/a: |
Ali pri ReadPage(unsigned long... na koncu namenoma manjka return(0) ?
|
ReadPage je void funkcija ...
LP! |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Pet Jan 11, 2008 12:44 pm Naslov sporočila: |
|
|
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 |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Pet Jan 11, 2008 12:54 pm Naslov sporočila: |
|
|
A si poizkusil iti po korakih skozi kodo? Pri katerem ukazu ti pa procesor skoči na naslov 0?
LP! |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Pet Jan 11, 2008 1:25 pm Naslov sporočila: |
|
|
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 |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.65 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Pet Jan 11, 2008 1:37 pm Naslov sporočila: |
|
|
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 |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Pet Jan 11, 2008 1:47 pm Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Pet Jan 11, 2008 2:22 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|