嵌入式开发中宝藏级别的C语言代码,使用频率高,绝对值得珍藏

yumo6664个月前 (06-30)技术文章24

在嵌入式开发中,有一些常用的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)

这些宏定义可以在操作寄存器位时提供方便。例如,使用SET_BIT(PORTA, 3)可以将寄存器PORTA的第3位设置为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中断处理程序
}

这段代码使用了Atmel AVR微控制器的外部中断处理机制。通过配置外部中断触发条件和编写中断处理程序,可以实现对外部事件的实时响应。

4.字节序转换:

uint16_t swap_bytes(uint16_t value) {
    return (value << 8) | (value >> 8);
}

这段代码用于交换一个16位整数的高低字节顺序,常用于处理不同字节序的数据。

5.CRC校验:

uint16_t calculate_crc(const uint8_t *data, size_t length) {
    uint16_t crc = 0;
    for (size_t i = 0; i < length; 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;
}

这段代码用于计算循环冗余校验(CRC),常用于数据传输的完整性校验。

6.字符串拷贝:

char *string_copy(char *dest, const char *src) {
    char *p = dest;
    while ((*p++ = *src++)) ;
    return dest;
}

这段代码实现了字符串拷贝功能,将源字符串复制到目标字符串,包括字符串结尾的空字符。

7.内存复制:

void *memory_copy(void *dest, const void *src, size_t count) {
    char *d = dest;
    const char *s = src;
    while (count--) {
        *d++ = *s++;
    }
    return dest;
}

这段代码实现了内存复制功能,将源内存区域的数据复制到目标内存区域,逐字节复制指定数量的数据。

8.位字段操作:

struct {
    unsigned int flag1: 1;
    unsigned int flag2: 1;
    unsigned int flag3: 1;
    // ...
} status;

void set_flag(unsigned int *flags, unsigned int position) {
    *flags |= (1 << position);
}

void clear_flag(unsigned int *flags, unsigned int position) {
    *flags &= ~(1 << position);
}

int check_flag(unsigned int flags, unsigned int position) {
    return (flags >> position) & 1;
}

这段代码演示了如何使用位字段(bit fields)操作来管理标志位。结构体status中的每个成员都只占据一个位,可以通过位操作函数来设置、清除和检查特定位置的标志位。

9.时钟周期计数:

#include <stdint.h>

uint32_t get_cycle_count() {
    uint32_t cycle_count;
    __asm__ volatile("rdcycle %0" : "=r"(cycle_count));
    return cycle_count;
}

这段代码使用了嵌入式处理器的内置指令来获取时钟周期计数。通过读取处理器的计数寄存器,可以精确测量代码段的执行时间,用于性能优化和调试。

相关文章

单片机c语言基础知识,c语言必背100代码有哪些?

我记得刚开始接触编程的时候,觉得太难了。也很好奇,写代码的那些人也太厉害了吧?全是英文的,他们的英文水平一定很好吧?他们是怎么记住这么多代码格式的?而且错了一个标点符号,整个程序都会有影响。一个程序几...

C语言项目实战:《飞翔的小鸟》零基础项目!190行源代码示例

这篇文章主要为大家详细介绍了C语言实现——《飞翔的小鸟项目》文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!游戏介绍:《Flappy Bird》其实是曾经流行的一款手机游...

C语言开发:如何用130行代码,写出&quot;超火&quot;微信小游戏—羊了个羊?

近日,一款名为“羊了个羊”微信小游戏火爆全网。凭借简单玩法和不走寻常路的关卡设置,三消小游戏《羊了个羊》,成为《合成大西瓜》《召唤神龙》后的小微游戏新王者。“其实游戏很简单,就是凑齐三个一样的图案就能...

C语言实现:见缝插针游戏!代码思路+源码分享

见缝插圆我们昨天已经用C语言实现了,今天将实现一个见缝插针的游戏。游戏介绍:《见缝插针游戏》是一款非常休闲益智的且容易上头的小游戏,该游戏画面非常的简洁,米白色的背景中央,放置着一个不断旋转的太阳状的...

最难的 5 种编程语言!C/C++竟不在其列,它们到底是谁?

我们平时都在谈论 c、c ++、Java、Python 等编程语言,其实还有些语言不仅对于大多数软件开发人员来说都很难,而且几乎是不可理解的。这些语言被称为深奥难懂的编程语言(或晦涩语言)。晦涩语言并...

《C 语言修仙》:代码敲出的修仙传奇,你敢来挑战吗?

在这个代码与灵力交织的奇妙世界,一场超乎想象的冒险正悄然拉开帷幕。当熬夜敲代码的程序员林浔,在身体里发现一个神秘的程序输入窗口,谁能料到,他的人生将从此彻底改写,开启一段令人拍案叫绝的修仙之旅!今天,...