From: Johannes S. <js...@co...> - 2003-02-03 16:55:40
Attachments:
sdcc-20030131-noiv.patch
|
Hi, The attached patch adds a #pragma NOIV to sdcc, which prevents sdcc from generating irq vector table entries for functions declared as "interrupt". The patch is agains sdcc CVS from a few days ago. Here's why we need it: We are writing a firmware for a DVB-T - USB receiver based on the Cypress EZ-USB FX2 (DVB == digital video broadcast). All software and hardware schematics are GPLed and hosted on linuxtv.org CVS (CVS module dvb-hw). The EZ-USB FX2 has a 8051 core derived from the Dallas DS80C320, plus FIFOs and interface hardware for handling USB-2.0 high speed data transfers. To reduce processing overhead in the USB irq handler for finding out which of the 27 possible sources caused the USB irq, the EZ-USB FX2 has an autovector feature which works like this: - in the irq vector table there is a LJMP 0xHHLL - the hardware replaces the low byte of the jump target address with an autovector number (which is a multiple of 4) - somewhere, beginning on a page boundary, there is a secondary irq vector table with LJMPs to the real irq handlers; this table is set up manually; the high byte of this table's address is put in the LJMP in the irq vector table The individual USB irq handlers still have to be declared as #pragma NOIV void foobar_irq(void) interrupt 0; The #pragma NOIV is modeled after the Keil tool's 8051 C compiler autovector support from the EZ-USB FX2 developer's kit. http://www.keil.com/dd/chip/3205.htm You can get the sources for our project (there isn't much software yet, just some basics) via CVS from cvs -d :pserver:ano...@cv...:/cvs/linuxtv co dvb-hw (login with empty password). See also http://linuxtv.org/cgi-bin/cvsweb.cgi/. The EZ-USB FX2 data sheet is available online from http://www.cypress.com/cfuploads/img/products/38-08012.pdf (~500K) http://www.cypress.com/cfuploads/support/developer_kits/FX2_TechRefManual.pdf (~5.5MB) I would be glad if you would accept my patch for sdcc. Or if you have better ideas about how to support the autovector irqs, please let me know. Best regards, Johannes |
From: Johannes S. <js...@co...> - 2003-02-10 15:09:57
|
Since my posting got ignored, I figure I just try again. If you don't like the patch, then please let me know why. Best regards, Johannes On Mon, Feb 03, 2003 at 05:54:32PM +0100, I wrote: > Hi, > > The attached patch adds a #pragma NOIV to sdcc, which > prevents sdcc from generating irq vector table entries > for functions declared as "interrupt". > The patch is agains sdcc CVS from a few days ago. > > Here's why we need it: > > We are writing a firmware for a DVB-T - USB receiver based > on the Cypress EZ-USB FX2 (DVB == digital video broadcast). > All software and hardware schematics are GPLed and hosted > on linuxtv.org CVS (CVS module dvb-hw). > > The EZ-USB FX2 has a 8051 core derived from the Dallas DS80C320, > plus FIFOs and interface hardware for handling USB-2.0 > high speed data transfers. To reduce processing overhead > in the USB irq handler for finding out which of the 27 possible > sources caused the USB irq, the EZ-USB FX2 has an autovector > feature which works like this: > > - in the irq vector table there is a > LJMP 0xHHLL > - the hardware replaces the low byte of the jump target address > with an autovector number (which is a multiple of 4) > - somewhere, beginning on a page boundary, there is a > secondary irq vector table with LJMPs to the real > irq handlers; this table is set up manually; > the high byte of this table's address is put in the > LJMP in the irq vector table > > The individual USB irq handlers still have to be > declared as > #pragma NOIV > void foobar_irq(void) interrupt 0; > > The #pragma NOIV is modeled after the Keil tool's 8051 C compiler > autovector support from the EZ-USB FX2 developer's kit. > http://www.keil.com/dd/chip/3205.htm > > You can get the sources for our project (there isn't much > software yet, just some basics) via CVS from > cvs -d :pserver:ano...@cv...:/cvs/linuxtv co dvb-hw > (login with empty password). > > See also http://linuxtv.org/cgi-bin/cvsweb.cgi/. > > The EZ-USB FX2 data sheet is available online from > http://www.cypress.com/cfuploads/img/products/38-08012.pdf (~500K) > http://www.cypress.com/cfuploads/support/developer_kits/FX2_TechRefManual.pdf (~5.5MB) > > > I would be glad if you would accept my patch for sdcc. Or if you have > better ideas about how to support the autovector irqs, please > let me know. > > > Best regards, > Johannes > Index: doc/sdccman.lyx > =================================================================== > RCS file: /cvsroot/sdcc/sdcc/doc/sdccman.lyx,v > retrieving revision 1.4 > diff -u -p -r1.4 sdccman.lyx > --- doc/sdccman.lyx 30 Oct 2001 14:53:49 -0000 1.4 > +++ doc/sdccman.lyx 31 Jan 2003 14:03:43 -0000 > @@ -5528,6 +5528,13 @@ EXCLUDE\SpecialChar ~ > none. > \layout Itemize > > +NOIV - Do not generate interrupt vector table entries for all ISR functions > + defined after the pragma. This is useful in cases where the interrupt > + vector table must be defined manually, or when there is a secondary, manually > + defined interrupt vector table (e.g. for the autovector feature of the Cypress > + EZ-USB FX2). > +\layout Itemize > + > CALLEE-SAVES function1[,function2[,function3...]] - The compiler by default > uses a caller saves convention for register saving across function calls, > however this can cause unneccessary register pushing & popping when calling > Index: src/SDCC.lex > =================================================================== > RCS file: /cvsroot/sdcc/sdcc/src/SDCC.lex,v > retrieving revision 1.34 > diff -u -p -r1.34 SDCC.lex > --- src/SDCC.lex 28 Jan 2003 18:44:42 -0000 1.34 > +++ src/SDCC.lex 31 Jan 2003 14:03:43 -0000 > @@ -76,6 +76,7 @@ struct options save_options ; > P_NOGCSE , > P_CALLEE_SAVES, > P_EXCLUDE , > + P_NOIV , > P_LOOPREV , > P_OVERLAY_ /* I had a strange conflict with P_OVERLAY while */ > /* cross-compiling for MINGW32 with gcc 3.2 */ > @@ -458,6 +459,9 @@ void doPragma (int op, char *cp) > case P_EXCLUDE: > parseWithComma(options.excludeRegs, Safe_strdup(cp)); > break; > + case P_NOIV: > + options.noiv = 1; > + break; > case P_LOOPREV: > optimize.noLoopReverse = 1; > break; > @@ -540,6 +544,11 @@ int process_pragma(char *s) > > if (strncmp(cp,PRAGMA_EXCLUDE,strlen(PRAGMA_EXCLUDE)) == 0) { > doPragma(P_EXCLUDE,cp+strlen(PRAGMA_EXCLUDE)); > + return 0; > + } > + > + if (strncmp(cp,PRAGMA_NOIV,strlen(PRAGMA_NOIV)) == 0) { > + doPragma(P_NOIV,cp+strlen(PRAGMA_NOIV)); > return 0; > } > > Index: src/SDCCglobl.h > =================================================================== > RCS file: /cvsroot/sdcc/sdcc/src/SDCCglobl.h,v > retrieving revision 1.60 > diff -u -p -r1.60 SDCCglobl.h > --- src/SDCCglobl.h 29 Jan 2003 18:26:34 -0000 1.60 > +++ src/SDCCglobl.h 31 Jan 2003 14:03:43 -0000 > @@ -97,6 +97,7 @@ typedef int bool; > #define PRAGMA_NOOVERLAY "NOOVERLAY" > #define PRAGMA_CALLEESAVES "CALLEE-SAVES" > #define PRAGMA_EXCLUDE "EXCLUDE" > +#define PRAGMA_NOIV "NOIV" > #define PRAGMA_OVERLAY "OVERLAY" > #define SMALL_MODEL 0 > #define LARGE_MODEL 1 > @@ -236,6 +237,7 @@ struct options > int useAccelerator; /* use ds390 Arithmetic Accelerator */ > char *calleeSaves[128]; /* list of functions using callee save */ > char *excludeRegs[32]; /* registers excluded from saving */ > + int noiv; /* do not generate irq vector table entries */ > int all_callee_saves; /* callee saves for all functions */ > int stack_probe; /* insert call to function __stack_probe */ > int tini_libid; /* library ID for TINI */ > Index: src/SDCCmem.c > =================================================================== > RCS file: /cvsroot/sdcc/sdcc/src/SDCCmem.c,v > retrieving revision 1.52 > diff -u -p -r1.52 SDCCmem.c > --- src/SDCCmem.c 4 Sep 2002 09:50:24 -0000 1.52 > +++ src/SDCCmem.c 31 Jan 2003 14:03:43 -0000 > @@ -322,7 +322,7 @@ allocGlobal (symbol * sym) > SPEC_OCLS (sym->etype) = code; > /* if this is an interrupt service routine > then put it in the interrupt service array */ > - if (FUNC_ISISR (sym->type)) > + if (FUNC_ISISR (sym->type) && !options.noiv) > { > > if (interrupts[FUNC_INTNO (sym->type)]) |
From: Bernhard H. <Ber...@be...> - 2003-02-10 15:26:18
|
> Since my posting got ignored, I figure I just try again. > If you don't like the patch, then please let me know why. No, your patch is on my list. It could already be in CVS, but "patch" doesn't accept the diff from cvs. It would be a great help, if you could send me a real diff. Bernhard |
From: Bernhard H. <ber...@be...> - 2003-02-10 20:54:59
|
> > Since my posting got ignored, I figure I just try again. > > If you don't like the patch, then please let me know why. > > No, your patch is on my list. > > It could already be in CVS, but "patch" doesn't accept the diff from cv= s. > It would be a great help, if you could send me a real diff. It is a "real diff", I was too stupid to figure out the right -p-level. Thanks for your contribution Johannes. The patch included even an update = for=20 sdccman.lyx, this makes it to an ideal example! Bernhard P.S.: Gef=FChlsm=E4=DFig hat Dein Englisch einen bayrischen Einschlag. Li= eg ich da=20 richtig? |