Использую небольшие скрипты на Ch, которые обсчитывают смещения в структуре
и кладут в отдельный файл. Скрипты вызываются из makefile.
Хедер со стуктурой подключается непосредственно в скрипт.
Пример скрипта, calc_dds_offsets.ch:
CODE
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <stddef.h>
#include "dds.h" // File containing struct to be processed
char * replace_dots( char * inStr)
{
char *inPtr = inStr ;
for ( ; *inStr; inStr++)
{
if ( *inStr == '.')
*inStr = '_' ;
}
return inPtr ;
}
#define print_offset( str, arg) fprintf( fileP, ".equ %s, %d \n\r", replace_dots(#arg), offsetof( str, arg))
int main( void)
{
FILE *fileP ;
char fileName[] = "dds_offsets.inc" ;
if ( (fileP = fopen( fileName, "wb")) == NULL )
{
printf( " Couldn't write to file %s.", fileName) ;
return 1 ;
}
print_offset( dds_t , A.Core.phaseInc) ;
print_offset( dds_t , B.Core.phaseInc) ;
print_offset( dds_t , C.Core.phaseInc) ;
print_offset( dds_t , A.wavePtr) ;
print_offset( dds_t , B.wavePtr) ;
fclose( fileP) ;
return 0 ;
}
dds_offsets.inc:
Код
.equ A_Core_phaseInc, 4
.equ B_Core_phaseInc, 36
.equ C_Core_phaseInc, 68
...
В ассемблере:
Код
#include "dds_offsets.inc"
...
ldr r1, [r0, #A_Core_phaseInc]
...