首页 > 其他分享 >嵌入式宝藏级别的C代码

嵌入式宝藏级别的C代码

时间:2023-07-06 20:35:02浏览次数:41  
标签:count int unsigned 嵌入式 中断 uint16 宝藏 级别 cycle

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

 

标签:count,int,unsigned,嵌入式,中断,uint16,宝藏,级别,cycle
From: https://www.cnblogs.com/lyfily-p-7439305/p/17533274.html

相关文章

  • 痞子衡嵌入式:从功耗测试角度了解i.MXRTxxx系列片内SRAM分区电源控制
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是从功耗测试角度了解i.MXRTxxx系列片内SRAM分区电源控制。我们知道配合MCU一起工作的存储器包含ROM(Flash)和RAM两类,前者主要放RO代码和数据,后者放RW数据。MCU可以没有片内ROM,但是一般都会包含......
  • 获取乡镇、街道级别地图边界数据 (Kml、GeoJson)
    获取乡镇、街道级别地图边界数据(Kml、GeoJson)安装Bigemap工具http://www.bigemap.com/reader/download/下载BigemapGISOffice全能版,安装到windows电脑下载乡镇数据(获取kml)切换地图点击左上角切换地图选择地方高清中的地图下载数据(Kml)点击右上角选择行政区域......
  • 【嵌入式】keil5中使用C,C++混合编译
    5份文件:a.c和a.h和b.cpp和b.h和main.c其中main.c调用b.cpp,b.cpp调用a.c main.c#include"./b.h"intmain(void){ intt=funC(); while(1) { }} b.h#ifndef_B_#define_B_#ifdef__cplusplusextern"C"{#endifintfunC(void);#ifdef__cplusp......
  • 模拟嵌入式边缘计算卡设计方案:367-XC7Z100 板卡 基于zynq XC7Z100 FMC接口通用计算平
    基于zynqXC7Z100FMC接口通用计算平台 一、板卡概述北京太速科技板卡由SoCXC7Z100-2FFG900I芯片来完成卡主控及数字信号处理,XC7Z100内部集成了两个ARMCortex-A9核和一个kintex7的FPGA,通过PL端FPGA扩展FMC、光纤、IO等接口,PS端ARM扩展网络、USB、RS232等接口......
  • pytest + yaml 框架 -46.支持模块级别和用例级别参数化
    前言对parameters功能做了优化,支持模块级别和用例级别参数化config中parameters参数化,作用域是整个模块级别用例中parameters参数化,作用域只针对单个用例v1.3.7版本优化此功能模块级别参数化config中parameters参数化,作用域是整个模块级别,test_a.yaml文件示例......
  • 【嵌入式】超详细的嵌入式路径学习精选合集,建议收藏
    超详细的嵌入式路径学习精选合集,纯干货,建议收藏!本合集归类汇总了嵌入式开发技术相关的学习路径、知识与经验总结,以及一些源码、资料分享等。将其分类列出目录,一来为了避免有些知识长时间不用,会很容易忘掉,方便自已检索查看;二来也希望这些文章能给一部分朋友提供些许帮助。本合集汇总......
  • 面试常问集锦——MySQL部分数据库的隔离级别
    聚集索引与非聚集索引的区别https://zhuanlan.zhihu.com/p/113917726Myisam引擎采用非聚集索引,索引与数据分开,叶子结点存放数据的地址。Innodb采用聚集索引,主键索引树的叶子结点存放真实数据,非主键索引树的叶子结点存放主键值索引底层的实现,为什么不选红黑树、B树等?总结(1)哈希表 ......
  • 【重磅推荐】嵌入式Linux经典书单(部分含视频)
    论  坛:http://bbs.100ask.net/(学术答疑)公 众 号:百问科技版本日期作者说明V12020韦东山书籍推荐一直都有人问我要书单,在网上搜索大半天,没找到合适的,他们写的太不负责了,遂决定自己整理。本书单综合了豆瓣知乎热评,尤其参考了一线开发者韦东山学员群的小伙伴们的意见,再结合本人......
  • 嵌入式系统开发简述
    ......
  • 【嵌入式Linux应用开发】设计温湿度采集MCU子系统
    1.概述本篇主要是使用百问网的100ASK_STM32F103_PRO开发板加上ESP8266和DHT11设计一个采集环境温湿度的子系统,将温湿度数据上云,让阿里云服务器转发给订阅了该温湿度数据主体的MQTT客户端,也就是之前做的基于STM32MP157开发板的温湿度监控系统。温湿度监控系统应用开发所有文章......