嵌入式c语言中常见的宏定义(超详细),2024年最新物联网嵌入式开发开发的基础

34 阅读3分钟

#define MyInt16 int16_t #define MyInt32 int32_t #define MyInt64 int64_t

#define MyUInt8 uint8_t #define MyUInt16 uint16_t #define MyUInt32 uint32_t #define MyUInt64 uint64_t


## 4.获取指定地址上的一个字节或字



#include <stdio.h>

#define GET_BYTE(address) ((volatile unsigned char)(address))

int main() { unsigned char byteValue = GET_BYTE(0x12345678); // 获取地址上的一个字节

printf("Byte value: %02X\n", byteValue);  // 打印字节值

return 0;

}


## 5.求最大、最小值



#include <stdio.h>

#define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))

int main() { int num1 = 10; int num2 = 20;

int maxNum = MAX(num1, num2);
int minNum = MIN(num1, num2);

printf("Max value: %d\n", maxNum);
printf("Min value: %d\n", minNum);

return 0;

}


## 6.得到一个field在结构体(struct)中的偏移量



#include <stdio.h>

#define FIELD_OFFSET(struct_type, field_name) ((size_t)(&(((struct_type*)0)->field_name)))

typedef struct { int field1; char field2; double field3; } MyStruct;

int main() { size_t offset = FIELD_OFFSET(MyStruct, field2); printf("Offset of field2: %zu bytes\n", offset);

return 0;

}


## 7.得到一个结构体中field所占用的字节数



#include <stdio.h>

#define FIELD_SIZE(struct_type, field_name) (sizeof(((struct_type*)0)->field_name))

typedef struct { int field1; char field2; double field3; } MyStruct;

int main() { size_t size = FIELD_SIZE(MyStruct, field2); printf("Size of field2: %zu bytes\n", size);

return 0;

}


## 8.按照LSB格式把两个字节转化为一个Word



#include <stdio.h>

#define BYTES_TO_WORD(lsb, msb) (((unsigned short)(msb) << 8) | (lsb))

int main() { unsigned char lsb = 0x34; unsigned char msb = 0x12;

unsigned short word = BYTES_TO_WORD(lsb, msb);

printf("Word: 0x%04X\n", word);

return 0;

}


## 9. 按照LSB格式把一个Word转化为两个字节



#include <stdio.h>

#define WORD_TO_BYTES(word, lsb, msb)
do {
lsb = (unsigned char)(word & 0xFF);
msb = (unsigned char)((word >> 8) & 0xFF);
} while (0)

int main() { unsigned short word = 0xABCD; unsigned char lsb, msb;

WORD_TO_BYTES(word, lsb, msb);

printf("LSB: 0x%02X\n", lsb);
printf("MSB: 0x%02X\n", msb);

return 0;

}


## 10. 得到一个变量的地址(word宽度)



#define GET_ADDRESS(var) ((word *) &(var))


## 11. 得到一个字的高位和低位字节



#include <stdio.h>

#define GET_HIGH_BYTE(word) ((unsigned char)(((word) >> 8) & 0xFF)) #define GET_LOW_BYTE(word) ((unsigned char)((word) & 0xFF))

int main() { unsigned short word = 0xABCD; unsigned char highByte = GET_HIGH_BYTE(word); unsigned char lowByte = GET_LOW_BYTE(word);

printf("High byte: 0x%02X\n", highByte);
printf("Low byte: 0x%02X\n", lowByte);

return 0;

}


## 12. 返回一个比X大的最接近的8的倍数



#include <stdio.h>

#define ROUND_UP_TO_EIGHT(x) (((x) + 7) & (~7))

int main() { int x = 17; int roundedUp = ROUND_UP_TO_EIGHT(x);

printf("Original value: %d\n", x);
printf("Rounded up to nearest multiple of 8: %d\n", roundedUp);

return 0;

}


## 13. 将一个字母转换为大写



#include <stdio.h>

#define TO_UPPERCASE(letter) ((letter >= 'a' && letter <= 'z') ? (letter - 'a' + 'A') : letter)

int main() { char letter = 'a'; char uppercaseLetter = TO_UPPERCASE(letter);

printf("Original letter: %c\n", letter);
printf("Uppercase letter: %c\n", uppercaseLetter);

return 0;

}


## 14. 防止溢出的一个方法



#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))


## 15. 返回数组元素的个数



#include <stdio.h>

#define ARRAY_LENGTH(arr) (sizeof(arr) / sizeof((arr)[0]))

int main() { int numbers[] = {1, 2, 3, 4, 5}; int length = ARRAY_LENGTH(numbers);

printf("Array length: %d\n", length);

return 0;

}


## 16. 对于IO空间映射在存储空间的结构,输入输出处理



#define inp(port) (*((volatile byte ) (port))) #define inpw(port) (((volatile word ) (port))) #define inpdw(port) (((volatile dword )(port))) #define outp(port, val) (((volatile byte ) (port)) = ((byte) (val))) #define outpw(port, val) (((volatile word ) (port)) = ((word) (val))) #define outpdw(port, val) (((volatile dword *) (port)) = ((dword) (val)))


这个宏的目的是将一个字节的数据写入指定的端口。它使用类型转换和指针操作来确保对端口的访问是以字节为单位的,并且使用 `volatile` 修饰符来确保编译器不会进行优化和缓存操作,以防止出现意外的行为。




**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e189eda7755c4d4fad0a607c3b2865be~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771256063&x-signature=E%2F%2B0vSbgx6jB2WXDwAq0c2Al%2F0E%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/0a69a41bf3394d78b51907a7c76ce3c2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771256063&x-signature=jq1i6QXyzhr6hITFP56SdjMKeJI%3D)

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**