Xmega IEC60730 Class B Library
1.0
All
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
avr_compiler.h
Go to the documentation of this file.
1
/* This file has been prepared for Doxygen automatic documentation generation.*/
2
/**
3
* \file
4
*
5
* \brief
6
* Header file for compiler compatibility
7
*
8
* This file contains some general definitions and macros to ensure code
9
* compatibility with both IAR and GCC.
10
*
11
* \par Application note:
12
* AVR1610: Guide to IEC60730 Class B compliance with XMEGA
13
*
14
* \par Documentation
15
* For comprehensive code documentation, supported compilers, compiler
16
* settings and supported devices see readme.html
17
*
18
* \author
19
* Atmel Corporation: http://www.atmel.com \n
20
* Support email: avr@atmel.com
21
*
22
* Copyright (C) 2012 Atmel Corporation. All rights reserved.
23
*
24
* \page License
25
*
26
* Redistribution and use in source and binary forms, with or without
27
* modification, are permitted provided that the following conditions are met:
28
*
29
* 1. Redistributions of source code must retain the above copyright notice,
30
* this list of conditions and the following disclaimer.
31
*
32
* 2. Redistributions in binary form must reproduce the above copyright notice,
33
* this list of conditions and the following disclaimer in the documentation
34
* and/or other materials provided with the distribution.
35
*
36
* 3. The name of Atmel may not be used to endorse or promote products derived
37
* from this software without specific prior written permission.
38
*
39
* 4. This software may only be redistributed and used in connection with an
40
* Atmel AVR product.
41
*
42
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
43
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
44
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
45
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
46
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
48
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
49
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
52
* DAMAGE.
53
*/
54
55
56
57
#ifndef COMPILER_AVR_H
58
#define COMPILER_AVR_H
59
60
#include <stdint.h>
61
#include <stdbool.h>
62
#include <stdlib.h>
63
64
#ifndef F_CPU
65
# define F_CPU 2000000
66
#endif
67
68
#define STRINGIZE_AUX(X) #X
69
#define STRINGIZE(X) STRINGIZE_AUX(X)
70
#define CONCAT(X,Y,Z) X##Y##Z
71
#define LABEL(X,Y,Z) CONCAT(X,Y,Z)
72
73
74
75
76
/*! \brief Enable memory mapping of EEPROM, if it is not already enabled.
77
*
78
* \note Use this in conjunction with CLASSB_EEMAP_END() to ensure that the
79
* prior configuration of memory-mapping is preserved.
80
*/
81
#define CLASSB_EEMAP_BEGIN() \
82
bool eemapEnabled; \
83
/* Check if memory mapping of EEPROM is already enabled. */
\
84
eemapEnabled = (NVM.CTRLB & NVM_EEMAPEN_bm) ? true : false; \
85
\
86
if (!eemapEnabled) { \
87
/* Ensure that NVM is ready before enabling memory mapping. */
\
88
do {} while (NVM.STATUS & NVM_NVMBUSY_bm); \
89
NVM.CTRLB |= NVM_EEMAPEN_bm; \
90
}
91
92
/*! \brief Disable memory mapping of EEPROM, unless it was previously enabled.
93
*
94
* \note Use this in conjunction with CLASSB_EEMAP_BEGIN().
95
*/
96
#define CLASSB_EEMAP_END() \
97
if (!eemapEnabled) { \
98
NVM.CTRLB &= ~NVM_EEMAPEN_bm; \
99
}
100
101
102
/** This macro will protect the following code from interrupts.*/
103
#define ENTER_CRITICAL_REGION() uint8_t volatile saved_sreg = SREG; \
104
cli();
105
#define REENTER_CRITICAL_REGION() saved_sreg = SREG; \
106
cli();
107
108
/** This macro must always be used in conjunction with ENTER_CRITICAL_REGION
109
so that interrupts are enabled again.*/
110
#define LEAVE_CRITICAL_REGION() SREG = saved_sreg;
111
112
113
114
#if defined(__ICCAVR__)
115
116
117
118
#include <inavr.h>
119
#include <ioavr.h>
120
#include <intrinsics.h>
121
#include <pgmspace.h>
122
123
#ifndef __HAS_ELPM__
124
#define _MEMATTR __flash
125
#else
/* __HAS_ELPM__ */
126
#define _MEMATTR __farflash
127
#endif
/* __HAS_ELPM__ */
128
129
#define cpu_sleep() __sleep()
130
131
#define delay_us( us ) __delay_cycles((F_CPU / 1000000UL) * (us))
132
133
/**
134
* Some preprocessor magic to allow for a header file abstraction of
135
* interrupt service routine declarations for the IAR compiler. This
136
* requires the use of the C99 _Pragma() directive (rather than the
137
* old #pragma one that could not be used as a macro replacement), as
138
* well as two different levels of preprocessor concetanations in
139
* order to do both, assign the correct interrupt vector name, as well
140
* as construct a unique function name for the ISR.
141
*
142
* Do *NOT* try to reorder the macros below, or you'll suddenly find
143
* out about all kinds of IAR bugs...
144
*/
145
#define PRAGMA(x) _Pragma(#x)
146
#define ISR(vec) PRAGMA(vector=vec) __interrupt void handler_##vec(void)
147
#define sei() (__enable_interrupt( ))
148
#define cli() (__disable_interrupt( ))
149
150
#define nop() (__no_operation())
151
152
#define INLINE PRAGMA(inline=forced) static
153
154
#define ASSEMBLY(x) __asm(x)
155
156
#define PROGMEM_LOCATION(var, loc) const _MEMATTR var @ loc
157
#define PROGMEM_DECLARE(x) _MEMATTR x
158
#define PROGMEM_STRING(x) ((_MEMATTR const char *)(x))
159
#define PROGMEM_STRING_T char const _MEMATTR *
160
#define PROGMEM_T const _MEMATTR
161
#define PROGMEM_PTR_T const _MEMATTR *
162
#define PROGMEM_BYTE_ARRAY_T uint8_t const _MEMATTR *
163
#define PROGMEM_WORD_ARRAY_T uint16_t const _MEMATTR *
164
#define PROGMEM_READ_BYTE(x) *(x)
165
#define PROGMEM_READ_WORD(x) *(x)
166
#define PROGMEM_READ_DWORD(x) *(x)
167
#define PROGMEM_READ_BYTE_FAR(x) *((uint8_t __farflash*)x)
168
#define PROGMEM_READ_WORD_FAR(x) *((uint16_t __farflash*)x)
169
#define PROGMEM_READ_DWORD_FAR(x) *((uint32_t __farflash*)x)
170
171
#define NO_INIT __no_init
172
173
#define EEPROM_DECLARE(var) __eeprom var
174
#define EEGET(var, adr) __EEGET(var, adr)
175
#define EEPUT(adr, val) __EEPUT(adr, val)
176
177
#define watchdog_reset() __watchdog_reset()
178
179
#define SHORTENUM
/**/
180
181
182
183
#elif defined(__GNUC__)
184
185
186
187
#include <avr/sleep.h>
188
#include <avr/io.h>
189
#include <avr/interrupt.h>
190
#include <avr/pgmspace.h>
191
//#include <avr/eeprom.h> // Not available for XMEGA.
192
#include <avr/wdt.h>
193
#include <util/delay.h>
194
195
#define cpu_sleep() sleep_cpu()
196
197
#define delay_us(us) (_delay_us( us ))
198
199
#define INLINE static inline
200
201
#define ASSEMBLY __asm__ __volatile__
202
203
#define nop() do {__asm__ __volatile__ ("nop");} while (0)
204
205
#define PROGMEM_LOCATION(var, loc) var __attribute__((section (#loc)))
206
#define PROGMEM_DECLARE(x) x __attribute__((__progmem__))
207
#define PROGMEM_STRING(x) PSTR(x)
208
#define PROGMEM_STRING_T PGM_P
209
#define PROGMEM_T
210
#define PROGMEM_PTR_T *
211
#define PROGMEM_BYTE_ARRAY_T uint8_t*
212
#define PROGMEM_WORD_ARRAY_T uint16_t*
213
#define PROGMEM_READ_BYTE(x) pgm_read_byte(x)
214
#define PROGMEM_READ_WORD(x) pgm_read_word(x)
215
#define PROGMEM_READ_DWORD(x) pgm_read_dword(x)
216
217
#define PROGMEM_READ_BYTE_FAR(x) pgm_read_byte_far(x)
218
#define PROGMEM_READ_WORD_FAR(x) pgm_read_word_far(x)
219
#define PROGMEM_READ_DWORD_FAR(x) pgm_read_dword_far(x)
220
221
222
#define NO_INIT __attribute__ ((section (".noinit")))
223
224
// Some of these definitions stem from <avr/eeprom.h>.
225
//#define EEPROM_DECLARE(var) var EEMEM
226
#define EEPROM_DECLARE(var) var __attribute__((section(".eeprom")))
227
//#define EEGET(var, addr) (var) = eeprom_read_byte ((uint8_t *)(addr))
228
//#define EEPUT(addr, var) eeprom_write_byte ((uint8_t *)(addr), var)
229
230
#define watchdog_reset() wdt_reset()
231
232
#define SHORTENUM __attribute__ ((packed))
233
#else
234
#error Compiler not supported.
235
#endif
236
237
238
239
#endif // COMPILER_AVR_H
240
241
tests
avr_compiler.h
Generated by
1.8.1