From: Muller J. <jjm...@su...> - 2004-09-28 10:36:47
|
Once again, thanks for all the help. It really helps a lot, and I'm learning fast. 1) The linker complains about the "__sdcc_gsinit_startup" label when I link ivect.asm with the rest of my project (?Aslink-Warning-Undefined Global '__sdcc_gsinit_startup' referenced by module 'ivect'). If I do not use the 'g' option when I assemble ivect.asm, there are no warnings, but then my program doesn't work either, so obviously the _sdcc_gsinit_startup symbol was not resolved during linking. In this case, I took a look at the hex file - it starts with a ljmp to 0x000 instead of to _sdcc_gsinit_startup. When I replace _sdcc_gsinit_startup with _main the program works fine, but I guess one would need to jump to the global & static initialisation functions before going on to main(). What am I doing wrong? 2)I placed #prama noiv just before main() but the orginal interrupt vector table remains, so this must be a bug. 3) Why don't I see the any of the custom interupt vector table assembly code in the main.lst file? The only hint that it has been added is if you take a look at the .map file, where there is an IVECT area, address and size declared, and where it has been added to the end of the hex file? -----Original Message----- From: sdc...@li... [mailto:sdc...@li...] On Behalf Of Erik Petrich Sent: 28 September 2004 05:34 AM To: sdc...@li... Subject: Re: [Sdcc-user] Custom interrupt vector table On Mon, 27 Sep 2004, Muller Jaco <jjm...@su...> wrote: > I'm a complete novice to assembly programming, so any advice, examples > or links to helpful docs will be appreciated! >=20 > I need help writing a custom interrupt vector table that must be=20 > linked to my own program. I noticed that there is quite a number of=20 > posted messages regarding this, but I can't find anything to work=20 > from. >=20 [examples omitted] >=20 > Or do I write something direcly in assembly and use the assembler, and > how does one do this? Although it is mentioned, there is nothing=20 > further in the SDCC manual to help me. Put this in a file called ivect.asm: .module ivect .area IVECT (CODE) ljmp __sdcc_gsinit_startup reti .ds 7 ljmp _timer0_ISR .ds 5 reti .ds 7 ljmp _timer1_ISR .ds 5 reti .ds 7 reti .ds 7 reti .ds 7 reti .ds 7 ljmp _usr_ISR .ds 5 reti .ds 7 ljmp _fifo_ISR Then assemble it with the command: asx8051 -plosgff ivect.asm When you link it with the rest of your project, you'll need to use another command line option so that it isn't located with the rest of the code. For simplicity, assume there is only one other file to be linked (main.rel) and that the rest of the code should start at 0x2000: sdcc -Wl-bIVECT=3D0 --code-loc 0x2000 main.rel ivect.rel The -Wl prefix tells the compiler that the rest of that option should be passed to the linker. The -bIVECT=3D0 tells the linker to start the area named "IVECT" at address 0. The compiled C code (and the default interrupt vector table generated by the compiler) goes into an area named "CSEG"; the compiler automatically generates the linker option -bCSEG=3D0x2000 (or whatever address is specified for --code-loc). > And some more questions (!): > 1) How do I use labels like _sdcc_gsinit_startup or _timer0_ISR (for=20 > my ISR functions) in the external interrupt table so that the linker=20 > will find my ISR functions when I link my interrupt table to my main=20 > program? As long as the "g" option is specified to the assembler (it's in the middle of the "-plosgff" in my example above), it will assume that any undefined symbol in that file will be resolved during linking. > According to the SDCC manual, the inline assembler cannot reference=20 > any C-labels. This refers to labels as defined by the C language (the target of a goto statement), not the assembly language labels that the compiler generates for symbols and functions. Assuming you know how the compiler mangled the name to create the assembly label, you can reference it from assembly. > 2) #pragma noiv is supposed to omit the default interrupt vector=20 > table, but I can still see the interrupt table appearing in the .lst=20 > file. Where does one place #pragma statements? This is probably a bug; I will look at this further. Other than wasting some code memory, this should not be a significant problem or conflict (as long as they are at different addresses) with the custom vector table. Generally, #pragma statements should be placed outside of a function and before any functions they should affect. In the case of #pragma noiv, it should be in the file containing main(). > 3)How will the linker/compiler know to place my custom interrupt table > at location 0x0000 when I place my main program in external memory,=20 > using --code-loc 0x2000 ? Can I specify a code location for each when=20 > I compile them? Yes; answered aboved. Erik ------------------------------------------------------- This SF.Net email is sponsored by: YOU BE THE JUDGE. Be one of 170 Project Admins to receive an Apple iPod Mini FREE for your judgement on who ports your project to Linux PPC the best. Sponsored by IBM. Deadline: Sept. 24. Go here: http://sf.net/ppc_contest.php _______________________________________________ Sdcc-user mailing list Sdc...@li... https://lists.sourceforge.net/lists/listinfo/sdcc-user |