他们好,我是swzs。
今天给他们讲呵呵晶片/组件供货商写SDK必须会采用的一种技术:反弹表达式。
反弹表达式那个习题只不过并不是极难,难是难在网路上许多传授反弹表达式的都说的太通俗化了化了,一点也不平民化。
许多人即使知道是不是写反弹表达式也根本就想不通它们在前述商品中也有甚么用,甚么这时候用。
所以这节课呢他们N43EI243SL流程构架的市场需求为落脚点,传授反弹表达式是是不是满足用户它那个市场需求的。
为了方便快捷他们认知,这篇内容也相关联有一则该文,他们可
一、通过这节专精课程你能掌控下列科学知识:
掌控流程构架的中心思想或市场需求。掌控反弹表达式的促进作用掌控反弹表达式的流程撰写掌控反弹表达式在商品中的应用领域二、流程构架的中心思想和市场需求
许多人可能会说两个好的流程构架啊,是标识符很紧凑型、执行工作效率也极高。
只不过那个说的很狭隘,不完全对,这只能说明你流程演算法写的好,但构架不一定做的好。
中化是构架,那自然是以从”全局”为先,观念不能限于当今社会的商品机能,还要考虑到之后机能的增加和上色,所以对于电脑系统开发来说,我认为两个好的流程构架最少要达到下列明确要求:
硬体层和网络层的流程标识符合二为一,彼此之间的控制和通信采用USB,而且不会共享资源的函数调用或字符串。
这里呢,我就那个要求,别小瞧这两个明确要求,因为那个明确要求里头蕴含着许多学识的,比如说用专精称为可扩展性、扩展性。
所以他们来想像呵呵他们通常写电脑系统标识符的方式啊,在51的这时候基本两个.c文档解决,包括暂存器实用性啊,商品机能啊。
这种是没有构架的流程,然后他们变异到STM32那个电脑系统之后,流程大了,渐渐也会在工程建设文档格但斯克几个文档夹目录把硬体层和网络层标识符合二为一了。
于是他们会把一些不同的外设机能,比如说Led、按键、串口等外设机能标识符分别写在不同的.c文档里,然后统一用表达式USB去调用它。
比方说控制两个LED灯亮,直接在led.c文档里写两个驱动led灯状态的表达式然后给外部调用就好了。
那他们他们看这种Led的控制表达式确实也是满足用户流程构架的市场需求的,硬体层和网络层标识符合二为一,网络层用硬体层提供的USB来控制,而且又不会有硬体层和网络层共享资源的全部变量或字符串。像这种是不是很简单?
所以不知道你们有没有碰到另外一种情况,是应用领域流程需要采集硬体层的数据,比如说串口接收数据,按键采集、ADC值采集。
这种硬体层的数据是不是通知网络层来拿,或者是不是主动给它?
他们以往最简单粗暴的方式是不是是用两个函数调用,比方说硬体层串口接收到数据来了,所以他们把数据丢到字符串里,然后把接收完成函数调用标志位置1。
比方说函数调用名为RcvFlag,然后网络层流程会轮询判断RcvFlag==1?是的话就开始把字符串里的数据取出来解析。
许多人就会说了,你看我用这种方法照样能实现机能啊,为甚么还要学习别的构架。
这样做当然可以实现机能,但是会存在移植性很差的问题。
比如说说你们老板让你把那个串口的硬体层封装起来给客户用,但不能让客户看到你实现的源标识符,只提供USB(函数名)给对方用。
所以这这时候难道你要告诉客户先判断哪个变量为1,然后再取哪个字符串的数据这么LOW的做法吗?
所以如果是懂行的客户一定会怀疑你们公司的技术实力是不是小学生水平。
那怎样做才会既方便快捷又专精呢? 这里他们就需要用到反弹表达式啦。
三、反弹表达式的促进作用
所以在讲反弹表达式之前呢,对于表达式调用呢我一般分为2种类型:
输出型memcpy()是内存拷贝表达式,他们调用那个表达式之后呢就能完成相应的机能。
还有他们基于电脑系统的一些流程表达式,比方说控制LED点亮熄灭、继电器吸合断开、LCD驱动等等。
所以这些呢,我一般称为输出型的表达式。
输出型表达式他们是主导的角色,他们知道甚么这时候该调用它。
2.输入型
输入型呢,也称为的是响应式的表达式。
甚么叫响应式的表达式呢?
比方说接收串口的数据,他们不知道甚么数据甚么这时候来。
再比方说,他们按键检测的函数,他们不知道甚么这时候会按下按键,所以这些就要定义成响应式表达式来实现,而响应式表达式就可以用反弹表达式来实现。
所以通过这两个种类型的分析啊,他们就可以知道,反弹表达式基本是用在输入型的处理中。
比方说串口数据接收,所以数据是输入到电脑系统里头的,电脑系统是处于从机角色。
按键检测,按键状态是输入到电脑系统里的。
再比方说ADC值采集,ADC值也是输入到电脑系统里的。
所以它们输入的时间节点都是未知的,这些就能够用反弹函数来处理。
具体是不是处理后面他们会用标识符来给他们举例。
反弹表达式还有两个促进作用是为了封装标识符。
比如说说做晶片或者模组的供货商,他们拿典型的STM32来举例,像外部中断、定时器、串口等中断表达式都是属于反弹表达式,这种表达式的目的是把采集到的数据传递给用户,或者说网络层。
所以反弹表达式的核心促进作用是:
1.把数据从两个.c文档传递到另两个.c文档,而不用函数调用共享资源数据这么LOW的方法。
2.对于这种数据传递方式,反弹函数更利于标识符的封装。
四、掌控反弹表达式的流程撰写
前面说了许多概念性的东西,可能他们也比较难认知,反弹表达式最终呢是靠表达式指针来实现的。
所以我这里通过一些模拟按键的例子来演示下是不是回通过调表达式来处理它们。
下面是他们的c-free工程建设,用那个来模拟方便快捷点:
从组件化编程的思想来看,整个工程建设分为2个部分,网络层main.c文档,硬体层key.c和key.h文档。
不管再是不是复杂的流程,他们都要先从main表达式一步步往下挖,main表达式标识符如下。
KeyInit();是key.c文档的按键初始化表达式
KeyScanCBSRegister(KeyScanHandle);是key.c的表达式指针注册表达式。
那个表达式可能他们会有点蒙,请跟进他们的节奏,下面开始烧脑环节,也是写反弹表达式的必须步骤,
想认知那个反弹表达式注册表达式,他们要先从硬体层(key.h)头文档的表达式指针定义说起,具体看下图。
这里自定义了两个表达式指针类型,带两个形参。
然后,他们在key.c那个文档里定义了两个表达式指针变量。
重点来了,他们是通过那个表达式指针,指向网络层的表达式地址(表达式名)。
具体是不是实现指向呢?是通过表达式指针注册表达式。
那个表达式是在main表达式里调用,使用这种注册表达式的方式注册灵活性也极高,你想要在哪个.c文档采用按键机能就在哪里调用。
这里要注意,main.c那个文档要定义两个表达式来接收硬体层(key.c)过来的数据。
这里定义也不是乱定义的,一定要和那个自定义表达式指针类型返回值、形参一致。
然后把那个表达式名字直接复制给KeyScanCBSRegister表达式的形参就可以了。
这样调用后,他们key.c文档的pKeyScanCBS那个指针只不过是指向的KeyScanHandle表达式。
也是说执行pKeyScanCBS的这时候,是执行KeyScanHandle表达式。
那具体检测按键的机能是KeyPoll表达式,那个在main表达式里调用。
当检测到键盘有输入之后,最终会调用pKeyScanCBS。
最终执行的是main.c文档的KeyScanHandle表达式。
所以,他们来看下输出结果。
如果还是有点模糊,下面我再给他们捋一捋撰写和采用反弹表达式的流程:
自定义表达式指针,形参作为硬体层要传到网络层的数据。硬体层定义两个表达式指针和表达式指针注册表达式。网络层定义两个表达式,返回值和形参都要和表达式指针一致。网络层调用表达式指针注册表达式,把定义好的表达式名称作为形参传入。Ok,这是反弹表达式的采用。
如果还看不懂建议多看两遍。
下面请他们思考呵呵,那个流程虽然简单,但是不是构架还不错?网络层和硬体层完全独立?
最后彩蛋时间!!!
最近有同学跟我要电脑系统的资料,我特意花两个月时间,总结了我10年商品研发经验,收集了这份史上最良心、最硬核、最实用的「电脑系统入门到高级教程+工具包+22个热门项目」,无偿分享给他们。
资料包几乎覆盖了C词汇、电脑系统、模电数电、原理图和PCB设计、单片机高级编程等等,非常适合初学者入门和进阶。
除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手!
据说有小伙伴靠这份顺利入职BAT,所以一定要保存起来好好学习!
后期我也会组建一些技术交流群,让他们能认识更多的大佬,有个好的圈子,你对行业的认知将在最前沿。
他们想要上面「电脑系统入门到高级教程工具包 + 进入电脑系统交流群」,可以点击下方⬇️卡片看该文开头领取。
或者可以找「swzs电脑系统」,全网同名的。
下面是更多swzs原创的个人成长经历、行业经验、技术干货。