1 /* 2 * Copyright (c) 2023, Texas Instruments Incorporated 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of Texas Instruments Incorporated nor the names of 17 * its contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 27 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 /** 33 * @file Math.h 34 * 35 * @brief Math utility functions 36 * 37 */ 38 39 #ifndef ti_drivers_utils_Math__include 40 #define ti_drivers_utils_Math__include 41 42 #include <stdint.h> 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 48 /*! 49 * @brief Macro to determine the minimum of two numbers. 50 * 51 * @warning Do not use arguments that have a side effect. For example do not 52 * use pre- and post-increment operators. 53 * 54 * @param x The first number. Either an integer or a floating point type. 55 * @param y The second number. Must be the same type as @c x. 56 * 57 * @return The minimum of @c x and @c y 58 */ 59 #define Math_MIN(x, y) (((x) < (y)) ? (x) : (y)) 60 61 /*! 62 * @brief Macro to determine the maximum of two numbers. 63 * 64 * @warning Do not use arguments that have a side effect. For example do not 65 * use pre- and post-increment operators. 66 * 67 * @param x The first number. Either an integer or a floating point type. 68 * @param y The second number. Must be the same type as @c x. 69 * 70 * @return The maximum of @c x and @c y 71 */ 72 #define Math_MAX(x, y) (((x) > (y)) ? (x) : (y)) 73 74 /*! 75 * @brief Macro to calculate the absolute value of a numbers. 76 * 77 * @warning Do not use arguments that have a side effect. For example do not 78 * use pre- and post-increment operators. 79 * 80 * @param x The number to calculate the absolute value of. 81 * Either a signed integer or a floating point type. 82 * 83 * @return The absolute value of @c x 84 */ 85 #define Math_ABS(x) ((x) < 0 ? -(x) : (x)) 86 87 /*! 88 * @brief Divide a number by 1000 89 * 90 * This function is intended for devices without a hardware divider (for example CC23X0) 91 * that must run divisions (that are not a power of 2) in software. 92 * The generic software division implementations provided by compilers are 93 * relatively slow. This function only supports dividing by 1000, but 94 * does so in ~16 cycles vs. ~95 cycles for the generic implementations. 95 * 96 * @warning Limitations: The division is only accurate for 97 * @c dividend < 754515999, and off by 1 for values of 98 * @c dividend = 754515999 + 1000*n. 99 * 100 * @param dividend The dividend to be divided by 1000. Must be below 101 * 754515999 for division to be accurate. 102 * 103 * @return Returns @c dividend / 1000 (see limitations) 104 */ 105 extern uint32_t Math_divideBy1000(uint32_t dividend); 106 107 #ifdef __cplusplus 108 } 109 #endif 110 111 #endif /* ti_drivers_utils_Math__include */