0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

c语言中标志位的设置问题

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-12-18 15:37 次阅读

单片机、裸机开发的朋友,比如跟一些模块配合联调会遇到各种信号是否到位、成功等等状态,而这些信号大多都是bool类型,1个bit即可进行标识。

当然,如果仅仅是几个标志,直接拿个uint8_t的整形来进行标识也不会影响什么,但如果特别多的话似乎就比较废RAM了。然而,为了更好的管理这些标志位等,有个如下几种方式供大家更好的管理这些标志位 :

两种方式:唯一直接标识。

typedef union _tag_SystemFlag
 {
     uint16_t all;
     struct 
     {
        uint16_t Run         :1;
        uint16_t Alarm       :1;
       uint16_t Online      :1;
        uint16_t TimerOver   :1;
        uint16_t Reserver    :12;
    }bit;

} uSystemFlag;

uSystemFlag  unSystemFlag;

int main(int argc, char *argv[]) {

    unSystemFlag.all = 0x00; //系统标志清除

    unSystemFlag.bit.Run       = 1; //置位
    unSystemFlag.bit.Alarm     = 1;
    unSystemFlag.bit.Online    = 1;
    unSystemFlag.bit.TimerOver = 1;

    unSystemFlag.bit.Run       = 0; //清零
    unSystemFlag.bit.Alarm     = 0;
    unSystemFlag.bit.Online    = 0;
    unSystemFlag.bit.TimerOver = 0;

    return 0;
}

这些标志位的操作无非就是置位、清零,以及读取三种方式。

但如代码中这样的操作方式在语句或语义表达上还是不够直观。

我经常谈到,代码可以不写注释,不过你的每个变量、函数名称等需要足够的直观,所以很多朋友习惯把这些标志封装起来。

枚举和位移

typedef enum _tag_Flag {
cEmRun = 0,
cEmAlarm,
cEmOnline,
cEmTimerOver
}emSystemFlag;

uint16_t SystemFlag ;
//置位
void SetFlag(emSystemFlag flag)
{
    SystemFlag |=  ((uint16_t)0x01) << flag;
}
//清除
void ClrFlag(emSystemFlag flag)
{
   SystemFlag &=  ~(((uint16_t)0x01) << flag);
}
//获得状态
uint8_t  GetFlag(emSystemFlag flag)
{
    return (((SystemFlag & (((uint16_t)0x01) << flag)) != 0)? true:false);  
}

int main(int argc, char *argv[]) {

    SetFlag(cEmAlarm);

    if(GetFlag(cEmAlarm) == true)
    {
        printf("ClrFlagrn");
        ClrFlag(cEmAlarm);
    }
    else
    {
        printf("SetFlagrn");
        SetFlag(cEmAlarm);
    }
    return 0;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6030

    文章

    44502

    浏览量

    632295
  • C语言
    +关注

    关注

    180

    文章

    7596

    浏览量

    135971
  • 函数
    +关注

    关注

    3

    文章

    4295

    浏览量

    62348
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28314
  • 标志位
    +关注

    关注

    0

    文章

    2

    浏览量

    5798
收藏 人收藏

    评论

    相关推荐

    C语言中宏定义的应用

    C语言中,宏定义是一种预处理指令,用于在代码中定义和使用常量、函数或代码片段的替代。
    发表于 08-17 15:33 743次阅读

    单片机的C语言中操作用法

    单片机的C语言中操作用法
    发表于 08-17 15:04

    C语言标志怎么用

    关于C语言标志的应用。。。。。不懂!
    发表于 03-18 12:07

    C语言程序中标识符号的意义

    的热情,但是在学校能学到最基础的东西,一个程序的组成,缘由,如何实现等基本功能。之所以对C语言这门课程感兴趣,因为从小我对任何一个电子产品爱不释手,还有希望以后自己也能够开发出一些有趣的东西。C
    发表于 07-14 07:53

    c语言中标志有什么作用?

    c语言中标志有什么作用?
    发表于 10-14 08:05

    C语言中指针的介绍非常详细

    C语言中指针的介绍非常详细 C语言中指针的介绍非常详细
    发表于 12-25 10:39 57次下载

    C语言和汇编语言混合编程方法和C语言中断处理方法

    C语言和汇编语言混合编程方法和C语言中断处理方法,new
    发表于 01-06 14:36 36次下载

    C语言中的关键字

    C语言中的入门教程
    发表于 10-14 16:24 3次下载

    单片机C语言中标志的经典应用,让你快速学会单片机C语言

    //====标志应用 定义联合体实体====typedef union uFLG{ uint8 Flg ; //定义整形数据 struct FLAG{ //域定义
    的头像 发表于 07-06 15:48 7246次阅读

    总结那么几个C语言中的“坑”

    总结几个C语言中的“坑”
    的头像 发表于 01-16 10:52 2543次阅读

    c#语言中怎么使用HTTP代理

    c#语言中怎么使用HTTP代理。
    的头像 发表于 09-01 14:46 2101次阅读

    C语言中必须要掌握的运算操作

    C语言中,特别是在嵌入式的开发中,操作是很常用的一个知识点,涉及到按(bit)操作的地方也是很常见的。本文分享一些C
    的头像 发表于 02-10 14:19 1334次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>必须要掌握的<b class='flag-5'>位</b>运算操作

    简单介绍嵌入式C语言中常用的操作

    在嵌入式C语言中,使用操作程序有很好的可读性。以下就简单介绍以下常用的操作。
    的头像 发表于 02-23 10:36 969次阅读

    scanf在C语言中的作用

    scanf在C语言中的作用  scanf是C语言中的输入函数,用于从标准输入设备(如键盘)读取数据,并将其存储到变量中。它是C
    的头像 发表于 11-23 14:13 1279次阅读

    C语言中的socket编程基础

    Socket编程简介 Socket是一种通信机制,允许程序之间进行通信。在C语言中,socket编程是网络编程的基础。通过使用socket,程序可以发送和接收数据,实现不同计算机之间的通信
    的头像 发表于 11-01 16:51 221次阅读