Created
December 12, 2013 22:30
-
-
Save esromneb/7936719 to your computer and use it in GitHub Desktop.
Handy macros for byte operations as well as set and get bits
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/************************************************************************************************** | |
* Filename: hal_defs.h | |
* Description: This file contains useful macros and data types | |
* | |
* | |
* Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ | |
* | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions | |
* are met: | |
* | |
* Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* | |
* Redistributions in binary form must reproduce the above copyright | |
* notice, this list of conditions and the following disclaimer in the | |
* documentation and/or other materials provided with the | |
* distribution. | |
* | |
* Neither the name of Texas Instruments Incorporated nor the names of | |
* its contributors may be used to endorse or promote products derived | |
* from this software without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* | |
*/ | |
#ifndef HAL_DEFS_H | |
#define HAL_DEFS_H | |
#include <stdint.h> | |
/* ------------------------------------------------------------------------------------------------ | |
* Macros | |
* ------------------------------------------------------------------------------------------------ | |
*/ | |
#ifndef BV | |
#define BV(n) (1 << (n)) | |
#endif | |
#ifndef BF | |
#define BF(x,b,s) (((x) & (b)) >> (s)) | |
#endif | |
#ifndef MIN | |
#define MIN(n,m) (((n) < (m)) ? (n) : (m)) | |
#endif | |
#ifndef MAX | |
#define MAX(n,m) (((n) < (m)) ? (m) : (n)) | |
#endif | |
#ifndef ABS | |
#define ABS(n) (((n) < 0) ? -(n) : (n)) | |
#endif | |
/* takes a byte out of a uint32_t : var - uint32_t, ByteNum - byte to take out (0 - 3) */ | |
#define BREAK_UINT32( var, ByteNum ) \ | |
(uint8_t)((uint32_t)(((var) >>((ByteNum) * 8)) & 0x00FF)) | |
#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) \ | |
((uint32_t)((uint32_t)((Byte0) & 0x00FF) \ | |
+ ((uint32_t)((Byte1) & 0x00FF) << 8) \ | |
+ ((uint32_t)((Byte2) & 0x00FF) << 16) \ | |
+ ((uint32_t)((Byte3) & 0x00FF) << 24))) | |
#define BUILD_UINT16(loByte, hiByte) \ | |
((uint16_t)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) | |
#define HI_UINT16(a) (((a) >> 8) & 0xFF) | |
#define LO_UINT16(a) ((a) & 0xFF) | |
#define BUILD_UINT8(hiByte, loByte) \ | |
((uint8_t)(((loByte) & 0x0F) + (((hiByte) & 0x0F) << 4))) | |
#define HI_UINT8(a) (((a) >> 4) & 0x0F) | |
#define LO_UINT8(a) ((a) & 0x0F) | |
#ifndef GET_BIT | |
#define GET_BIT(DISCS, IDX) (((DISCS)[((IDX) / 8)] & BV((IDX) % 8)) ? TRUE : FALSE) | |
#endif | |
#ifndef SET_BIT | |
#define SET_BIT(DISCS, IDX) (((DISCS)[((IDX) / 8)] |= BV((IDX) % 8))) | |
#endif | |
#ifndef CLR_BIT | |
#define CLR_BIT(DISCS, IDX) (((DISCS)[((IDX) / 8)] &= (BV((IDX) % 8) ^ 0xFF))) | |
#endif | |
/* | |
* This macro is for use by other macros to form a fully valid C statement. | |
* Without this, the if/else conditionals could show unexpected behavior. | |
* | |
* For example, use... | |
* #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) | |
* instead of ... | |
* #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } | |
* or | |
* #define SET_REGS() ioreg1 = 0; ioreg2 = 0; | |
* The last macro would not behave as expected in the if/else construct. | |
* The second to last macro will cause a compiler error in certain uses | |
* of if/else construct | |
* | |
* It is not necessary, or recommended, to use this macro where there is | |
* already a valid C statement. For example, the following is redundant... | |
* #define CALL_FUNC() st( func(); ) | |
* This should simply be... | |
* #define CALL_FUNC() func() | |
* | |
* (The while condition below evaluates false without generating a | |
* constant-controlling-loop type of warning on most compilers.) | |
*/ | |
#define st(x) do { x } while (__LINE__ == -1) | |
/* This macro is used to define asm NOP instruction with | |
* different compiler/assembler | |
*/ | |
#ifdef ccs | |
#define ASM_NOP asm(" NOP") | |
#elif defined rvmdk | |
#define ASM_NOP __nop() | |
#else | |
#define ASM_NOP asm("NOP") | |
#endif | |
/************************************************************************************************** | |
*/ | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment