Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Приемы работы со структурами из gas
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
_Pasha
Доброго времени!
Поделитесь, пожалуйста, способами красивой работы, а то ручками смертельно надоело
Сишный хедер для совместного использования с асмом
Код
#ifndef __ASSEMBLER__
typedef struct
{
int16_t  fld1;
uint8_t  fld2;
} record_t;
/**************/
record_t var1,var2;
#else
#define fld1 0
#define fld2 2
.extern var1,var2
#endif

Проблема в том, что препроцессор ведь работает только на уровне текста, он ничего не вычисляет. Поэтому всякие там offsetof() не пойдут. Только ручками. Кто боролся с такой задачей?
Diz
Использую небольшие скрипты на 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]
...
_Pasha
Спасибо, но это весьма ограничено. Представьте себе ситуевину, когда dds.h погряз в зависимостях, например, от size_t, или от размеров указателей, и так включаются новые и новые хедеры... а потом бац - не собираеццо, потому что подрались два стандартных файла crying.gif
Может, у кого есть мысли, можно ли как-то поизвращаться в рамках одного тулчейна?
Diz
Лишнее из хедера можно спрятать через #ifdef _CH_, а вот с зависимостями структуры от других типов, конечно, непросто.
Буду рад услышать о лучшем способе :-)
_Pasha
Пошел я по такому пути.
1.Взял секцию .signature (бред, конечно, но пока переписывать линкера не стал) и направил туда ASCII-строку. По-правильному надо делать фиктивную секцию, которая не входит в бинарник, за .signature
2. Вставил в мейк вызов avr-strings. Она мне выдала мою строку. Теперь дело техники. По-крайней мере весь затык был в невозможности использования offsetof.
Теперь такая возможность есть.java script:emoticon(':yeah:', 'smid_28')
Diz
Попался на глаза отличный способ - не выходит за рамки тулчейна и
не замусоривает секции.

http://blogs.sun.com/nickstephen/entry/som...required_-_down
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.