Files
E502_ADC_BF_PC_companion/x502api-1.1.34/lib/lcspec/lcspec.h

97 lines
4.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***************************************************************************//**
@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_ */