- 博客(214)
- 资源 (2)
- 收藏
- 关注

原创 WPF Prism框架介绍
一、什么是PrismPrism是一个用于在 WPF、Xamarin Form、Uno 平台和 WinUI 中构建松散耦合、可维护和可测试的 XAML 应用程序框架。二、官方地址https://github.com/PrismLibrary/Prism基于Prism的VisualStudio扩展包模板: Prism Template Pack,下载它后可以快速创建基于Prism的项目。三、Prism框架内容框架中包括 MVVM、依赖注入、Command、Message Event、导航、弹窗等功能
2021-03-01 16:58:19
44926
6

原创 Unity3D界面嵌入WPF界面中(鼠标键盘均可正常响应)
Unity3D界面嵌入WPF界面中(鼠标键盘均可正常响应)1、引用System.Windows.Forms.dll和WindowsFormsIntegration.dllunity3D界面不能够直接嵌入到WPF控件中,但是可以嵌入到WinForm控件中,所以我们需要在WPF中使用WinForm控件作为载体。需要引用上述dll,如下图所示:然后在Xaml文件中引入命名空间即可使用WinForm控件,例如:xmlns:wf="clr-namespace:System.Windows.Forms;ass
2020-10-11 01:06:28
3748
11
原创 【Linux】regmap子系统
前面我们介绍了可以直接使用i2c子系统中数据传输接口就可以进行i2c通信,那为什么又引入了regmap子系统呢?Linux下大部分设备的驱动开发都是操作其内部寄存器,比如I2C/SPI设备的本质都是一样的,通过I2C/SPI 接口读写芯片内部寄存器,使用i2c_transfer来读写I2C设备中的寄存器,SPI接口的话使用 spi_write/spi_read读写SPI设备中的寄存器。regmap。
2025-06-12 16:09:36
330
原创 【STM32 USB】USB CDC类
USB CDC(communication device class)类是usb2.0标准下的一个子类,定义了通信相关设备的抽象集合。usb2.0标准下定义了很多子类,有音频类,CDC类,HID类,打印,大容量存储类,HUB和智能卡等等。CDC类下根据应用场合,又分为多个子类,官方文档主要讲的是PSTN。PSTN(Public Switched Telephone Network)是一个与电信相关的子类,这里只是将其当作一个普通的通信设备使用,并没有使用它的一些电话特性。
2025-02-22 17:40:47
1494
原创 【STM32 USB】USB描述符
偏移字段大小(字节)说明0bLength1设备描述符的字节长度 = 18 个字节,固定为0x1211描述符类型编号,固定为0x012bcdUSB2USB版本号,表示了本设备能适用于那种协议,如USB2.0=0x0200,USB1.1=0x0110等41USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型,0x00不是在设备描述符中定义的,如HID51。
2025-01-16 14:48:15
1663
原创 【STM32 FreeRTOS】优先级翻转与互斥信号量
任务H和任务M处于阻塞态,等待某一事件的发生。任务L正在运行。某一时刻L想要访问共享资源,在此之前他必须现货区对应资源的信号量。L获得信号量并开始使用共享资源。由于H的优先级最高,它等待的事件发生后就抢占了L的CPU使用权。H开始运行。H运行过程中也需要使用L正在使用的资源,由于该资源的信号量还被L占用,所以H只能进入阻塞态,等待L释放该信号量。L继续运行。由于M的优先级高于L,当任务M等待的时间发生后就抢占了L的CPU使用权。M运行。
2025-01-09 17:51:29
427
原创 【STM32】I2C为什么要开漏输出和上拉电阻
假设使用推挽结构,多个设备挂在同一总线上,当存在某一设备将某一信号驱动为高电平,而其他设备驱动为低电平,会导致短路,导致器件损坏或降低寿命。对于开漏结构,任何设备都不能将信号线驱动为高电平。因为每条线上需要使用一个外部的上拉电阻,在输出高阻态时,上拉电阻将总线上拉至高电平。**对总线而言,上拉电阻越大,信号的上升时间就越长,通信速率就越低,反之亦然。:当总线上连接多个设备时,只要有一个设备输出低电平,那么整条总线便处于低电平状态,这时候的总线被称为占用状态,其他设备输出的高电平是无效的。
2025-01-03 17:27:42
840
原创 【STM32】stm32启动流程
3) 系统存储器启动,将系统存储器地址0x1FFF F000映射到0x0000 0000,这样启动以后就相当于从0x1FFF F000开始执行的,值得注意的是这个系统存储器里面存储的其实是STM32自带的Bootloader代码,其实是一个官方的IAP,它提供了可以通过UART1接口将用户的代码下载到Flash中的功能,下载完以后再切换到从Flash中启动就可以正常运行了。其中关键的就是启动文件,启动文件由汇编编写,是系统上电复位后第一个执行的程序,这里就不做详细的解读了。
2025-01-03 11:54:14
1575
原创 【Linux】I2C tools
i2c tool是一个开源工具,需要自行下载进行交叉编译,但是我们的SDK好像自带了该工具代码,所以在开发板中可以直接使用。该命令用于探测i2c总线。表示探测i2c4总线上的设备。注意,该命令检测出来的地址是7位地址。
2024-11-15 18:02:02
623
1
原创 【Linux】i2c子系统
pinctrl {&i2c4 {这是我们定义的设备树节点,是添加到i2c4节点中的,i2c4节点是平台DTS已经定义好的。我们自定义了haptics@68节点,节点中有两个属性比较关键。compatible:该属性中后面的haptics表示该设备的名称或者设备节点名称。格式为。reg:该属性表示该i2c设备的slave地址(7位的)。然后在内核启动过程中会解析该设备树并且注册I2c设备。
2024-11-15 16:28:48
1196
原创 【Linux】设备树
我们前面介绍过平台设备驱动,知道硬件资源信息可以放在设备中,然后在驱动的probe函数中从设备中获取资源信息。但是,Linux3.x以后的版本引入了设备树,设备树用于描述一个硬件平台的硬件资源,一般描述那些不能动态探测到的设备,可以被动态探测到的设备是不需要描述。设备树可以被bootloader(uboot)传递到内核,内核可以从设备树中获取硬件信息。以树状结构描述硬件资源。设备树源文件可以像头文件(.h文件)那样,一个设备树文件引用用一个设备树文件,这样可以实现代码的重用。
2024-10-29 11:17:24
1162
原创 【Linux】创建设备属性节点
* 路径:linux/device.h *//* 路径:linux/device.h */ # define DEVICE_ATTR(_name , _mode , _show , _store) \ struct device_attribute dev_attr_ ## _name = __ATTR(_name , _mode , _show , _store) struct device_attribute {
2024-10-25 14:28:03
646
原创 【Linux】内核中申请内存的方法
都是用于内核空间申请内存都是以字节为单位进行分配所分配的内存,在虚拟地址上连续kzalloc是强制清零的kmalloc操作kmalloc和kzalloc分配的内存大小有限制(128KB),而vmalloc没有限制kmalloc和kzalloc可以保证分配的内存在物理地址是连续的,但是vmalloc不能保证kmalloc和kzalloc分配内存的过程可以是院子过程(使用GFP_ATOMIC),而vmalloc分配内存是则可能产生阻塞kmalloc和kzalloc分配内存的开销小,因此。
2024-10-23 17:35:06
1062
原创 【Linux】平台设备驱动
驱动代码中最好不要使用全局变量,因为驱动一般是支持多设备的,如果有全局变量会有冲突。字符设备驱动中在open函数中可以使用container_of拿到设备信息,但是杂项设备驱动中怎么拿到设备信息暂时未知。
2024-10-18 17:51:44
1164
原创 【Linux】总线-设备-驱动模型
前面,我们介绍了写驱动代码的一些常规步骤,并且也写了最基本的驱动代码,但是那些代码存在着问题,我们将硬件的信息都写进了驱动里了,如果我们在杂项设备驱动中控制led,那么会在硬件操作接口中包含硬件信息,如果引脚有变化,这个驱动代码就得重新修改,虽然修改也很简单,但是从框架的角度来看,这是不合理的,相当于驱动代码写死了。于是,Linux引入了设备驱动模型分层的概念,将我们编写的驱动代码分为两块:设备和驱动。下是该总线下的所有设备,而这些设备都是符号链接,他们分别指向真正的设备(:挂载在某个总线的物理设备。
2024-10-17 09:38:12
1186
原创 【Linux】ioctl分析
一个字符设备驱动通常会实现常规的openreleaseread和write接口,但是如果需要扩展新的功能,通常以ioctl接口的方式实现。fill:#333;user spacevfsdriverioctl()ulocked_ioctl()或compat_ioctl()user spacevfsdriver。
2024-10-14 16:42:33
1342
原创 【Linux】最基本的杂项设备驱动
misc的意思是混合、杂项的,因此misc驱动也叫杂项驱动。当我们板子上的某些外设无法进行分类的时候就可以使用该项驱动。所有杂项设备都共用一个主设备号(10),不同的子杂项设备使用不同的子设备号。
2024-10-12 14:55:22
374
原创 【Linux】最基本的字符设备驱动
前面我们介绍到怎么编译出内核模块.ko文件,然后还加载了这个驱动模块。但是,那个驱动代码还不完善,驱动写好后怎么在应用层使用也没有介绍。
2024-10-11 15:10:56
1021
原创 【Linux】驱动的基本架构和编译
Kconfig文件中配置为default y执行指令进行编译上述指令是编译整个内核,编译后将镜像文件烧录至开发板,驱动会自动加载Kconfig文件中配置为default m执行指令进行编译上述指令是编译驱动模块,编译结果只有.ko文件,需要上传至开发板手动加载(开发板提前烧录好不含驱动的镜像)行编译上述指令是编译整个内核,编译后将镜像文件烧录至开发板,驱动会自动加载Kconfig文件中配置为default m执行指令进行编译上述指令是编译驱动模块,编译结果只有.ko。
2024-09-24 16:19:01
1263
原创 【linux驱动】什么是驱动
在谈驱动之前,我们需要先谈内核。内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,决定着整个操作系统的性能和稳定性。不包括应用层IPC、文件系统功能、设备驱动模块。微内核具有动态扩展性强的优点。Windows操作系统、华为的鸿蒙操作系统就属于这类微内核架构。宏内核架构是将应用层IPC、文件系统功能、设备驱动模块都编译成一个整体。优点:执行效率高缺点:一旦我们想修改或增加内核某个功能时(如增加设备驱动程序)都需要重新编译一遍内核。
2024-09-23 18:14:10
1125
原创 【rk3588】环境搭建及系统编译
在目录下,有不同板型的配置文件(xxxx.mk),用于管理 SDK 每个环节的编译配置,可以查看一下显然,根据名称,我们要使用的是,因为我们要编译buildroot系统。#**roc-rk3588s-pc-buildroot.mk**文件内容如下前3行代码使用source命令来执行位于当前脚本同一目录下的文件。前3行代码使用source命令来执行位于当前脚本同一目录下的/bin/bash配置文件指定了DTS文件和分区表文件等其他文件。上述配置文件中是。
2024-08-29 18:54:12
5433
1
原创 【STM32 FreeRTOS】内存管理
如果是函数中的局部变量,那么就是申请的这里的栈内存。除了FreeRTOS提供的动态内存管理方法,标准的C库也提供了函数malloc()和函数free()来实现动态的申请和释放内存。返回这20字节的地址,剩下的30字节仍然是空闲状态,留给后续的pvPortMalloc使用。heap_4内存管理算法会把相邻的空闲内存合并为一个更大的空闲内存,这有助于减少内存的碎片问题。,也支持内存的申请和释放,并且能够将空间且相邻的内存进行合并,从而减少内存碎片的现象。为啥不用标准的C库自带的内存管理算法?
2024-08-20 11:45:02
788
原创 【STM32 FreeRTOS】Tickless低功耗模式
可以将滴答定时器的中断周期修改为低功耗运行时间,退出低功耗后,需不上系统时钟节拍数。可以在本该空闲任务执行的期间,让MCU进入相应的低功耗模式;当其他任务准备运行的时候,唤醒MCU退出低功耗模式。此宏用于定义需要再系统进入低功耗模式前执行的事务,如:进入低功耗前关闭外设时钟,以达到降低功耗的目的。此宏定义用于使能低功耗Tickless模式,配置1表示使用系统定义好的函数,配置2表示自定义函数。此宏用于定义需要再退出低功耗模式后执行的事务,如:退出低功耗模式后开启之前关闭的外设时钟。
2024-08-19 16:36:48
738
原创 【STM32 FreeRTOS】软件定时器
硬件定时器:STM32芯片自带的定时器模块,硬件定时器的精度一般很高,每次在定时时间达到之后就会自动触发一个中断,用户在中断服务函数中处理信息。软件定时器:是指具有定时功能的软件,可设置定时周期,当指定时间到达后要会调用回调函数,用户在回调函数中处理信息。软件定时器相对硬件定时器来说,精度没有那么高(因为他以时基为基准,系统时钟中断优先级又是最低,容易被打断)。对于高精度要求,不建议使用软件定时器。可裁剪:可以配置宏定义来决定是否使能软件定时器单次和周期:支持设置单次定时器和周期定时器。
2024-08-16 18:16:01
773
原创 【STM32 FreeRTOS】事件标志组
事件标志组:用一个比特位来表示事件是否发生事件标志组是一组事件标志位的集合,可以简单理解为事件标志组就是一个整数。它的每一位表示一个事件(高八位不算)每一位事件的含义,幼用户自己决定,这些位的值为1是表示事件发生了。任意任务或中断都可以读到这些位可以等待某一位成立,或者等待多位同时成立宏:如果该宏为1,则每个事件组包含8个可用的事件位;如果为0,则包含24个可用的事件位97。
2024-08-16 15:48:18
355
原创 【STM32 FreeRTOS】任务通知
任务通知:用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue(32位)就是这个通知值。# endif# endif==# endif1# endif#endif任务控制块TCB里有两个成员变量,一个uint32_t的表示通知值,一个uint8_t的用来表示通知状态。使用队列、信号量、事件标志组时都需要另外创建一个结构体,通过中间的结构体进行间接通信。使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发过来的通知。不覆盖接收任务的通知值。
2024-08-16 12:04:35
732
原创 【STM32 FreeRTOS】信号量与互斥锁
非递归互斥锁只能被一个任务 获取一次,如果同一个任务想再次获取则会失败, 因为当任务第一次释放互斥锁时,互斥锁就一直 处于释放状态。二值信号量通常用于互斥访问或任务同步,与互斥信号量比较类似,但是二值信号量有可能会导致优先级翻转的问题,所以二值信号量更适合用于同步。与非递归互斥锁相反,递归互斥锁可以被同一个任务获取很多次, 获取多少次就需要释放多少次, 此时才会返回递归互斥锁。计数型信号量相当于队列长度大于1的队列,因此计数型信号量能够容纳多个资源,这在计数型信号量被创建的时候确定的。所以,没有实例代码。
2024-08-15 12:14:58
858
原创 【STM32 FreeRTOS】队列和缓冲区
队列是任务到任务、任务到中断、中断到任务数据交流的一种机制。队列可以容纳有限数量的固定大小的数据项。一个队列可以容纳的最大项目数称为它的长度。数据入队出队方式:队列通常用作先进先出(FIFO)缓冲区,其中数据被写入队列的末尾,并从队列的头部删除。FreeRTOS中也可以配置为“后进先出”的方式。数据传递方式:FreeRTOS中队列采用实际值传递,即将数据拷贝到队列中进行传递,FreeRTOS采用拷贝数据传递,也可以传递指针,所以在传递较大数据的时候采用指针传递。多任务访问。
2024-08-14 17:00:49
784
原创 【STM32 FreeRTOS】时间延时函数
指每隔指定的时间,执行一次调用vTaskDelayUntil()函数的任务。换句话说:任务以固定的频率执行。:指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束。
2024-08-13 17:50:03
541
原创 【STM32 FreeRTOS】任务相关API
*返回:**返回的值是以字为单位的高水位标记(例如,在 32 位计算机上, 返回值为 1 表示有 4 个字节的堆栈未使用)。这个函数主要用于调测任务堆栈大小的设置,建议该返回值与堆栈大小设置值差不多就行,也就是实际任务使用了一半的堆栈。第二列:运行时间统计时钟的tick数,实际时间为 tick*10us(本例中运行时间统计时钟的频率为10us)第二列:任务状态信息。X:运行态,B:阻塞态,R:就绪态,S:挂起态,D:删除态。第五列:任务编号,这个编号是唯一的,当任务名称相同的时候可以使用这个作区分。
2024-08-13 15:42:35
565
原创 【STM32 FreeRTOS】任务
使用 RTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行,不依赖于系统内的其他任务或 RTOS 调度器本身。在任何时间点,应用程序中只能执行一个任务,实时 RTOS 调度器负责决定所要执行的任务。因此, RTOS 调度器可以在应用程序执行时重复启停每个任务(将任务调入或调出)。由于任务不了解 RTOS 调度器活动,因此实时 RTOS 调度器负责确保任务调入时的处理器上下文(寄存器值、堆栈内容等)与任务调出时的处理器上下文完全相同。为实现这一点,每个任务都分配有自己的堆栈。
2024-08-09 11:47:17
1700
原创 【STM32 FreeRTOS】FreeRTOS的移植
RTOS会强制将Systick的中断优先级设置为最低,RTOS还会使用Systick中断服务函数进行任务调度,如果这个时候有一个中断优先级较高(高于Systick中断)的中断服务函数中调用了HAL_Delay(),那么意味着会卡死,因为HAL_Delay()函数中也会等待Systick中断进行计算,但是现在还在执行更高优先级的中断。所以这样是有风险的。或者在封装的外设驱动函数中的超时判断,也是使用的Systick。HAL_Delay()函数就是在此基础上实现的,他是一种轮询计数的方式实现delay。
2024-07-26 14:49:04
588
原创 【STM32 IDE】使用STM32CubeIDE创建一个工程
关于IDE的下载安装和环境配置这里暂且不介绍,我们直接使用STM32F407ZGT6创建工程。但是很不幸,我们登录ST账号的时候,出现了网络问题。。。。
2024-07-16 11:36:43
1250
原创 【STM32标准库】读写内部FLASH
所以,一个扇区的大小就够了。最大操作位数会影响擦除和写入的速度,其中64位宽度的操作除了配置寄存器位外,还需要在Vpp引脚外加一个8-9V的电压源, 且其供电时间不得超过一小时,否则FLASH可能损坏,所以64位宽度的操作一般是在量产时对FLASH写入应用程序时才使用,大部分应用场合都是用32位的宽度。由于内部FLASH空间主要存储的是应用程序,是非常关键的数据,为了防止误操作修改了这些内容,芯片复位后默认会给FLASH上锁, 这个时候不允许设置FLASH的控制寄存器,并且不能对修改FLASH中的内容。
2024-07-12 11:04:48
2015
原创 【STM32】MDK的编译过程及文件类型全解
编译:MDK软件使用的编译器是armcc和armasm, 它们根据每个c/c++和汇编源文件编译成对应的以“.o”为后缀名的对象文件(Object Code,也称目标文件), 其内容主要是从源文件编译得到的机器码,包含了代码、数据以及调试使用的信息。链接: 链接器armlink把各个.o文件及库文件链接成一个映像文件“.axf”或“.elf”。
2024-07-09 17:33:54
1983
原创 【STM32标准库】DMA双缓冲模式
设置DMA_SxCR寄存器的DBM位为1可启动双缓冲传输模式,并自动激活循环模式,所以设置普通模式或者循环模式都可以。双缓冲不应用与存储器到存储器的传输。可以应用在从存储器到外设或者外设到存储器。双缓冲模式下, 两个存储器地址指针都有效,即DMA_SxM1AR寄存器将被激活使用。
2024-07-08 15:24:42
3204
3
原创 【STM32标准库】USART+DMA
没有使用DMA的USART,我们在前面已经讲过了。【STM32】USART串口通讯-CSDN博客。现在在该基础上我们加上DMA功能,仅使用DMA进行发送。
2024-07-05 18:48:39
1465
原创 【STM32标准库】在标准库中使用DMA
DMA全称Direct Memory Access,直接存储区访问。DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM和IO设备开辟一个直接传输数据的通道,使得CPU的效率大大提高。STM32F4xx系列的DMA支持外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。
2024-07-03 14:56:43
1104
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人