- 博客(50)
- 资源 (5)
- 收藏
- 关注
原创 FreeRTOS学习——Systick中断、SVC中断、PendSV中断
当SVC指令被执行后,处理器会根据中断向量表中的信息跳转到相应的SVC中断处理函数,执行SVC指令时,处理器会自动保存当前的上下文,并将处理器的模式切换为特权模式,从而允许执行受限的操作。ldr r3, pxCurrentTCBConst2:将pxCurrentTCBConst2的值(即pxCurrentTCB的地址)加载到寄存器r3中。配置系统的滴答定时器,以允许操作系统根据配置的频率生成定时中断,从而支持任务的调度和管理。msr psp, r0:将恢复后的任务栈指针r0存入PSP(进程栈指针)。
2024-09-23 20:56:10 924
原创 FreeRTOS学习——接口宏portmacro.h
原子操作是指在多线程或多任务环境中,**一个操作要么完全执行成功,要么完全不执行,不会在中间被挂起或打断。**对于时间片操作,若标识为原子,在此期间所有对时间片的修改和读取都是一个不可分割的动作。
2024-09-18 20:04:59 927
原创 FreeRTOS学习——链表list
FreeRTOS学习——链表(列表)list,仅用于记录自己阅读与学习源码*list_t只能存储指向list_item_t的指针。每个list_item_t都包含一个数值(xItemValue)。大多数时候,列表是按项目值升序排列的。*创建的列表已包含一个列表项。此项的值是可以存储的最大值,因此它始终位于列表的末尾,并充当标记。列表成员pxHead始终指向此标记,即使它位于列表的末尾。这是因为尾部包含一个返回指针,指向列表的真正头部。
2024-09-16 22:26:14 1017
原创 FreeRTOS学习——代码覆盖率测试宏mt
在代码中使用 mtCOVERAGE_TEST_MARKER() 时,预处理器会直接移除这个宏调用,不会留下任何代码。mtCOVERAGE_TEST_DELAY特意放在代码的一个关键部分,通常是为了确保通过操作函数时,所有逻辑判断和指针操作都能被仔细测试。#define mtCOVERAGE_TEST_MARKER() ((void)0) 表示宏展开为一个空操作,保留一个空语句。它的主要目的是确保在某些特定情况下,代码的所有可能路径都能被测试到。它确保在某些特定情况下,代码的所有可能路径都能被测试到。
2024-09-14 14:46:43 268
原创 使用Clion开发STM32——移植FreeRTOS
其实在STM32cubeMX中就可以直接配置FreeRTOS,rtthread等操作系统,而且使用接口封装过的,很方便。但我还是想手动一直一遍,肯定有不一样的收获。
2024-08-16 15:22:14 1321
原创 FreeModbus学习——接收状态机xMBRTUReceiveFSM
当接收状态机状态为初始化态,接收到一个数据,进入接收状态机,不存储这个数据,而是重启定时器。再接收,再重启,直到这一帧完成(帧与帧之间会有个时间间隔),然后进入定时器中断,将接收状态机变为空闲态,并发布ready事件,代表协议栈就绪。协议栈使能后,会将接收状态机赋值为初始化态,串口接收使能,且定时器也使能(重新计数),定时器进入溢出中断,然后会将接收状态机由初始化态变为空闲态。然后再将接收状态机置为空闲态。当接收状态机为空闲态时,开始接收第一个数据作为帧首,然后将接收状态机置为接收态,重新计数定时器。
2024-08-03 17:20:23 962
原创 FreeModbus学习——定时器
接收状态机为空闲态时,接收到一个字符,会进入串口接收中断,串口接收中断中会将接收到的字符保存作为帧首,并且把接收状态机变为STATE_RX_RCV。但是万一这个时候串口接收寄存器已经有数据了咋办,那会进入串口接收中断函数,会调用xMBRTUReceiveFSM,当接收状态机为STATE_RX_INIT时,会清空定时器重新计数。当接收状态机为空闲态STATE_RX_IDLE,接收到第一个数据时作为帧首,然后接收状态机进入接收态STATE_RX_RCV,并且使能定时器(重新计数)。说明一帧已经接收完毕。
2024-07-25 19:55:02 1033
原创 Clion开发STM32——移植FreeModbus
网上用keil的比较多,用Clion的比较少,如果你也用Clion,那么希望本文可以给你提供些许参考。
2024-07-25 17:52:11 1171
原创 FreeModbus学习——读输入寄存器eMBFuncReadInputRegister
也就是说经过eMBFuncReadInputRegister这个函数处理之后,打包好的帧已经放在了pucFrame,长度放在了usLen。调用回调函数eMBRegInputCB读取寄存器数据,eMBRegInputCB这个函数会把读到的数据继续存放在pucFrameCur 帧里。就是说这个指针pucFrameCur刚开始指向pucFrame这一帧数据的起始位置,然后打包一个数据,pucFrameCur+一个。读寄存器数据,其实就是读数组嘛,寄存器是16位的,所以定义数组也是16位的SHORT型。
2024-07-24 21:20:08 809
原创 FreeModbus学习——xFuncHandlers功能码处理
这句话就是说,定义了一个变量,这个变量是pxMBFunctionHandler 函数指针类型。在mb.c文件中,有一个数组是static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX]首先看这个数组的类型 :xMBFunctionHandler ,也就是说这个数组中的每一个元素都是xMBFunctionHandler。以读输入寄存器为例(首先要在mbconfig.h文件中打开这个功能(默认打开))那么这个读输入寄存器函数在哪?
2024-07-24 18:27:37 394
原创 stm32h7串口发送寄存器空中断
关于stm32串口的发送完成中断UART_IT_TC网上资料挺多的,但是使用发送寄存器空中断UART_IT_TXE的不太多。
2024-07-24 16:16:26 816
原创 FreeModbus学习——eMBPoll轮询
接收状态机为空闲态时(每次定时器溢出中断会将接收机状态置为空闲态),接收到一个字符,会进入串口接收中断,串口接收中断中会将接收到的字符保存作为帧首,并且把接收状态机变为STATE_RX_RCV。直到一帧结束,也就是距离下个字符超过定时器溢出时间,进入定时器中断,此时接收状态机还为STATE_RX_RCV,这就意味着接受完成了一帧。协议栈使能后,会将接收状态机赋值为初始化态,且定时器也使能,定时器进入溢出中断,会将接收状态机由初始化态变为空闲态,并且发布一个EV_READY事件。
2024-07-23 19:23:54 1764
原创 FreeModbus学习——eMBEnable协议栈使能
先进行协议栈状态判断,若eMBState == STATE_DISABLED即初始化完成了,就激活协议栈。串口接收使能,发送禁止。在定时器第一次溢出后会将接收状态机的状态由STATE_RX_INIT变为STATE_RX_IDLE。Modbus初始化后,协议栈状态由eMBState由未初始化变成了STATE_DISABLED。先将接收状态机赋值为初始化状态 eRcvState = STATE_RX_INIT;eMBRcvState有四个状态:初始化,空闲态,接收中,帧无效(错误)
2024-07-23 17:41:03 397
原创 FreeModbus学习——eMBInit初始化
在调用xMBPortSerialInit进行串口初始化,这个函数在portserial.c文件中,这个函数是留给用户自己实现的,就是初始化函数,实际上串口初始化放在外面自己初始化也可以,反正只要初始化了就行。所以设置Prescaler = 11999;,这样一个时基就是12000/240000000 = 1/20000 = 1/20ms = 1000/20 us = 50us。在mb.c文件中还定义了几个回调函数指针,这里只用到了前三个,分别是字节接收,发送空,定时器溢出回调函数。
2024-07-23 16:05:26 950
原创 FreeModbus学习——portevent事件
如果队列中有事件,则就将队列中的事件eQueuedEvent赋值给eEvent ,事件被取走了,那么队列里就没有事件了,所以xEventInQueue = FALSE;eEvent 为要发布的事件,将xEventInQueue 置为TRUE,即队列中有事件了,然后将eEvent赋值给eQueuedEvent ,即队列中的事件为eEvent。在mbport.h文件中有事件类型的定义eMBEventType,有事件状态有四种,或者说有四种事件:就绪,帧接收完成,处理,帧发送完成。首先定义了两个静态变量。
2024-07-23 14:46:41 294
原创 STM32H7串口中断服务函数会禁止中断
同时也会禁止发送完成中断,调用UART_EndTransmit_IT来进行操作。在中断服务函数HAL_UART_IRQHandler中,会禁止接收中断。
2024-07-23 14:13:00 209
原创 rtt设备驱动框架学习——内核对象基类object
这个基类是内核所有对象的基类在rt-thread/include/rtdef.h文件里有对内核对象基类object的定义object属性有 内核对象名字 , 内核对象类型 , 内核对象标志,还有一个链表节点。
2024-07-06 00:10:43 620
原创 rtt设备驱动框架学习——链表
这个宏的作用是通过结构体成员的指针 ptr 和成员名 member,计算出包含该成员的结构体的起始地址,并将其转换为 type 类型的指针。_inline函数也称为内联函数或内嵌函数,_inline定义的类的内联函数,函数代码被放入符号调用表,使用时直接展开,不需要调用,即在编译期间将所调用的函数的代码直接嵌入到主调函数中,是一种。(type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)):将计算结果转换回 type 类型的指针。
2024-06-30 17:50:25 1105
原创 嵌入式系统面向对象的程序设计原则
简单地说,就是尽可能让一个子系统(或一个结构体)的功能比较单一,减少对其他子系统(或其他结构体)的依赖。低耦合:一个子系统(或者一个结构体)的实现,尽可能少地调用到另一个子系统 (或另一个结构体)的功能。6.接口函数在C文件中实现,内部函数定义为static函数,内部变量定义为static。高内聚:一个子系统(或者一个结构体),尽可能只完成一个功能,即最大限度地耦合。4.删除一个模块,应当只影响有依赖关系的其他模块,而不应该影响其他无关部分。2.模块只对外暴露最小限度的接口,形成最低的依赖关系。
2024-06-29 17:04:37 204
原创 STM32驱动AD5676R
数据首先装入MSB (DB23),前四位是命令位,C3到C0,其次是4位DAC地址位,A3到A0,最后是16位数据字。这些数据位被传输到SCLK的24个下降沿上的输入寄存器,并在SYNC的上升沿上更新。当 RESET 被激活时,输入寄存器和 DAC 寄存器将更新为零刻度或中刻度,取决于 RSTSEL 引脚的状态。将该引脚脉冲拉低允许任何或全部的DAC寄存器被更新,如果输入寄存器有新数据,这允许同时地更新所有 DAC 输出。寻址输入寄存器和DAC寄存器都在同步的上升沿上更新,输出开始改变。
2024-05-30 00:09:07 962 3
原创 Clion开发STM32——添加自己文件
发现新加入的文件后CmakeList.txt会自动添加LINKER_SCRIPT。报错clion No such file or directory。修改CMakeLists_template.txt即可。期间还有一个坑,编译进度已经到最后了,但是还是报了错。这样可以是可以,但是每次重新生成代码,会被重新覆盖。有网上有教程,让修改CMakeLists.txt。把下面这行后面的文件删掉即可。
2024-04-14 17:38:14 372
原创 8_正确认识回流路径(参考平面)
(a)直流电路信号回流路径(b)高速信号回流路径对于高速信号当信号源输出一个高频信号(实际上就是信号的沿)时,从信号传输的角度讲,它并不是一下子就能达到信号的接收端。信号的上升沿要逐一通过每一个微小(Δx长度)的等效电路,并且在这个微小的等效电路上建立起稳定的电磁场结构,然后才能继续将这个电磁场能力传递到下一个等效电路上。
2023-08-24 15:00:26 2079
原创 5_串扰的产生与预防
当高速信号沿着某一根导线传播时,其电场和磁场将会通过某种方式耦合(影响)到其他导体线路内。当这种耦合的电磁场强度达到一定量时,就会使邻近线路产生无法预期的信号,这样就导致了串扰串扰是由于变化的电磁场通过耦合的方式引起的分为:感性串扰,容性串扰在实际电路中,容性串扰和感性串扰是同时发生作用的感性串扰的强度随着串扰耦合长度的增加而增加,当然也随着L1上的信号强度增加而增加,在时间上,随着上升沿的消失而消失,极性和入侵者L1上的原始信号极性相反。
2023-08-22 16:04:28 255
原创 3_信号完整性问题分类
所谓信号完整性,是指在不影响系统中其他信号质量的前提下,位于此信号传输路径上的各个负载能够尽最大可能地复原(接收到)驱动端所发出的原始信号的状态”所有的信号完整性以系统正常、稳定工作为目的,而不是以单个信号的“完美波形”为目的。按照Eric博士的观点,所有的信号完整性问题可以分为如下四类:●● Crosstalk——相邻传输线之间的信号串扰问题;● PI Related——与电源和地分布相关的信号及电源完整性问题;
2023-08-22 10:54:39 279 1
原创 2_高速电路中的阻抗理论基础
在高速系统中,所有的现象都可以用如下的阻抗特性来解释:● 由于传输线的阻抗不连续,引起信号的反射,从而引起信号本身的畸变;● 由于传输线的耦合(耦合是阻抗构成的一部分),引起信号间的串扰,造成临近区域信号的畸变;● 由于电源系统的某个区域分布阻抗过大,使得该区电源系统的供电不足、谐振,从而造成相关器件的性能损失,甚至混乱;● 由以上各种阻抗特性的不可控而带来的高速信号畸变或者电源系统混乱,最后都会影响到系统的EMI(电磁干扰)对于高速信号系统的设计最后都会归结为对信号传输阻抗的设计。
2023-08-21 22:42:08 314 1
原创 1_电磁波与高速系统理论基础
微波:频率在300MHz至300GHz的电磁波毫米波:频率在30GHz至300GHz的电磁波亚毫米波:频率在300GHz至3000GHz的电磁波相应的电磁波频段称做微波、毫米波频段。根据电磁波频率、波长与速度的关系f×λ=3×10^8m/s可知,微波的波长范围在1m至0.1mm之间一个理想的周期方波信号从频域上看,是由倍频信号组成的。各倍频信号的能量也不尽相同,倍频信号的频率越高,其能量越小截取到5倍频信号能量就包含了原信号中大约90%的能量。
2023-08-21 22:32:36 225 1
原创 15_基于信号完整性的高速系统设计
电源会带来低频噪声(小于1kHz),在电源上增加10μF以上的电容就能很好地消除这种低频噪声,同时还可以为电路的开关电流提供路径。========= = =PCB的叠层设计= = ================== = =地弹效应处理= = ================== = =PCB的布局= = ================== = =PCB的布线= = ================== = =反射处理= = ================== = =电源滤波= = =========
2023-08-18 21:12:52 70 1
原创 14_高速PCB设计流程
(7)利用HyperLynx BoardSim进行布线后仿真:BoardSim接受PCB设计文件,对PCB进行整板快速扫描,发现过冲、延迟、串扰及EMI辐射超出设计要求的网络,并给出详细的结果报告;(4)规则设置:对于高速电路设计,必须设置很多设计规则来规范布局和布线,以保证电磁兼容性和信号完整性的要求。(2)用HyperLynx LineSim进行布线前的信号完整性分析。(6)布线:常用步骤为手工布线——自动布线—手工布线。基于信号完整性分析的PCB设计流程如下图所示。(3)网表输入,导入PCB。
2023-08-18 20:49:04 116 1
原创 13_高速PCB布线策略和技巧
寄生电容过孔本身存在着对地或电源的寄生电容D2为过孔在内层上的隔离孔直径;D1为过孔焊盘的直径;T为PCB的厚度;ε为板基材的相对介电常数过孔的寄生电容延长了电路中信号的上升时间,降低了电路的速度。寄生电感(危害更大)过孔还具有与其高度和直径直接相关的串联寄生电感。h是过孔的高度;d是中心钻孔的直径过孔的寄生串联电感会削弱旁路电容在电源或地平面滤除噪声的作用,减弱整个电源系统的滤波效用。因此旁路和去耦电容的过孔应该尽可能短,以使其电感值最小。
2023-08-18 20:31:31 106 1
原创 12_高速电路PCB布线拓扑和端接
布局原则:①使布局适合于信号流通,并使信号尽量保持方向一致②以每个功能电路的核心元件为中心,围绕这个中心来进行布局③应尽可能使元器件平行排列④元器件离电路板边缘一般不小于2mm⑤尽可能缩短高频元器件之间的连线⑥某些元器件之间可能有较高的电位差,应加大它们之间的距离。
2023-08-17 23:30:00 213 1
原创 11_高速PCB的分区
不同的逻辑器件所产生的RF能量的频谱都不同,信号的频率越高,与数字信号跳变相关的操作所产生的RF能量的频带也越宽,要防止工作频带不同的器件间的相互干扰,尤其是高带宽器件对其他设备的干扰。解决上述问题的办法是采用功能分割,即将不同功能的子系统在PCB上实行物理分割。目的:把与特定子区域相关的电磁场限制在需要这部分能量的区域。功能分割需要注意两个方面:处理传导和辐射的RF能量传导的RF能量会通过信号线在功能子区域和电源分配系统之间进行传输辐射的RF能量通过自由空间耦合。
2023-08-17 00:23:07 145 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人