嵌入式宝藏级别的C代码
在嵌入式开发中,有一些常用的C语言代码片段被认为是宝藏级别的,因为它们在处理底层硬件和优化性能方面非常有用。以下是一些常见的宝藏级别的C语言代码和解释:
1.位操作代码
//设置某个位为1 #define SET_BIT(reg, bit) ((reg) |= (1<<(bit))) //清除某个位为0 #define CLEAR_BIT(reg, bit) ((reg) &= ~(1<<(bit))) //切换某个位的状态 #define TOGGLE_BIT(reg, bit) ((reg) ^= (1<<(bit))) //读取某个位的值 #define READ_BIT(reg, bit) (((reg) >> (bit)) & 1)
2.延迟函数
void delay_ms(unsigned int ms) { for(unsigned int i=0; i<ms; i++) { for(volatile unsigned int j=0; j<6000; j++) { //空循环一段时间 } } }
3.外部中断处理
#include<avr/interrupt.h> void init_external_interrupt() { //配置外部中断触发条件 //... //启用外部中断 sei(); } ISR(INT0_vect) { //外部中断0中断处理程序 } ISR(INT1_vect) { //外部中断1中断处理程序 }
4.字节序转换
uint16_t swap_bytes(uint16_t value) { return ((value << 8) | (value >> 8)); }
5.CRC校验
uint16_t calc_CRC(const uint8_t *data, size_t len) { uint16_t crc=0; for(size_t i=0; i<len; i++) { crc ^= (uint16_t)data[i] << 8; for(uint8_t bit=0; bit<8; bit++) { if(crc & 0x8000) { crc = (crc<<1) ^ 0x8005; } else crc <<= 1; } } return crc; }
6.位字段操作
struct { unsigned int flag1: 1; unsigned int flag2: 1; unsigned int flag3: 1; unsigned int flag4: 1; //... } status; void set_flag(unsigned int *flags, unsigned int pos) { *flags |= (1 << pos); } void clear_flag(unsigned int *flags, unsigned int pos) { *flags &= ~(1 << pos); } int check_flag(unsigned int *flags, unsigned int pos) { return (flags >> pos) & 1; }
7.时钟周期计数
#include<stdint.h> uint32_t get_cycle_count() { uint32_t cycle_count; __asm__ volatile("rdcycle %0" : "=r"(cycle_count)); return cycle_count; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!