manually merged with ARM version
This commit is contained in:
96
x502api-1.1.34/lib/lcspec/lcspec.h
Normal file
96
x502api-1.1.34/lib/lcspec/lcspec.h
Normal file
@ -0,0 +1,96 @@
|
||||
/***************************************************************************//**
|
||||
@file lcspec.h
|
||||
Файл вместе с файлами из подкаталога с именем компилятора определяет набор
|
||||
макросов и заголовочных файлов для выполнения действий, которые определяются
|
||||
специфичным для компилятора способом:
|
||||
- упаковка структур
|
||||
- выравнивание переменных
|
||||
- определение inline-функций
|
||||
|
||||
Для задания упаковки структур используются два файла lcspec_pack_start.h и
|
||||
lcspec_pack_restore.h для возможности указать упаковку через \#pragma.
|
||||
Кроме того используется определение #LATTRIBUTE_PACKED для определения
|
||||
упаковки с помощью атрибутов (как в gcc).
|
||||
Упакованная структура должна быть обявлена следующим образом :
|
||||
|
||||
@code
|
||||
#include "lcspec_pack_start.h"
|
||||
|
||||
struct struct_name {
|
||||
...
|
||||
} LATTRIBUTE_PACKED;
|
||||
typedef struct struct_name type_name;
|
||||
|
||||
...
|
||||
|
||||
#include "lcspec_pack_restore.h"
|
||||
@endcode
|
||||
|
||||
Выравнивание на n байт выполняется также через включение файла с предварительным
|
||||
определением границы выравнивания через LSPEC_ALIGNMENT.
|
||||
Ниже объявлены две переменные с выравниванием 128 байт:
|
||||
@code
|
||||
#define LSPEC_ALIGNMENT 128
|
||||
#include "lcspec_align.h"
|
||||
int v1;
|
||||
#include "lcspec_align.h"
|
||||
unsigned v2;
|
||||
#undef LSPEC_ALIGNMENT
|
||||
@endcode
|
||||
|
||||
Для встроенных функций определено определение #LINLINE, которое должно быть указано
|
||||
в начале определения функции перед типом возвращаемого значения
|
||||
(после слова static для статической функции)
|
||||
|
||||
На настоящий момент реализованы определения для GCC, IAR, MSVC, OpenWatcom и LabWindow/CVI.
|
||||
|
||||
@author Borisov Alexey <borisov@lcard.ru>
|
||||
@date 10.01.2011
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef LCSPEC_H_
|
||||
#define LCSPEC_H_
|
||||
|
||||
#if defined ( __GNUC__ )
|
||||
/*------------------------ определения GCC -------------------------------*/
|
||||
#define LINLINE inline
|
||||
#define LATTRIBUTE_PACKED __attribute__ ((packed))
|
||||
#elif defined ( _MSC_VER )
|
||||
/*------------------------ определения MSVC ------------------------------*/
|
||||
#define LINLINE __inline
|
||||
#define LATTRIBUTE_PACKED
|
||||
/*------------------------ Watcom/Open Watcom ----------------------------*/
|
||||
#elif defined ( _WATCOMC_ ) || defined (__WATCOMC__)
|
||||
#define LINLINE __inline
|
||||
#define LATTRIBUTE_PACKED
|
||||
#elif defined ( _CVI_ )
|
||||
/*------------------- определения для LabWindow/CVI ----------------------*/
|
||||
#define LINLINE inline
|
||||
#define LATTRIBUTE_PACKED
|
||||
#elif defined ( __CC_ARM )
|
||||
#error "cc arm compiler spec. is't defined"
|
||||
#elif defined ( __ICCARM__ )
|
||||
#define LINLINE inline
|
||||
#define LATTRIBUTE_PACKED
|
||||
#elif defined ( __TASKING__ )
|
||||
#error "tasking compiler spec. is't defined"
|
||||
#else
|
||||
#error "compiler is't specified"
|
||||
|
||||
|
||||
/** Определение встраиваемой (inline) функции */
|
||||
#define LINLINE inline
|
||||
/** Определение упакованной структуры через атрибут в конце структуры (как в GCC).
|
||||
Если не используется, то этот макрос должен быть определен как пустой. */
|
||||
#define LATTRIBUTE_PACKED __attribute__ ((packed))
|
||||
#endif
|
||||
|
||||
|
||||
/* теперь вместо определения содержимого\#pragma используются include-файлы
|
||||
* (так как предыдущий вариант работал не на всех компиляторах) */
|
||||
#define LPRAGMA_PACKED error: you must use new syntax for packed structs
|
||||
#define LPRAGMA_PACK_RESTORE error: you must use new syntax for packed structs
|
||||
#define LALIGN error: you must use new syntax for aligned variables
|
||||
|
||||
|
||||
#endif /* LCSPEC_H_ */
|
||||
Reference in New Issue
Block a user