- 博客(454)
- 收藏
- 关注
转载 嵌入式CAN总线位时序及错误状态
数据帧遥控帧各个数据帧各部分用途:ACK槽位:发送方发送隐形电平1,如果接收方存在,则接收方发显性电平0,如果接收方不存在,那就没有显性电平0了,也就是发送方释放CAN总线,接收方拉起CAN总线。ACK槽位前后,操作总线权利有一个短暂交换,在ACK槽位这一位时,变为接收方操作总线,未给权利交接留出时间,ACK槽位前后,留两个界定符。CRC界定符时,发送方必须发隐形1,除了做一个分割,另一个作用是在ACK槽位前,发送方必须释放总线,发送隐形电平1就是释放总线,ACK界定符,接收方也释放总线。
2025-03-31 23:09:20
8
原创 C++继承和派生
被继承的类称为父类或基类,继承的类称为子类或派生类。“子类”和“父类”通常放在一起称呼,“基类”和“派生类”通常放在一起称呼。派生类除了拥有基类的成员,还可以定义自己的新成员,以增强类的功能。以下是两种典型的使用继承的场景:1) 当你创建的新类与现有的类相似,只是多出若干成员变量或成员函数时,可以使用继承,这样不但会减少代码量,而且新类会拥有基类的所有功能。2) 当你需要创建多个类,它们拥有很多相似的成员变量或成员函数时,也可以使用继承。
2025-03-21 22:33:30
742
转载 C++对象的内存模型
Student 类包含三个成员变量,它们的类型分别是 char *、int、float,都占用 4 个字节的内存,加起来共占用 12 个字节的内存。但是不同对象的成员函数的代码是一样的,上面的内存模型保存了 10 份相同的代码片段,浪费了不少空间,可以将这些代码片段压缩成一份。从运行结果可以看出,在计算类这种类型的大小时,只计算了成员变量的大小,并没有把成员函数也包含在内。事实上编译器也是这样做的,编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对象都共享同一段函数代码。
2025-03-21 20:28:14
390
转载 C++类成员变量与成员函数
在类体中和类体外定义成员函数是有区别的:在类体中定义的成员函数会自动成为内联函数,在类体外定义的不会。当然,在类体内部定义的函数也可以加 inline 关键字,但这是多余的,因为类体内部定义的函数默认就是内联函数。内联函数一般不是我们所期望的,它会将函数调用处用函数体替代,所以我建议在类体内部对成员函数作声明,而在类体外部进行定义,这是一种良好的编程习惯,实际开发中大家也是这样做的。如果你既希望将函数定义在类体外部,又希望它是内联函数,那么可以在定义函数时加 inline 关键字。
2025-03-20 18:44:58
16
转载 C++函数重载过程中的二义性和类型转换
在设计重载函数时,参数类型过少或者过多都容易引起二义性错误,因为这些类型相近,彼此之间会相互转换。func(n);n 是 long 类型,转换为 int 或 double 的优先级都是一样的,编译器不知道如何抉择。如果添加一个函数原型,或者去掉一个函数原型,无论再怎么调用也不会出错了。
2025-03-18 18:16:24
20
转载 STM32CubeMX:使用DAC输出正弦波的三种方法(while,定时器中断,DMA)
一、基本概念DMA 允许某些硬件子系统(如外设)直接与主存储器进行数据传输,而无需 CPU 的持续参与。这样可以大大提高数据传输的效率,释放 CPU 资源以执行其他任务。二、工作原理请求阶段:当外设需要进行数据传输时,它向 DMA 控制器发出数据传输请求。这个请求可以是在特定事件发生时自动触发,例如定时器溢出、数据接收完成等。DMA 控制器接收到请求后,会检查当前是否有其他正在进行的 DMA 传输。如果没有,它会向 CPU 发出总线请求,请求使用系统总线进行数据传输。
2025-03-16 17:59:47
106
转载 STM32CubeMX配置与代码生成界面说明
对于STM32CubeMX的使用这里只是粗略介绍了下,更多使用说明可以参考ST官网的用户手册UM1718(官方文档这个写的非常非常详细,还有大量例子举例),另外在ST中文网还有中文的用户手册《STM32CubeMX用于STM32配置和初始化C代码生成》STM32CubeIDE使用笔记(02):STM32CubeMX配置与代码生成_setupstm32cubemx代码有*.sct-优快云博客。
2025-03-05 19:43:53
303
转载 VS code全局搜索设置及快捷键
在使用 Visual Studio Code (VSCode) 中进行全局搜索时候,总是在整个工程下搜索,搜索的文件出来一大堆,如果事先确定内容在某个文件夹下,可以在全局搜索中设置,指定在某文件夹下搜索,或者排除在哪些目录下搜索。Ctrl + PageUp 或 Ctrl + PageDown:上一个或下一个编辑器(在编辑器组中)这栏里如果最右边高亮填入带路径的文件,指的是在文件中搜索,并把所有符合的内容显示在左边的框中。Ctrl + ] 或 Ctrl + [: 缩进代码(光标左边的一行或所选内容)
2025-03-02 17:23:59
1653
原创 RTOS系统ulTaskNotifyTake怎么知道哪个发送任务通知函数的pxcurrentTCB
函数通过任务控制块(TCB)来知道哪个发送函数的。在 RTOS 系统中,
2025-02-24 21:44:39
150
转载 寄存器r0-r15含义
当中断发生时,硬件自动存储R0-R3,R12,LR,PC,XPSR这8个寄存器,中断返回时自动恢复这8个寄存器。可以理解为M3内核机制进行了一个二级跳,先将8个寄存器数值压入栈中,再将代表中断返回所使用的工作模式以及栈寄存器的EXC_RETURN值存入LR中,中断退出时跳转到EXC_RETURN值,并从栈中取出8个寄存器值,这样就不仅找到了返回地址,又可以找到中断前的工作状态和栈指针。SP是栈寄存器,用来指示当前栈的位置。被压入低地址内存中,也就是说如果向下增长,高地址寄存器先压,向上增长测试低地址先压。
2025-01-14 23:08:39
121
原创 FREERTOS之任务调度函数vPortYield
这里注意的是listGET_OWNER_OF_NEXT_ENTRY()宏并不是简单的从队列中取下第一个任务,而是walk through这个队列,比如上一次调度它从这个队列上取下的是第一个任务,那么这次调度选中的则是该队列中的第2个任务。因此这个地方有些有趣,函数 vTaskSwitchContext () 从名称看给人感觉是完成任务切换的,但是其实并不是这样,它只完成选择下一个运行的任务(也就是将要切换过去的任务),真正的切换时在portRESTORE_CONTEXT()中就完成的。
2025-01-14 21:49:54
507
原创 freertos入门流程
FreeRTOS是一个广泛用于嵌入式领域的开源实时操作系统(RTOS)。通过以上步骤,可以快速入门FreeRTOS,并开始开发基于FreeRTOS的嵌入式应用。
2025-01-12 22:51:04
322
原创 元器件功能简单总结
二极管的作用:整流、过压保护、钳位、电平转换、隔离、防接反续流、限幅、稳压、捡波。电容的作用:储能、滤波、自举、倍压、旁路、去耦。电阻的作用:限流、分压、上拉、下拉、滤波、取样。电感的作用:自感、互感、储能、滤波、谐振。三极管和场效应管的作用:开关、放大。
2025-01-05 13:32:12
138
转载 ffmpeg命令
对编码数据包 进行 解码 得到 数据帧,此刻的数据帧是 高度还原 原始数据信息,也就是使用麦克风直接采集到的数据,但是不是完全一样的。◼ -acodec 设定声音编解码器,如果用copy表示原始编解码数据必须被拷贝。◼ -vcodec 设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。-acodec 设定声音编解码器,如果用copy表示原始编解码数据必须被拷贝。-vcodec 设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。◼ -vframes 设置要输出的视频帧数。
2024-12-29 01:26:35
30
转载 eDiary-白日梦电子记事本基本使用说明【记事本导出和导入方法、本地数据迁移方法、记录工作日报、日历代办等】
双击电脑桌面ediary图表,打开软件的时候,会提示我的日记本路径,右键-->文件中显示,可以本地查看.edf记事本文件的磁盘位置,本地手动备份一份edf文件即可。因为数据在本地,所以需要注意的就是,定期备份一下数据,备份数据方法其实就是把记事本数据.edf文件拷贝到其他地方即可,可以重新命名edf文件名。即可导出一个文件夹,里面包含一系列的子文件,一个子文件代表ediary笔记中的一个文件,一一对应。需要使用右键文档资料---高级--导入/导出功能。导出与导入均不要使用文件-导出和导入,不好使。
2024-12-27 18:49:45
646
转载 江科大笔记—FLASH闪存
读写FLASH的用途:利用程序存储器的剩余空间来保存掉电不丢失的用户数据通过在程序中编程(IAP),实现程序的自我更新第一个用途,对于我们这个C8T6芯片来说,它的程序存储器容量是64K,一般我们写个简单的程序,可能就只占前面的很小一部分空间,剩下的大片空余空间我们就可以加以利用,比如存储一些我们自定义的数据,而且可以充分利用资源。不过这里要注意我们在选取存储区域时,一定不要覆盖了原有的程序,要不然程序自己把自己给破坏了,一般存储少量的参数,我们就选最后几页存储就行了、
2024-12-16 00:18:48
66
转载 江科大笔记—PWR电源控制
在低功耗模式下,也需要保留必要的唤醒电路,比如串口接收数据的中断唤醒,外部中断唤醒,RTC闹钟唤醒等,在需要设备工作时,STM32能够立刻重新投入工作。如果你只考虑进入低功耗,而不考虑唤醒STM32,那不就跟直接断电没区别了吗,所以低功耗模式我们要考虑关闭哪些硬件,保留哪些硬件以及如何去唤醒,当然关闭越多的硬件设备越省电,唤醒就越麻烦。
2024-12-16 00:01:41
407
原创 江科大笔记—DMA数据转运&DMA+AD多通道
代码清单 22‑2 DMA传输参数配置// 开启DMA时钟// 源数据地址// 目标地址// 方向:外设到存储器(这里的外设是内部的FLASH)// 传输大小// 外设(内部的FLASH)地址递增// 内存地址递增// 外设数据单位// 内存数据单位// DMA模式,一次或者循环模式// 优先级:高// 使能内存到内存的传输// 配置DMA通道// 使能DMA。
2024-12-15 19:21:00
913
转载 STM32--DMA直接存储区访问
DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用CPU, 即在传输数据的时候,CPU可以干其他的事情,好像是多线程一样。数据传输支持从外设到存储器或者存储器到存储器, 这里的存储器可以是SRAM或者是FLASH。DMA控制器包含了DMA1和DMA2,其中DMA1有7个通道,DMA2有5个通道, 这里的通道可以理解为传输数据的一种管道。要注意的是DMA2只存在于大容量产品和互联型产品中。
2024-12-14 19:30:16
130
原创 STM32引脚定义、最小系统及工作模式
黄色部分为电源引脚,蓝色部分是最小系统引脚,绿色部分是IO功能引脚,优先推荐使用加粗的IO引脚,没有加粗的IO引脚可能需要另外的配置,非默认引脚功能。第一列表示引脚号:1-48第二列表示引脚名称第三列表示类型:s代表电源,I代表输入,O代表输出,IO代表输入输出第4列IO电平,带FT标记的代表它能容忍5V电压,不带FT标记的代表它能容忍3.3V电压第5列主功能:上线后默认功能,一般和引脚名称相同。
2024-12-06 00:12:53
6353
转载 蓝牙BLE详解
所谓协议,即将指定的字节按照一定的顺序排列起来,以便他人使用自己的设备时,能通过该协议同其他设备进行通信。协议一特点,就是有固定的帧格式,通过该格式发送,接收者通过解读帧格式,进而得到新息内容;
2024-12-03 01:16:10
417
转载 低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
前面说过,每个蓝牙设备就是用来提供服务的,而服务就是众多数据的合集,这个合集可以称为数据库,数据库里面每个条目都是一个attribute。
2024-12-03 00:42:40
259
转载 蓝牙BLE: ATT协议层中属性(Attribute)
ATT(Attribute Protocol)属性层是GATT和GAP的基础,它定义了BLE协议栈上层的数据结构和组织方式。属性(Attribute)概念是ATT层的核心,ATT层定义了属性的内容,规定了访问属性的方法和权限。以编程的眼光来看,属性是一个数据结构,它包括了数据类型和数据值,就如同C语言结构体的概念,开发者可以设计独特的结构,来描述外部世界实体。属性包括三种类型:服务项、特征值和描述符。
2024-12-02 21:45:18
307
转载 BLE地址类型
也许关注BLE的同学都注意到了,BLE设备有多种类型的设备地址,如Public Device Address、Random Device Address、Static Device Address、Private Device Address等等。如果不了解内情,大家肯定会被它们绕晕。不过存在即合理,这样看似奇怪的设计,实际上反映了BLE的设计思路以及所针对的应用场景。让我们通过本文一窥究竟。
2024-12-02 20:36:48
87
转载 BLE协议分析2
蓝牙系统核心架构可分为三个方面:BLE Application和BLE Host 属于应用层APIHCI(Host Controller Interface)为中间层BLE Controller为底层蓝牙芯片其中在该协议将数据以属性(Attribute)的方式抽象出来,用UUID定义不同的属性,并提供一下方法以供远端设备读取、修改这些属性的值。需要注意的是,Handle是用于识别唯一属性的数字,而非UUID,因为。
2024-12-02 20:15:42
83
1
转载 深入浅出低功耗蓝牙(BLE)协议栈及蓝牙连接过程
advertiser。发出广播的设备observer或者scanner。可以扫描广播的设备initiator。能发起连接的设备master或者central。连接成功后的主设备,即主动发起packet的设备slave或者peripheral。连接成功后的从设备,即被动回传packet的设备图11通过时间把observer,initiator和central串起来了,其实这三个角色是相互独立的,也就是说一个设备可以只支持observer角色,而不支持initiator和central角色。
2024-12-02 18:44:52
2025
转载 lsusb命令
lsusb命令显示本机的usb设备列表,可以显示出usb的详细信息,包括设备的读取速度和描述符。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。/usr/share/hwdata/usb.ids文件中记录了所有的USB设备节点的信息,包括制造商、产品号、类、子类、协议等等。Device Status: 0x0003 //设备状态。Device Descriptor: //设备描述符。4)显示指定厂商的设备信息。
2024-12-01 22:01:03
148
转载 硬件USB通信协议深入理解
一个【传输】(控制、批量、中断、等时):由多个【事务】组成;一个【事务】(IN、OUT、SETUP):由一多个【Packet】组成。USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。
2024-12-01 21:49:18
301
转载 Linux设备树语法2
设备树简单理解就是描述设备信息(资源)的一棵树。设备树(Device Tree)用代码体现如下:这些代码被保存在.dts/dtsi后缀文件中,也即设备树源文件 DTS(DeviceTree Source)。这些源文件同我们的C代码一样,并不能直接使用的,而是得经过一个编译过程生成机器可运行的二进制文件,如:dts文件使用dtc工具编译生成dtb文件,这个dtb文件就是内核可以使用的文件。
2024-12-01 21:19:36
47
转载 设备树dts语法1
Arm系统启动,硬件设备可以通过DTS(devicetree)或ACPI引导初始化,这里只讲DTS方式,ACPI是由BIOS配置。如上图,一般来说,arm内核通过dts引导启动,需要内核Image、dtb和filesystem,其中dtb是由dts通过dtc工具生成,里面包括初始化设备的硬件信息。内核Image启动过程中会解析dtb中内容,并根据信息初始化设备平台。这里提一句,dts由虽然由用户配置,但是配置必须与硬件信息相匹配,否则会出现初始化失败或设备部分功能不正常的问题。
2024-12-01 21:09:59
60
转载 Linux驱动 | 从0写一个设备树节点实例
设备树是每一个Linux驱动工程师都必须掌握的一个知识点,有很多之前做单片机的朋友刚接触Linux驱动时,会一脸懵!其实设备树的使用并没有大家想像的那么复杂,对于大部分工程师来说,只要会修改即可。在学习设备树之前,大家一定要搞清楚什么是platform总线,有了这些基础知识后,我们就可以来编写一个设备树的实例。下面彭老师就给大家讲解如何自己添加一个设备树节点,并如何在驱动中提取出设备树的信息。
2024-12-01 19:50:19
182
转载 手把手教linux驱动11-linux设备驱动统一模型
我们使用#把宏参数变为一个字符串。调用:printf("%d",x+3);--> 打印:The value of x+3 is 20这是因为”The value of”#VALUE”is ” FORMAT”\n”实际上是包含了”The value of “,#VALUE,”is “,FORMAT,”\n” 五部分字符串,其中VALUE和FORMAT被宏参数的实际值替换了。用##把两个宏参数贴合在一起调用:ADD_TO_SUM(2,100);--> 打印:sum2+=(100)
2024-12-01 16:46:54
82
转载 内核窥探|在kernel中的链表
一个链表要想区分节点的不同类型,那么节点中必须要有信息能够区分该节点类型,为了方便节点扩展,我们参考Linux内核,定义一个统一类型的结构体:int type;其中成员type表示该节点的类型:有了该结构体,我们要定义其他类型的结构体只需要包含该结构体即可,这个思想有点像面向对象语言的基类,后续派生出新的属性叫子类,说到这,一口君又忍不住想挖个坑,写一篇如何用C语言实现面向对象思想的继承、多态、interface。下面我们定义2种类型的结构体:i2c这种类型设备的专用结构体:
2024-12-01 16:39:31
52
转载 linux文件系统初始化过程
从图中可以看出将文件分为符号链接和非符号链接两种情况处理,这是因为符号链接文件是一种特殊的文件,只有第一个符号链接文件的inode存储的是真实数据,而其他符号链接文件inode中存储的是第一个符号链接文件的路径名,因此需要把第一个符号链接文件的路径名缓存起来,缓存的数据结构是hash表,所以在处理符号链接文件时多了一些hash表的操作,因此分为了符号链接文件和非符号链接文件这两种情况来处理。另外,rootfs为VFS提供了'/'根目录,所以文件操作和文件系统的挂载操作都可以在VFS上进行了。
2024-11-30 00:42:02
102
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人