IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言 标志位/状态位 清零置一 -> 正文阅读

[C++知识库]C语言 标志位/状态位 清零置一

? 参考Linux的regmap操作

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define BITS_PER_LONG		64  // 64 bit CPU
//#define BITS_PER_LONG		32  // 32b it CPU
#define GENMASK(h, l)  (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))

unsigned int sys_val[2] = {0};  // array[] support mult;
//unsigned int sys_val = 0x33;

struct reg_field {
	unsigned int reg;
	unsigned int lsb;
	unsigned int msb;
};

#define REG_FIELD(_reg, _lsb, _msb) { \
	.reg = _reg,   \
	.lsb = _lsb,    \
	.msb = _msb,    \
}

enum test_fields {
	F_MCU_IS_BUSY,
	F_TEST1,
	F_TEST2,
	F_MCU_IS_PRINT,
	F_A1,
	F_MAX_FIELDS
};
static const struct reg_field test_reg_fields[] = {
	[F_MCU_IS_BUSY]      = REG_FIELD(0, 0, 1), // bit[1:0]   array[0]
	[F_TEST1]            = REG_FIELD(0, 2, 2), // bit[2]
	[F_TEST2]            = REG_FIELD(0, 3, 3), // bit[3]
	[F_MCU_IS_PRINT]     = REG_FIELD(0, 4, 5), // bit[5:4]
	[F_A1]               = REG_FIELD(1, 16, 31), // bit[31:16] ; array[1]
};

int set_bit(enum test_fields field_id, unsigned int val)
{
	printf("%s  ", __FUNCTION__);
	unsigned int field_shift, field_mask;
	unsigned int mask = ~0;
	int tmp_val = val;

	field_shift = test_reg_fields[field_id].lsb;
	field_mask = GENMASK(test_reg_fields[field_id].msb, test_reg_fields[field_id].lsb);
	mask = (mask << field_shift) & field_mask;
	tmp_val <<= field_shift;

	printf("field_shift=0x%x, field_mask=0x%x, mask=0x%x, ", field_shift, field_mask, mask);
	sys_val[test_reg_fields[field_id].reg] &= ~mask;
	sys_val[test_reg_fields[field_id].reg] |= tmp_val & mask;
	val = sys_val[test_reg_fields[field_id].reg];
	printf("sys = 0x%x\n", val);

	return 0;
}

int get_bit(enum test_fields field_id, unsigned int *val)
{
	printf("%s  ", __FUNCTION__);
	unsigned int reg_val;
	unsigned int field_shift, field_mask;
	field_shift = test_reg_fields[field_id].lsb;
	field_mask = GENMASK(test_reg_fields[field_id].msb, test_reg_fields[field_id].lsb);

	reg_val = sys_val[test_reg_fields[field_id].reg];
	printf("field_shift=0x%x, field_mask=0x%x, ", field_shift, field_mask);
	reg_val &= field_mask;  printf("reg=0x%x ", reg_val);
	reg_val >>= field_shift; printf("reg=0x%x ", reg_val);
	*val = reg_val;
	printf("val=0x%x\n", *val);
}


int clear_bit(enum test_fields field_id)
{
	set_bit(field_id, 0x00);
}


int main()
{
	unsigned int val;

	val = 0x3;
	set_bit(F_MCU_IS_BUSY, val);

	val = 1;
	set_bit(F_TEST1, val);

	set_bit(F_TEST2, val);
	clear_bit(F_TEST2);

	val = 0x2;
	set_bit(F_MCU_IS_PRINT, val);
	printf("0x%x\n", sys_val[test_reg_fields[F_MCU_IS_PRINT].reg]);

	get_bit(F_MCU_IS_BUSY, &val);
	get_bit(F_TEST1, &val);
	get_bit(F_TEST2, &val);
	get_bit(F_MCU_IS_PRINT, &val);

	printf("\nArray 2 \n");
	val = 0xFFFF;
	set_bit(F_A1, val);
	get_bit(F_A1, &val);
	printf("0x%x\n", sys_val[test_reg_fields[F_A1].reg]);
}

.

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:12:28  更:2022-02-26 11:14:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:22:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码