реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Приемы работы со структурами из gas, облегчить тяжкий труд :)
_Pasha
сообщение Dec 17 2008, 11:43
Сообщение #1


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Доброго времени!
Поделитесь, пожалуйста, способами красивой работы, а то ручками смертельно надоело
Сишный хедер для совместного использования с асмом
Код
#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() не пойдут. Только ручками. Кто боролся с такой задачей?
Go to the top of the page
 
+Quote Post
Diz
сообщение Dec 18 2008, 00:29
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



Использую небольшие скрипты на 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]
...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 18 2008, 16:40
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Спасибо, но это весьма ограничено. Представьте себе ситуевину, когда dds.h погряз в зависимостях, например, от size_t, или от размеров указателей, и так включаются новые и новые хедеры... а потом бац - не собираеццо, потому что подрались два стандартных файла crying.gif
Может, у кого есть мысли, можно ли как-то поизвращаться в рамках одного тулчейна?
Go to the top of the page
 
+Quote Post
Diz
сообщение Dec 18 2008, 17:06
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



Лишнее из хедера можно спрятать через #ifdef _CH_, а вот с зависимостями структуры от других типов, конечно, непросто.
Буду рад услышать о лучшем способе :-)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 18 2008, 19:45
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Пошел я по такому пути.
1.Взял секцию .signature (бред, конечно, но пока переписывать линкера не стал) и направил туда ASCII-строку. По-правильному надо делать фиктивную секцию, которая не входит в бинарник, за .signature
2. Вставил в мейк вызов avr-strings. Она мне выдала мою строку. Теперь дело техники. По-крайней мере весь затык был в невозможности использования offsetof.
Теперь такая возможность есть.java script:emoticon(':yeah:', 'smid_28')
Go to the top of the page
 
+Quote Post
Diz
сообщение Dec 28 2008, 20:25
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



Попался на глаза отличный способ - не выходит за рамки тулчейна и
не замусоривает секции.

http://blogs.sun.com/nickstephen/entry/som...required_-_down
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 22:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01301 секунд с 7
ELECTRONIX ©2004-2016