2009-07-30 10:41 AM
GNU assembler and symbolic names
2011-05-17 04:18 AM
Hi
Because of frequency and complexity interrupt handle routine I must write it in assembly language (Raisonance Ride7 and GNU toolchain). In this routine I want to access a number of external variables, so it's addresses need to be shared within routine. I know there is ability to pass the parameters through registers, but in that case at least one processor register stay unusable. Is there any other way? Is there any way to make the C preprocessor symbolic names ''visible'' within assembler sources? Best regards2011-05-17 04:18 AM
Preferably both, but I'm afraid it's impossible. Macros would be
very useful...2011-05-17 04:18 AM
Quote:
Is there any way to make the C preprocessor (sic?) symbolic names ''visible'' within assembler sources?
Do you really mean pre-processor there; ie, names created with #define ? Or do you mean compiler symbols?2011-05-17 04:18 AM
Hi,
If I understand your question correctly, you just want to access a global variable declared in C from an assembler routine. Is that what you mean? If yes, then you just need to declare the variable as extern at the start of your assembler file, or in an include, like this: .extern mydata You can find examples of that in the sources of the startup and library files in this directory: \lib\ARM\... Note that you must be careful that your assembler routine accesses the variable using the correct type, size, endianness, etc. The assembler does not check that for you like the compiler would. Finally, note that if the ISR is complex, then probably the compiler would do a better job than you at writing it. Here is how I would proceed: 1. write the ISR in C and validate it except for speed issues. activate speed opti mode and validate the ISR again, still ignoring speed issues. 2. activate the 'save temp files' option, that will tell the compiler to keep the temporary assembler file that it generates during compile. 3. in your project, replace the C file referenced in 1. by the asm file referenced in 2., and optimize it by hand if you see that you can do better than the compiler This is probably the fastest, safest and most efficient way to proceed in your situation. I hope it helps. Best Regards, Vincent2011-05-17 04:18 AM
VincentC, andreas1,
tkanks for your help. Of course, a symbolic names works as VincentC wrote, especially those declared in the same module, even without the ''.extern'' directive. I don't uderstand why it doesn't work for me before i I've posted my first message on this forum. Very strange... Thanks for your optimisation guidelines. I tried compiler abilities, but it too often use the memory for storing data, regardles of register variables declarations. So i wrote whole procedure in pure assembler and the result seems to be very interesting. If you want to see it, I'll share it with pleasure. My experience with GCC isn't so big, but it's my first, based on ARM project. I hope I will learn it better. Thanks again. Best regards.2011-05-17 04:18 AM
Also, of course there are macros in the GNU assembler. They don't use the same syntax as the C macros (''.if(something)'' instead of ''#if something'', etc.) but they provide pretty much the same features.
See the assembler files provides in Ride for examples, and of course the assembler doc. ;)2011-05-17 04:18 AM
Note that the GNU C preprocessor can be used with assembly files as well, albeit in a somewhat limited fashion. Just name your assembly files with extension .S instead of .s, or pass ''-x assembler-with-cpp'' to gcc if your file system doesn't preserve case.
I often find it more convenient to use inline assembly instead of a separate assembly file. But then it's often about a few lines of code that can't be implemented in C (access special instructions, OS kernels, cycle exact timing, ...). I wouldn't want to write a large function in pure assembler anyway. The compiler does that job way better and my efforts can instead be used for algorithmic optimizations which often give far more bang for the buck. If you really need to save those cycles, well... Profile, find a hot spot where the compiler generates sub-optimal code, and rewrite that little bit in inline assembler, based on the compiler output. But try again with the latest compiler before you do.2011-05-17 04:19 AM
If you made a significant improvement from the compiler generated code, it would be interesting too see both the C and the asm implementations for comparison.
2011-05-17 04:19 AM
With pleasure, as soon as I'll be back from my holiday. Tomorrow I'm going
on mountains :) Best regards