
#include<stdint.h>// CRC32核心校验函数uint32_tcrc32(uint32_t crc, constuint8_t *buf, uint32_t len){const uint32_t poly = 0xEDB88320;uint32_t i;while (len--) {crc ^= *buf++;for (i = 0; i < 8; i++) {crc = (crc >> 1) ^ ((crc & 1) ? poly : 0);}}return ~crc;}// 简化调用接口uint32_tcrc32_calc(constuint8_t *buf, uint32_t len){return crc32(0xFFFFFFFF, buf, len);}
#include<stdint.h>#include<string.h>// 字符串拷贝(避免缓冲区溢出,比标准strcpy更安全)char *linux_strcpy(char *dest, constchar *src, uint32_t dest_len){if (!dest || !src || dest_len == 0)return NULL;char *d = dest;const char *s = src;while (*s && (d - dest) < (dest_len - 1)) {*d++ = *s++;}*d = '\0'; // 确保字符串结束符return dest;}// 字符串比较intlinux_strcmp(constchar *a, constchar *b){while (*a && *a == *b) {a++;b++;}return *(unsigned char *)a - *(unsigned char *)b;}// 字符串查找(查找substr在str中的位置,返回首地址,无则返回NULL)char *linux_strstr(constchar *str, constchar *substr){if (!*substr)return (char *)str;while (*str) {const char *s1 = str;const char *s2 = substr;while (*s1 && *s2 && *s1 == *s2) {s1++;s2++;}if (!*s2)return (char *)str;str++;}return NULL;}
#include<stdint.h>// 置位(将addr地址的第bit位设为1,bit从0开始)staticinlinevoidset_bit(uint8_t bit, volatileuint32_t *addr){*addr |= (1UL << bit);}// 清除位(将addr地址的第bit位设为0,bit从0开始)staticinlinevoidclear_bit(uint8_t bit, volatileuint32_t *addr){*addr &= ~(1UL << bit);}// 翻转位(将addr地址的第bit位翻转,0变1,1变0)staticinlinevoidtoggle_bit(uint8_t bit, volatileuint32_t *addr){*addr ^= (1UL << bit);}// 判断位(返回addr地址的第bit位的值,1返回非0,0返回0)staticinlineinttest_bit(uint8_t bit, constvolatileuint32_t *addr){return (*addr & (1UL << bit)) != 0;}
#include<stdint.h>#include<string.h>// kfifo环形缓冲区结构体typedef struct {uint8_t *buf; // 缓冲区数据指针uint32_t size; // 缓冲区大小(建议为2的幂,提升效率)uint32_t in; // 写入指针uint32_t out; // 读取指针} kfifo_t;// 初始化环形缓冲区(buf为外部定义的数组,size为缓冲区大小)intkfifo_init(kfifo_t *fifo, uint8_t *buf, uint32_t size){if (!fifo || !buf || size == 0)return -1;memset(fifo, 0, sizeof(kfifo_t));fifo->buf = buf;fifo->size = size;return 0;}// 写入数据到环形缓冲区,返回实际写入长度uint32_tkfifo_in(kfifo_t *fifo, constuint8_t *data, uint32_t len){if (!fifo || !data || len == 0)return 0;len = (len > (fifo->size - fifo->in + fifo->out)) ? (fifo->size - fifo->in + fifo->out) : len;// 分两段写入(避免缓冲区溢出)uint32_t left = fifo->size - (fifo->in % fifo->size);if (len <= left) {memcpy(fifo->buf + (fifo->in % fifo->size), data, len);} else {memcpy(fifo->buf + (fifo->in % fifo->size), data, left);memcpy(fifo->buf, data + left, len - left);}fifo->in += len;return len;}// 从环形缓冲区读取数据,返回实际读取长度uint32_tkfifo_out(kfifo_t *fifo, uint8_t *data, uint32_t len){if (!fifo || !data || len == 0 || fifo->in == fifo->out)return 0;len = (len > (fifo->in - fifo->out)) ? (fifo->in - fifo->out) : len;// 分两段读取uint32_t left = fifo->size - (fifo->out % fifo->size);if (len <= left) {memcpy(data, fifo->buf + (fifo->out % fifo->size), len);} else {memcpy(data, fifo->buf + (fifo->out % fifo->size), left);memcpy(data + left, fifo->buf, len - left);}fifo->out += len;return len;}// 清空环形缓冲区voidkfifo_reset(kfifo_t *fifo){if (fifo) {fifo->in = 0;fifo->out = 0;}}
-END-

嵌入式 C 语言有哪些语法增强特性?

嵌入式技术,再不学习AI就会掉队!

【有奖问答】2026蓝牙亚洲大会暨展览议程重磅发布!小米、华为、OPPO、vivo、高通等齐聚,蓝牙技术年度盛宴即将启幕!