OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6197|回复: 2

建议收藏!C语言的高级应用-前导置零法

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4666
金钱
4666
注册时间
2019-5-8
在线时间
1224 小时
发表于 2021-11-12 17:21:58 | 显示全部楼层 |阅读模式
以下文章摘自微信#公众号开源电子网《建议收藏!C语言的高级应用-前导置零法》
更多技术文章,请扫下方二维码关注

开源电子网,扫码2222222.png

前言

    虽然C语言基础知识很简单,但是如果我们不学习C语言高级玩法,那么我们还是入门级的程序员,例如一个功能自己使用100行实现,到处ifelse语句等等,别人50行代码完成功能实现,代码格式还那么精简,对于企业来讲,精简的代码有利于维护以及查找bug简单,如果我们不优化自己的代码,那么后期维护性是非常吃力的。

一.本节课的目标

    本节课,我们使用计数前导零_CLZ(x)来制作一个管理事件代码,计数前导零有两种方法,一种计算高位最高优先级的事件,第二种计算最低优先级的事件。

二.前导置零方法

    计数前导零是对位列表的一种操作,它从最高有效位开始计算第一个位之前存在多少个零位,对于C语言的unsignedint 一般是32位的,例如00000000 0000 0000 0000 0000 0000 0000的32位,如果我们计算unsigned int x  =  0x5fffffff使用_CLZ(x)计算前导零为1,如图所示:

1.png

    因为0x5fffffff转成二进制位01011111 1111 1111 1111 1111 11111111,而最高位的零的个数为1个,所以_CLZ(x)计算前导零为1,这个前导零一般在FreeRTOS操作系统的RTOS就绪链表查找最高优先级,数值越高,优先级越高,


    从上述图可知,我们可不可以从最低位查找0的个数,那么我们先分析问题:

①.首先我们把低位和高位替换位置,例如0x5ffffff1转成0x1ffffff5。

2.png

3.png


②.然后我们进行CLZ计数前导零,从上图可知,计算得出为3。


实现源码:

    前面我们一讲讲解了两步奏,先低位替换成高位,然后使用CLZ计数前导零,如以下源码所示:

4.png

    第三行CMP    R0, #0x00主要判断R0(value)是否为零,如果为零则运行exit以后的代码,然后调用RBIT   R0, R0   /* 低位和高位替换*/,最后计算前导零指令。

三.应用场景

方法1:

    我们使用LVGL为例,如果我们制作一个图标的界面,我们不可能每个图标使用一个回调函数,这样造成代码量太大,无法做到精简,那么我们就让他们共用一个回调函数,那么我们怎么区分它们那个触发了事件了呢,这个是一个重点的问题,那么小编是这样写的,如以下源码所示:

①一个32位的obj_readly_list变量,如果数据结构学习不错的,也可以使用链表形式。
②当们们按下某一个图标时,那么我们触发某个事件,例如该图标人为设定事件1,那么obj_readly_list就等于0x00000002(对应以下代码的第一步)
③这个量lv_bit = (31UL - ( unsigned char )__clz( ( obj_readly_list ) ) );(对应第二步)计算前导置零得出31-__clz(0x00000002) = 31 – 30 = 1,那么表示事件1被触发了,然后对obj_readly_list清零操作(对应第三步)。
④最后我们switch case语句进行判断事件1(lv_bit为1)对应的动作。


5.png
6.png

方法2:

我们主要调用前面我们讲解的os_ffs()进行计算,所以lv_bit也会得到某个事件触发的值。

7.png
8.png

    经过上面的学习,相信大家对于两种前导置零的方法有一定的了解,本文详细介绍了前导置零到底是什么,如果是一个c语言初学者,那么就把最基本的知识好好理解,熟能生巧,笔者建议初学者学习C语言的基础知识同时,可以去学习数据结构c语言版第二版(严蔚敏)。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-11-10
在线时间
1 小时
发表于 2021-11-13 11:03:13 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-10-20
在线时间
11 小时
发表于 2021-12-19 22:32:23 来自手机 | 显示全部楼层
努力学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 07:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表