psyxsgp@otago.ac.nz (06/25/91)
Hi, Could anyone tell us how to zero align an array generated in C, but calling an assembler routine in tms320c30 code which does bit reversal. Have tried setting 'align' in the .cmd file used by the linker, unsuccessfully ..inspection of the .map file shows variables beginning at any memory location .. though I might have got things wrong there Thanks Stephen Pearce
mcmahan@netcom.COM (Dave Mc Mahan) (06/26/91)
In a previous article, psyxsgp@otago.ac.nz writes: >Hi, > Could anyone tell us how to zero align an array >generated in C, but calling an assembler routine in >tms320c30 code which does bit reversal. One way to long word-align an array is to put it in a seperate segment, and then ensure that the segement starts on the proper boundry. Failing that, you can do it at run-time. The code isn't pretty, but it does work. The trick to this is to declare an array that is 4 bytes larger than you really need. You then set a pointer to the first location in the array, add 4 to the pointer, and then logically AND the pointer with ~(3) to force it to contain a value that MUST fall on the proper boundry. This gets a little messy if you have strict type-checking, but fortunately 'C' doesn't do that. The code might be something like this: #define MYSIZE 100 /* Size in bytes you want, not size of longwords you will eventually use. */ static char dumb_array[MYSIZE+4]; long *ptr_to_use; main() { /* Notice the use of casting to prevent the compiler from complaining about the fast-and-loose type conversions. */ ptr_to_use = (long *)(&dumb_array[4]); ptr_to_use = (long *)((long)ptr_to_use & ~3L); ptr_to_use[0] = 6; ptr_to_use[24] = 9943; /* This is the last element of the array that you can safely use. Anything bigger may fall outside the declared array. */ } Caveat: I haven't compiled this example, but it should work. I have used this technique before when I had to force alignment within my data and couldn't get the compiler to do it for me. >Stephen Pearce -dave -- Dave McMahan mcmahan@netcom.com {apple,amdahl,claris}!netcom!mcmahan
aep@world.std.com (Andrew E Page) (06/28/91)
In article <1991Jun26.052754.5772@netcom.COM> mcmahan@netcom.COM (Dave Mc Mahan) writes: > > In a previous article, psyxsgp@otago.ac.nz writes: >>Hi, >> Could anyone tell us how to zero align an array >>generated in C, but calling an assembler routine in >>tms320c30 code which does bit reversal. > >One way to long word-align an array is to put it in a seperate segment, >and then ensure that the segement starts on the proper boundry. Failing >that, you can do it at run-time. The code isn't pretty, but it does work. ^^^^^^^^^ Bear in mind that ALL words in a TMS320C30 (chars, ints, longs) are always going to be 32bits in length. There is no need to allign data generated in C~r (for the C30 thatis) in order to align in in it's memory. Second... The ALIGN operator in the cmd linker aligns to PAGE boundaries which are necessary for bit reverse and circular address buffers. Third: IN the originail posting when you said 'zero align' exactly what do you mean by this? -- Andrew E. Page (Warrior Poet) | Decision and Effort The Archer and Arrow Concepts Enginerring | The difference between what we are Macintosh and DSP Technology | and what we want to be.