自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(181)
  • 收藏
  • 关注

原创 FreeRtos项目-智能家居(5)

3.接着我们定义模块之间通讯的结构体由于顶层的mmc_ctrl_stru定义的结构体,在中间层和底层之间通讯时同样适用,所以我们直接拿来用就好了。需要注意的点是,中间层和底层的每个传感器和控制器之间都需要独立通讯(为了增加传感器和控制器时,扩展性更好),所以采集需要两个mmc_ctrl_stru,控制需要两个。温度、亮度采集块的初始化在中间层的总采集任务中实现,风扇和灯的控制块的初始化在中间层的总控制任务中实现。中间层有两个任务:总采集任务和总控制任务,总采集任务会与每个单独的传感器采集系统进行通讯。

2025-01-24 13:11:21 232

原创 FreeRtos-智能家居(4)

顶层和中间层通讯其实就两步,1顶层向中间层发送请求,2中间层向顶层应答(在应答前,中间层把信息装填到共享内存块中,顶层读取共享内存块获取需要的数据)。有了这个函数以后,顶层模块只要向中间层发送两次请求,第一次:请求获取温度和亮度等数据 第二次:根据获取到的传感器数据,请求下发控制命令。而中间层在每次收到顶层的请求以后,都会往顶层定义的共享内存块中填入信息,第一次是温度和亮度等数据,第二次是风扇和灯当前的状态。顶层的了逻辑很简单,根据获取的温度判断风扇的开发,然后下发控制命令。根据亮度下发灯的开关命令。

2025-01-24 13:09:10 367

原创 FreeRtos项目-智能家居(3)

内存传递数据,p_shared_mem就是指向这块共享内存的指针,shared_mem_nbyte是共享内存的。sem_req向底层下发控制命令,底层通过sem_ack应答。底层和中间层的总控制模块之间通过共享。每个任务跟中间层的总控制模块之间都有一个mmc_ctl_stru模块间通讯结构体。由于控制只涉及到设备的开关,所以函数的实现就只有一个开关而已,这样驱动适配层就很容易实现了。底层控制模块会创建两个任务,任务1用于处理灯光控制的业务,任务2用于处理风扇控制的业务。三.风扇控制任务和灯控制任务的实现。

2025-01-24 13:06:29 302

原创 FreeRtos项目-智能家居(1)

智能家居-1整体功能描述。

2025-01-24 13:03:38 198

原创 FreeRtos项目-智能家居(2)

这样做的目的是,我们代码中操作传感器时,不会直接用传感器的底层函数。我们可以在程序中用宏定义,定义多个温度和亮度传感器。然后在初始化传感器结构体的时候,根据实际需要使用对应的宏定义赋值就好了。任务一在接收到中间层的采集温度请求时,采集温度,把温度放到底层和中间层的共享内存,然后释放应答信号。任务二在接收到中间层的采集亮度请求时,采集亮度,把亮度放到底层和中间层的共享内存,然后释放应答信号。由于这里的实现与底层控制模块相似,这里就不写任务的实现细节。根据前面两个传感器的共性,我们抽象出一个结构体。

2025-01-24 13:01:31 333

原创 微分方程(2)

微分方程

2025-01-24 12:44:38 3057

原创 指針(2)

是uint8_t类型的。通过pbuf[]占位,malloc申请的内存空间大一点,由于pbuf[]所在的地址就在p的后面,所以p->buf和p+1指向的位置是一样的。再如果指针p的类型是int,即int *p,如果p等于buf[0]的地址,那p+1以后的值就是往后int长度(4个),p+1的值就是&buf[4],*(p+1)访问的就是buf[4]。而相对的,p是一个指针,他的。2.指针p本身是个变量,只不过这个变量的值是他所指向的内存的地址,通过*p就可以读写那块内存,读写的数据长度就是指针类型的大小。

2025-01-24 12:34:29 620

原创 探索字节队列的魔法:多类型支持、函数重载与线程安全

自动推断数据类型和大小,支持不同类型数据的队列操作。通过宏模拟 C 语言的函数重载,灵活处理不同数量和类型的参数。通过禁用中断机制确保队列操作在多线程环境中的原子性,避免数据竞争问题。这些改进使得我们的字节队列不仅可以在单线程环境中高效运行,还能在复杂的多线程系统中保持数据的一致性与安全性。宏不是奇技淫巧宏可以封装出其它高级语言所提供的“基础设施”设计良好的宏可以提升代码的可读性,而不是破坏它设计良好的宏并不会影响调试宏可以用来固化某些模板,避免每次都重新编写复杂的语法结构。

2025-01-24 12:28:12 879

原创 变参函数和可变参数宏

在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用 va_list 、 va_start 、 va_end 等宏,去解析那些可变参数列表我们找到这些参数的存储地址后,就可以对这些参数进行处理了:要么自己动手,自己处理;要么继续调用其它函来处理。i < count;i++)可变参数宏的定义和使用。

2025-01-24 12:10:21 937

原创 关于宏-转载

【说在前面的话】市面上大部分C程序员对宏存在巨大的误解甚至是恐惧,并因此极力避免宏的适度使用,甚至将宏在封装中发挥正确作用的行为视作是对C语言的“背叛”——震惊之余,对于为什么大家会有这种想法的原因,我曾经一度是非常“傲慢的”,这种傲慢与某些人宣称“穷人都是因为懒所以才穷”时所表现出的那种态度并无任何本质不同——然而我错了,在闲暇之余认真看了不少经典的C语言教材后我才意识到:不是读者普遍懒或者轻视教材中有关宏的内容,而是那些对宏来说如同“加法交换律、结合律”一样的基本规则和知识并没有认真且完整的出现在教科书

2025-01-24 11:39:26 983

原创 printf底层实现及扩展

如上图所示,当我们系统里面有多个串口都需要格式化输出的时候该怎么办呢?毕竟底层的fputc()只有一个。当我们知道了printf的实现,我们就可以通过编写不同的fputc的代码来实现不同的功能,比如。printf使用的时候会调用一个底层函数fputc(),下方演示了STM32中的实现。通过上述方式就实现了printf()打印显示液晶屏的功能了。二.灵活修改fputc()扩展printf()的应用范围。三.如何实现多串口格式化输出。

2025-01-24 10:36:36 389

原创 虚数和复数

(3)利用指数函数微分以后函数形式不会变化的特性(这就是为什么要加入实部,转化为复数公式的原因)(2).转换为复数形式(转化的原因是指数函数的积分以后,函数的形式不会发生变化)2.1弧度的定义:弧度是角度的一种单位,是用角度表现圆弧长度的一种方法。2.可以用乘以旋转矩阵的方式,得到(x,y)坐标转β角度后的坐标。e=2.7182818....,它是由下面的公式计算出来的。五.复数的性质、乘法和除法的运算以及极坐标的表示方法。3.用欧拉公式、极坐标2种形式计算复数的乘除法。5.复数用欧拉公式的表示方法。

2025-01-22 16:33:01 707

原创 线性代数(2)

如上图所示,左边就很容易看出是X的三维向量空间向Y的二维向量空间的线性映射,但是用一次方程组就不直观了。本质是利用了乘以一个可逆矩阵后的得到的矩阵与原矩阵的秩相等。学习线性映射是为了通过视觉效果更好得来理解像的意义。也就是说图形旋转也是乘以一个特定的矩阵就可以了。(4)秩求法中左乘和右乘矩阵的计算定理。举例,它的特征值分别是7和2,特征向量。4.图像处理中线性映射的应用举例。2.特征值和特征向量的求法。2.线性映射与矩阵的关系。用线性映射的方式表示就是。3.学习线性映射的意义。(3)特征向量的求法。

2025-01-22 16:29:15 585

原创 线性代数(1)

1.行的标号始终按1~n顺序排列,列号使用排列组合,如果一项里面列号没有按从小到大排序的个数为奇数个时,符号改为﹣号,其余情况都为正号。括号中的每个数叫做元素,同时这个矩阵叫做m行乘n列矩阵。把由映射f形式的像的集合Y所构成的集合叫做值域,而把构成X的集合叫做映射f的定义域。需要注意的是只有当左边矩阵的列数等于矩阵右边的行数时,两个矩阵才能进行乘法运算。还有一点需要注意的是,多个相同矩阵相乘,可以表示为单个矩阵的乘方。最后说下矩阵是否存在逆矩阵的判断方法:行列式的值不等于0。我们将这种形式的组合叫做矩阵。

2025-01-22 16:25:30 553

原创 微积分课程

对于一个已知的任意形式的函数,当我们知道函数a点的值,然后想要知道a点附近的值f(x0),我们就可以用f'(a)*(x0-a)+f(a)来近似知道a。要求p(x)的函数与X轴围成的面积,只要知道p(x)的原函数为q(x),就可以通过q(b)-q(a)算出面积。当 h(x) = f(x) g(x) 时,h'(x) = f'(x) g(x) + f(x) g'(x)•和的微分公式 : {f(x) + g(x)}' = f'(x) + g'(x)满足 f(b)=f'(ζ)(b-a)+f(a)。

2025-01-22 16:20:29 832

原创 微分方程(1)

步骤2:将上述公式中的常数c改为与时间t有关的函数c(t)(1)齐次和非齐次的区别在于常数项是否为0。四.可分离变量微分方程(一阶齐次微分方程)步骤1:先将方程转化为齐次微分方程,求解。根据已知函数的微分,得到函数的积分。(3)导函数的次数决定是几次微分方程。步骤3:将v(t)代入原微分方程得到。(2)一阶二阶看的是微分次数最高项。五.一阶非齐次线性微分方程的解法。对数函数是指数函数的反函数。二.微分方程的一些基本性质。(2)1阶非齐次微分方程。(4)2阶非齐次微分方程。(1)1阶齐次微分方程。

2025-01-22 16:12:53 189

原创 流体力学

流体在边界层的内外侧流动性质差别很大,在边界层内侧,速度梯度很大,流体因为黏性力速度降低得很快,而在分界层外侧,流体速度几乎受到的影响较小。:雷诺数较小时,黏性力对流体的作用占主导地位,流体流动比较平稳,呈现层流状态,流体质点沿着平行于管道轴线或物体表面的方向做有规则的分层流动,各层之间互不混合。湍流是指流体在流动时,流体质点除了有沿着流动方向的总体运动外,还存在着强烈的无规则脉动和混合,流体质点的运动轨迹极其复杂且不规则,流体的速度、压力等物理量在时间和空间上都呈现出随机变化的特性。

2025-01-22 16:11:16 1895

原创 傅里叶解析

分析一个现有的波形,是由哪些基本的正余弦函数构成的,并且计算出幅值和频率。3.sin(nx)与cos(mx),不论m与n是否相等,两函数都正交。如果函数呈正交关系,那么他们的积的定积分为0。2.两个相同频率的正弦,或者两个相同频率的余弦函数的定积分为。1.sin(nx)与sin(mx),当m≠n时,两函数正交。2.cos(nx)与cos(mx),当m≠n时,两函数正交。通过不同频率和赋值大小的简单波形,可以合成想要的波形。内的定积分为0,而常数a0在这个区间的定积分为2。1.两个相交的函数的定积分为0。

2025-01-22 16:08:26 319

原创 电磁场合电磁波

用一个闭合曲面将一个小磁铁包裹起来,此时穿出闭合曲面的磁感线和穿入的一样多,所以对磁感应强度B进行曲面积分的值肯定等于0,那么将这个值除以体积V就还是0。首先我们知道物理中有个定义,B的环路积分=u*I(环路中电流的大小),【B的旋度】的意思就是B/S(B对S的微分),而电流密度i=I/S。真空中没有自由电荷和电流,因此只需将物质中的麦克斯韦方程组的自由电荷和电流的相关项令为 0 即可得到真空中的麦克斯韦方程组。变化的磁场会产生一个旋涡状的电场,且电场的旋度与磁场的时间变化率成正比,且方向相反。

2025-01-22 16:07:07 969

原创 easylog的引入

在我们实际调试代码时,很多时候都需要用串口打印出调试信息,帮助定位问题。一般我们用printf()函数就可以了。但是用printf打印的信息太多以后,面对满屏的信息容易眼花缭乱。easylog是个开源的log输出的工具,代码量小,功能强大。可以按照不同的等级(不同等级输出信息颜色不同),或者按照标签屏蔽部分信息,或者按照关键字屏蔽部分信息。EasyLogger是一款超轻量级(ROM<1.6K, RAM<0.3K)、高性能的 C/C++ 日志库,非常适合对资源敏感的软件项目。

2024-10-07 12:57:11 1411

原创 C语言一些简单的细节记录

比如我们在程序A中定义并申明了一个变量int Val而B、C、D几个.c程序都会要用到A中的int Val,此时我们直接在B、C、D的.c文件中用extern int Val确实也可以访问到这个变量,但是如果我们对A里面这个变量定义修改了呢?先执行表达式1,如果表达式1的结果如果为真,那么执行表达式2,并且这个整体的运算式的结果是表达式2的结果;如果表达式1的结果如果为假,执行表达式3,运算式的结果是表达式3的结果。如果a>b那么结果就是a的值,如果a<b,那么结果就是b的值。

2024-09-14 13:47:23 464

原创 RAM及FLASH分区(STM32为例)

它与RW-data的区别是程序刚运行时这些数据初始值全都为 0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。RW_data:Read Write data,可读写数据域,指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。RO_data:Read Only data,只读数据域,指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。

2024-09-14 11:46:06 964

原创 extern、static、const关键字

在C语言中,修饰符extern用在变量或者函数的声明前,用来以标识变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时,在其它文件中寻找其定义。但是这样定义的变量通常被称为局部静态变量,它的值的不会因为函数调用的结束而被清除,相反当函数再次被调用时,它的值将会是上衣次调用结束后的值。说到作用域,我们需要说明,尽管使用extern关键字修饰的变量,其原本都是全局变量,但如果extern int var声明处于某一函数体内,那么其作用域就在函数体内。关键字修饰的变量,在声明时必须进行初始化。

2024-09-13 14:58:41 883

原创 typedef与define

当然,我们也可已使用定义的类型声明指针变量,或者直接使用typedef关键字定义指向对象的指针类型,如定义结构体指针类型。同样的,如果我们对二维数组采用类似的定义。这样我们在需要使用结构体类型定义一个对象时,我们可以使用CLASSICPID vPID就可以了与使用原始定义是一样的。这样我们就定义了一个指针类型,当我们使用pointer p声明一个指针变量,就和使用int *p的含义是一样的。那它的含义与指针是类似的,如我们定义array a就是声明了一个M行N列的数组,此时使用p=a是可以的。

2024-09-13 13:03:06 630

原创 独立执行体、闭包表达式、串化符#及连接符##

在这个程序中,预处理器首先遇到TO_STRING(VALUE)会替换为#VALUE,然后再替换为"100",所以最终输出的内容是字符串100,回车之后再输出一个换行符。一般我们认为函数声明(上述的void Func(void))和{}是一个整体,一个构成了一个函数,但其实并不完全是这样,C语言中{}是独立的,叫做独立执行体或者。先引入一个例子,比如我们想用一个宏,然后用printf函数打印宏的内容,我们会怎么做呢?当宏参数是另一个宏的时候,凡是宏定义中有#、##的地方,宏参数不会再展开,比如。

2024-09-12 14:11:03 462

原创 联合体与枚举

直白点说:枚举定义了一些符号,这些符号的本质就是int类型的常量,每个符号和一个常量绑定。这个符号就表示一个自定义的一个识别码,编译器对枚举的认知就是符号常量所绑定的那个int类型的数字。当我们要定义的常量是一个有限集合时(譬如一星期有7天,譬如一个月有31天,譬如一年有12个月····),最适合用枚举。1、枚举是将多个有关联的符号封装在一个枚举中,而宏定义是完全散的。//进行完这句后就一切ok了,下面通过访问test中数组a的数据来取出高低字节的数据。// test.a[0]中存储的是高位数据。

2024-09-10 08:37:26 685

原创 C语言指针篇

指针的本质就是有类型的地址。地址指的是地址总线上的地址码表,而类型决定了我们操作这个指针时,要从这个地址码上读写的长度。即指针的类型决定读写一个地址块的数据长度(1字节、2字节、4字节还是结构体定义的长度)。比如(uint8_t *)(0x12345678):C语言中*可以把他后面的内容变成地址码,所以(*)0x12345678)就是把这个常数转化为一个地址码(即指针),那这个指针的类型是什么呢?是uint8_t类型的。

2024-09-09 08:37:28 3262

原创 结构体系列

struct {// a占用3位// b占用5位// c占用8位(即一个字节)// d占用16位(即两个字节)如果是有几位不用怎么办呢?那几位不带位域名称就好了struct {// a占用3位// 把位域名称去掉就可以了// c占用8位(即一个字节)// d占用16位(即两个字节)需要注意的是,位域定义必须是LSB,即前面的为低位。另外对位域成员赋值不能超过他最大能表示的范围。

2024-09-08 10:07:40 2099

原创 FreeRTOS实现命令交互行的功能

在实际工作中,有时候我们希望打印系统信息,但是太多信息会导致很乱看不清,或者我们希望设备一般情况下不要打印信息,所以我们的需求就是可以通过发送一条指令给设备,然后设备打印对应的信息。首先將ZNS文件夹中的上述文件复制到自己的工程中。

2024-09-06 17:56:16 457

原创 C语言学习——sprintf函数详细解释及其用法

文章目录。

2024-09-05 09:15:48 12029

原创 C语言面向对象

抽离出各个对象中共有的方法draw,将其单独放置在一个对象Shape内。各个对象均继承于Shape对象。将各个子对象中的draw方法,设置为各自的实现方法。声明一个Shape对象的指针,并将其赋值为一个子对象的指针。通过上述对象指针,调用方法共有方法draw,执行的是第三步中设置的方法。

2024-09-05 08:57:51 1035

原创 C语言 - 常用的字符串处理函数整理_字符串匹配函数

目录。

2024-09-05 08:42:48 1318

转载 11-FreeRTOS之堆的管理

对于FreeRTOS的链表操作,一定要理解透彻,因为后面的任务TCB等结构体完全依赖于链表操作,尤其注意尾部插入时不能破坏原本链表的公平性。对于多种堆的管理方式,要知道它们适用的场合和大致的原理,根据适用场景适用合适的管理方式。

2024-09-04 12:54:07 347

原创 12.界面切换方法

if (dlg.ShowDialog() == DialogResult.OK)//当程序执行到dlg.ShowDialog()时,参数界面被打开,主界面的程序就一直停止在这里,直到参数界面将 // DialogResult赋值为DialogResult.OK后,参数界面关闭,程序返回主界面继续执行。当在A窗体设置某项参数时,跳转到B窗口该参数的设置界面,设置完成后跳转回A界面(主界面->参数界面->主界面)

2024-09-04 08:46:35 515

原创 11.字符串的一些基本操作

/替换字符串,其实是替换连续某几个字符的组合。//这里设置分隔符为:,;用法:string b = a.Replace("123" , "ABC");//把a字符串中的123全部换成ABC,赋值给b。用法:string b = a.Replace(',' , ' ');//把a字符串中的逗号全部换成空格,赋值给b。int 字符第一次出现的位置 = str.IndexOf(要查找的字符, 从第几位开始找);//按照分割符号分割字符串。

2024-09-04 08:46:10 155

原创 9.FreeRTOS之任务通知

FreeRTOS 从版本 V8.2.0 开始提供任务通知这个功能,每个任务都有一个 32 位的通知值。按照 FreeRTOS 官方的说法,使用比通过二进制信号量方式解除阻塞任务快 45%, 并且更加省内存(无需创建队 列)。在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件标志组,可以替代长度为 1 的队列(可 以保存一个 32 位整数或指针值),并且任务通知速度更快、使用的RAM更少!

2024-09-04 08:41:17 1053

原创 15.freeRTOS之消息邮箱

1、中的消息邮箱freeRTOS实现的消息邮箱是基于任务通知方式而实现的。采用这种方式有什么优势呢?从官方给出的中有说明到,唤醒由于信号量和事件标志组而处于阻塞态的任务,消息邮箱的速度会提升大约 45%,而且这种方式需要的 RAM 空间更小。freeRTOS中的消息邮箱使用是比较灵活的,它可以实现二值、计数信号量、事件标志组、消息队列等通知方式。

2024-09-03 18:40:38 1587

转载 14.FreeRTOS_空闲任务

int i;/*将任务列表的信息写入一个缓冲区pcWriteBuffer。i < 16;i++)/*通过printf函数将任务列表信息打印出来,格式为”%s\n\r"*/注意:要使用vTaskList()函数,需要使能FreeRTOSConfig.h 中如下两个宏:configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS要使用空闲任务的钩子函数,也需要使能宏USE_IDLE_HOOK。

2024-09-03 18:32:17 825

原创 13-FreeRTOS原理剖析:中断管理和临界区_中断临界区

Cortex-M处理器中异常编号为1~15为系统异常,编号为16及以上为外部中断异常,可由片上外设或者外设中断源产生。其中复位、NMI、HardFault异常的优先级固定不变,其它异常可编程。

2024-09-03 18:29:39 1205

原创 12.FreeRTOS之中断中API的使用

但是ISR的API,比如xQueueSendToBackFromISR()在相同情况下不会发起调度(因为在中断里,优先级都比pendsv高,就算发起调度,pensv也不会执行),所以这个API只是把xHigherPriorityTaskWoken这个值设置为pdTrue,然后在函数快结束的时候执行portYIELD_FROM_ISR( xHigherPriorityTaskWoken ),触发pendsv从而触发调度。(1)函数参数里没有等待时间,即不允许写队列等待(保证不在中断中发生阻塞)

2024-09-03 18:13:29 992

传感器在造纸行业的运用

传感器在造纸行业的运用

2024-11-20

传感器在新能源行业的应用

传感器在新能源行业的应用

2024-11-20

传感器在海洋船舶上的应用

传感器在海洋船舶上的应用

2024-11-20

传感器在油气行业的运用

传感器在油气行业的运用

2024-11-20

传感器在液压和气动的应用

传感器在液压和气动的应用

2024-11-20

传感器在冶金、半导体、化工等上的应用

传感器在冶金、半导体、化工等上的应用

2024-11-20

传感器在水及污水上的应用

传感器在水及污水上的应用

2024-11-20

传感器在市政燃气上的应用

传感器在市政燃气上的应用

2024-11-20

传感器在食品制药行业的应用

传感器在食品制药行业的应用

2024-11-20

传感器在机械制造与自动化上的应用

传感器在机械制造与自动化上的应用

2024-11-20

传感器在工业气体上的运用

工业气体上的运用

2024-11-20

EMC与信号完整性分析

文章主要分为:阻抗匹配、电源网络分配、信号完整性以及滤波。文章分多个章节,每个章节从理论分析、数学计算、布板经验、仿真验证等多个方面进行讲解,并配有大量图片,降低理解难度

2024-09-07

EMC快速入门的相关笔记

1.讲解了各类元器件的特性及在EMC中的作用 2.讲解了EMC的几种分析方法 3.文章理论结合实例,深入浅出,系统得了解EMC问题产生的原因及整改措施 4.文章中举了大量实例,使用很多图片,使得内容可读性更强。

2024-09-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除