- 博客(64)
- 收藏
- 关注
原创 基于STM32的多圈绝对值编码器过零点问题
若系统直接计算位置差(目标-当前=100-65440=-65340)并控制电机运动,电机会误判需要反向连续旋转65340计数(相当于反向转约15.98圈)——这显然不合理!因为实际上,电机只需正向旋转196计数(约0圈+100计数,或理解为反向转15圈+正向转100计数,总移动量远小于65340)即可到达目标。在实验中,通过手动旋转编码器模拟实际设备的运动(因无真实电机,无法自动转动,但可通过手动改变编码器位置复现逻辑问题)。如有问题,欢迎大家评论区留言,批评指正!
2025-10-28 16:25:39
794
原创 页式存储管理
页式存储管理的实现原理如下:首先将物理内存划分为固定大小的内存块,称为物理页面(physical page)或页框(page frame)。同时,将逻辑地址空间也划分为相同大小的块,称为逻辑页面(logical page)或简称页面(page)。该方案的核心思想是打破存储分配的连续性,允许程序的逻辑地址空间分散在多个离散的内存块中,从而提高内存利用率。页表记录了任务逻辑页面与内存物理页面之间的映射关系。每个表项存储了逻辑页面对应的物理页面编号,通过逻辑页面号(作为索引)即可快速定位到对应的物理页位置。
2025-10-26 18:58:17
656
原创 基于STM32的多圈绝对值编码器的调试
需要注意的是485模块分为本设计中的模块,还有MAX485模块。MAX485模块实现通讯的时候需要注意与MCU相连端还需配置控制器引脚。磁编码器为21位的绝对位置传感器,能够应用于17位的高性能伺服器中,兼容多摩川通信协议,通信速率达2.5Mbps。响应:1A 00 7A 6D 0F 0A 00 00 00 00 08。响应:92 89 13 31 75 96 2A 9D 13 7E。本设计的485模块,大家在某宝即可购买到,接线的话直接和编码器的。本设计主要应用到的模块如下,仅对关键模块进行了特殊说明。
2025-10-24 20:45:00
1305
原创 嵌入式-->地址映射
具体实现时,在每一个可执行文件中,要列出各个需要重定位的地址单元的位置,然后由一个加载程序来完成装入及地址转换的过程。装入后,由于分区的起始地址为1000,需要将四条指令中的逻辑地址进行调整:将200改为1200,204改为1204。动态地址映射的基本原理是:在程序加载到内存时,不对指令代码进行任何修改,而是在程序运行过程中,仅在需要访问内存单元时才进行地址转换。时,硬件自动提取相对地址 200,与基地址寄存器相加,得到物理地址 1200,再据此访问内存单元,从而确保程序正确运行。
2025-10-16 11:39:44
958
原创 常见的嵌入式操作系统
VxWorks是美国WindRiver System公司开发的一款嵌入式实时操作系统,具有良好的可靠性和卓越的实时性,是目前嵌入式系统领域中使用最广泛、市场占有率最高的商业系统。该系统完整实现了任务管理、存储管理、通信管理、错误管理和中断管理等核心功能,主要应用于联合式航空电子系统中的单功能机载设备,如显示控制计算机、机电监控处理机和通信导航处理机等。所有进程都在独立的地址空间运行。该系统具有结构紧凑的特点,内核提供任务调度管理、时间管理、进程通信、内存管理和中断服务等核心功能。
2025-10-16 09:00:00
758
原创 汇编语言程序设计
它采用助记符替代机器指令的操作码,使用地址符号或标号代替指令或操作数的地址,显著提升了程序可读性并降低了编程难度,因此也被称为符号语言。段是具有特定名称的独立指令或数据序列,可分为代码段和数据段:代码段存储执行指令,数据段存储运行时所需数据。在ARM程序中,可以存在多个ENTRY声明,但必须至少包含一个。BL指令执行两个操作:首先将子程序的返回地址保存到LR寄存器,然后将程序计数器PC设置为目标子程序的首条指令地址。编写汇编语言程序时需遵循相应的语法规范和约定,其核心是汇编指令,它决定了汇编语言的特性。
2025-10-12 21:15:00
546
原创 C语言栈和队列
由于顺序队列的存储空间容量是提前设定的,所以队尾指针会有一个上限值,当队尾指针达到该上限时,就不能只通过修改队尾指针来实现新元素的入队操作了。在栈中,进行插入和删除操作的一端称为栈顶(top),相应地,另一端称为栈底(bottom)。C语言程序运行时,其代码和数据所占的内存空间会有不同的布局和安排,但是一般都包括正文段(包含代码和只读数据)、数据区、堆和栈等,Linux系统中进程的内存布局如下。由于栈中元素的插入和删除仅在栈顶一端进行,因此不必另外设置头指针,链表的头指针就是栈顶指针,链栈的表示如下图。
2025-09-24 10:30:00
722
原创 嵌入式硬件设计
其设计注重安全性、可靠性与高性能,通常以交流市电作为输入,经过变换与稳压处理后,输出常见的直流电压(如12V、5V、3.3V等),属于典型的二次电源设备。固定的输出电压有:[3.3V,5V,12V],可调版本可以输出37V以下的任意电压。该器件能够稳定地将输入电压降至+8V,使用时需确保输入为不低于12V的直流电源,且输入电压应高于输出电压一定压差,才能实现稳定的8V输出。在其设计中,当NE555的第三引脚输出高电平,通过D1向C1充电,电压可达11V,当NE555输出为低电平时,D1被C2反偏截至。
2025-09-14 20:33:52
955
原创 C++智能指针
C++标准库提供了三种主要的智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr。std::weak_ptr是一种不控制对象生命周期的智能指针,通常与std::shared_ptr一起使用。std::shared_ptr是一个共享所有权的智能指针,多个std::shared_ptr可以指向同一个对象。std::unique_ptr是一个独占所有权的智能指针,意味着它管理的对象只能有一个所有者。
2025-09-08 22:20:35
260
原创 嵌入式软件移植
嵌入式软件与通用软件的不同在于,嵌入式软件高度依赖于目标应用的软硬件环境。软件的部分功能函数是汇编语言编写的,与处理器高度相关,可移植性差。在嵌入式应用软件开发中,系统通常对正确性和实时性有较高要求,因此往往需要借助执行效率较高的汇编语言来实现关键功能。然而,这种方式往往会导致软件的可移植性显著降低。另一方面,一个已经稳定运行的嵌入式软件或其部分子程序,由于其经过多次应用、测试与维护,具备较高的可靠性,在后续类似应用领域的开发中往往具备较高的复用价值。
2025-08-26 23:12:59
804
原创 STM32串口中断
数据到达接收端B的UART硬件,产生接收中断。处理器执行接收中断服务程序,读取数据并处理。中断结束后,继续接收后续数据,直到接收完成。通过中断方式,接收端B可以在后台自动接收数据,减少了轮询的开销,也能有效提高实时性。
2025-08-26 21:24:08
560
原创 嵌入式文件系统
操作系统基本上以文件的形式管理磁盘及其他存储设备上的数据结构,负责管理和存储文件信息的软件称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关的软件、被管理文件以及实施文件管理所需的数据结构。文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。其主要功能是建立文件、存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。由于应用背景和系统结构的不同,嵌入式文件系统与桌面文件系统在很多方面有较大的区别。
2025-08-26 09:24:50
747
原创 字符设备驱动、块设备驱动和网络设备驱动
当修改设备树后烧录后,在sys目录下的bus下的i2c总线会看到我们创建的设备,当使用指令insmod加载驱动文件的时候,驱动使用i2c_add_driver()将自身注册到I2C总线上,当内核检测到与该驱动相匹配的I2C设备时,会调用此sht30_probe函数来进行设备的初始化和设置。字符设备驱动动态申请设备号是:int alloc_chrdev_region 静态申请和注册设备号:int register_chrdev_region(事先定义主次设备号)用途:字符设备用于简单的输入输出设备;
2025-08-20 21:10:56
412
原创 静态编译和动态编译
静态链接库是.lib格式的文件,一般在工程的设置界面加入工程中,程序编译时会把lib文件的代码直接链接进目标程序中,因此会增加代码大小,静态链接的可执行文件会大一些,程序运行的时候不再需要其它的库文件,不能手动移除lib代码。动态链接还可以消除程序对不同平台之间的依赖的差异性,一个程序在不同的平台运行时可以动态链接到操作系统提供的动态链接库,这些动态链接库相当于在程序和操作系统之间增加了一个中间层,从而消除了程序对不同平台之间的依赖的差异性。
2025-08-20 21:07:07
407
原创 嵌入式软件--->任务间通信
任务间通信是指任务之间为了协调工作,需要相互交换数据和控制信息。共享内存指的是各个任务共享它们地址空间当中的某些部分,在此区域,可以任意读写和使用任意的数据结构,把它看成是一个通用的缓冲区。一组任务向共享内存中写入数据,另一组任务从中读出数据,通过这种方式来实现它们之间的信息交换。在有些嵌入式操作系统中,不区分系统空间和用户空间,整个系统只有一个地址空间,即物理内存空间,系统程序和各个任务都能直接对所有的内存单元进行随意地访向。
2025-08-17 22:17:55
966
原创 Uboot讲解
软件层次:一个同时装有BootLoader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图:PC机中的引导加载程序由BIOS(其本质是一段固件程序)和位于硬盘MBR中的引导程序(GRUB或LILO)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘中的引导程序读到系统内存中然后将控制权交给引导程序。引导程序的主要任务是将内核从硬盘上读到内存中,然后跳转到内核的入口点去运行,即启动操作系统。在嵌入式系统中,通常没有像BIOS。
2025-08-16 12:45:15
737
原创 STM32MP157基础配置教程
STM32MP1 的 USART3 接口和 UART5 接口,USART3 连接 RS485 和RS232的公头,UART5 连接 GPS 和 RS232 的母头。为了方便调试,一般通过网络方式启动 Linux,如果每次修改 Linux 系统文件或者 linux 下的某个驱动以后都要将其烧写到 EMMC 中去测试,这样太麻烦;更新设备树与Linux内核在tftpboot下替换,nfs下面的是根文件系统,存放应用程序代码。修改后的驱动文件和应用文件,直接拷贝到此处,开发板里的驱动文件也会更新,二者是同步的。
2025-08-15 22:45:44
1219
原创 嵌入式系统的存储体系
Cache的主要功能是对外部存储设备(一般指内存)的缓冲,在一般的Cache设计中,Cache把整个内存分成大小相同的块,块的大小因不同Cache芯片的实现而不同。SRAM初始加电时的状态是随机的,写入新状态,旧的状态就会消失,新状态会一直维持到写入新的状态为止。众所周知,程序由代码和数据组成,在一般情况下由于容量限制代码和数据需要存放在内存中,当处理器要执行程序时就需要不断地访问内存,出于技术和成本问题,内存的读取速度通常比CPU的速度慢很多,因此这会严重制约系统的实际性能。
2025-08-10 21:52:10
1646
原创 嵌入式软件开发工程师面试问题---2
当MOS管关闭,如果没有上拉电阻,IIC信号线是处于一个高阻状态,电平是未知的,开漏输出是没有高电平的输出能力的。第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。栈:用于函数调用和局部变量管理,自动分配和释放,速度快。
2025-08-10 15:34:47
519
原创 嵌入式软件开发工程师面试问题---1
在C++中,析构函数被声明为虚函数的原因主要是为了确保基类指针或引用 指向派生类对象时,能够正确调用派生类的析构函数。具体来说,如果一个类有虚函数,它通常也应该将析构函数声明为虚函数。如果基类的析构函数不是虚函数,当你通过基类的指针或引用删除派生类对象时,只会调用基类的析构函数而不会调用派生类的析构函数。这会导致派生类中动态分配的资源没有被正确释放,进而引发内存泄漏等问题。
2025-08-10 15:16:32
1239
原创 STM32的自举
系统存储器模式(System memory mode):这是一种特殊的自举模式,当BOOT0为高电平,BOOT1为低电平时,STM32会从系统存储器中启动程序。系统存储器是STM32内部的只读存储器(ROM),其中存放了一个串行引导加载器(serial bootloader),它可以通过串口、USB或者CAN等接口来接收外部的程序,并将其写入主闪存或者外部的存储器设备。STM32有一个特殊的功能,就是可以通过不同的方式启动程序,这就是所谓的自举模式(Boot Mode)。
2025-08-05 09:05:44
199
原创 按键中断检测
编写中断处理函数(ISR),处理按键事件。// 清除中断标志位// 清除EXTI Line 0的中断标志// 读取按键状态// 按键按下// 其他处理逻辑硬件检测:按键按下导致GPIO引脚电平变化。中断请求生成:配置GPIO引脚和外部中断,使能中断并设置中断优先级。中断控制器处理:中断控制器接收到中断请求,查找中断向量表,找到对应的中断处理函数。CPU响应中断:CPU保存当前上下文,跳转到中断处理函数。执行中断处理函数:处理按键事件,清除中断标志。恢复中断前的程序。
2025-08-05 09:03:48
468
原创 STM32中的DMA
主要功能:把数据从一个位置移动到另一个位置,而不占用cpu,即在传输数据的时候,CPU去执行其他任务。DMA三个功能:请求-》通道-》仲裁(仲裁器根据任务的优先级来完成对外设或者存储器的访问)DMA1有七个通道,DMA2有五个通道。可以外设到存储器也可以存储器到存储器。存储器到外设:USART。DMA:直接存储器访问。外设到存储器:ADC。
2025-08-04 22:57:00
141
原创 定时器和计数器
从硬件的角度来看,定时器和计数器的概念是可以互换的,其差别主要体现在硬件在特定应用中的使用情况。系统时间就是由定时器/计数器产生的输出脉冲触发中断而产生的,输出脉冲的周期叫作一个“滴答”,也就表示发生了一次时钟中断。时钟中断服务程序对当前正在运行的任务的已执行时间进行更新,使任务的已执行时间数值加1,任务的已执行时间同任务的时间片相等,则表示任务用完分配给它的时间配额,需要结束它的运行,转入就绪队列。可编程间隔定时器又称为计数器,主要功能是事件计数和生成时间中断,以解决系统时间的控制问题,具体如下图所示。
2025-08-04 22:31:06
569
原创 STM32MP157--->OPT3001驱动编写
opt3001光照传感器模块,实际上也是ADC采集,只是通过IIC或SPI接口来获取到传感器内部的ADC数值。由于Linux内核的drivers自带驱动,直接采用官方驱动开发,属于IIO框架。下面介绍一下应用程序的编写过程,首先需要明确显示哪些变量,之后在/sys/bus/iio/devices/iio:device0 路径中查看变量都有哪些。上述路径是opt3001驱动的目录,将此文件复制至opt3001文件夹下(个人新建),之后需要编写一个Makefile文件和应用程序文件。
2025-07-30 21:04:06
914
原创 STM32MP157--->驱动sht30模块和sht45模块
这里,它从inode的i_cdev字段(这是一个指向字符设备结构的指针)出发,通过sht30_dev结构体中的cdev成员,找到sht30_dev结构体的起始地址。//使用i2c_master_recv函数从I2C设备读取数据,sht30->client是之前初始化的I2C客户端指针,尝试读取6字节到buf中。/* 把数据保存到 client->dev.driver_data */ //将sht30结构体的指针存储在I2C客户端的私有数据中,并且将客户端指针也保存在sht30结构体内,以便后续操作使用。
2025-07-30 20:47:06
1155
原创 STM32MP157--->触摸屏按键存数据至SD卡
官方的内核已经配置好SD卡,插入sd卡后,在 /dev目录下存在mmcblk1p1。通过qt实际存储到根文件系统的目录是/run/media/mmcblk1p1。
2025-07-30 20:37:05
200
原创 STM32MP157的屏幕调试
3)调试屏幕的 DPI 参数,最后需要调试 MIPI 屏幕的 DPI 参数,也就是 HBP、 HFP、 BP、VFP 等这些参数。1)屏幕背光调试,背光不亮,屏幕也就什么都看不到。mipi屏幕是高频信号,布线的时候一定要等长,即差分布线,同时还要考虑阻抗匹配,mipi的阻抗匹配是100欧姆。下面代码是传感器驱动代码:注意由于是在官方内核下编译的传感器模块,所以在Makefile中要替换为官方的编译路径。注意:修改完上述文件后,需要reboot重新启动,如果通过按键复位,无法实现功能。
2025-07-30 20:29:29
434
原创 C++调用C为什么要加extern
而在C++中,函数可以重载,但是重载函数的名字是相同的,所以不能只用函数名标识函数,而必须增加额外信息来加以区分不同的重载函数,如例子函数的符号为 _add_int_int ,这样的名字包含了函数名、函数参数的数量及类型信息,C++靠这些额外的信息就可以根据参数的不同实现函数的重载。在C语言中,函数是不允许重载的,每个函数名字都是独一无二的,所以我们编译的时候,可以直接用函数的名字唯一标识这个函数(类似于_add这样的符号);为什么C和C++函数编译方式是不同的呢?C和C++函数编译方式是不同的。
2025-07-30 20:22:16
196
原创 FreeRTOS-中断管理
BASEPRI指的是stm32的中断优先级(优先级号越小,优先级越高),并不是FreeRTOS中的任务优先级(优先级号越大,优先级越高)。关中断:中断优先级号小于阈值的,不会受freertos的影响。不带返回值:不考虑BASEPRI的值。不带返回值的意思是,在向BASEPRI写入新值时,不用先将BASEPRI的值保存起来,即不用考虑当前中断状态是怎么样的,这意味着这样的函数不能在中断中调用。开中断:根据ulBASEPRI 的参数,选择保护和不带中断中断保护的版本。
2025-07-27 15:56:26
369
原创 C语言中的条件编译
ifdef#ifndef和#endif预处理指令在C语言中用于条件编译,可以根据宏定义或条件选择性地包含或排除代码块。这在处理平台特定代码、调试信息和配置选项时非常有用。通过合理使用这些指令,可以提高代码的灵活性和可维护性。
2025-07-27 15:45:20
510
原创 FreeRTOS-互斥量
优先级继承机制的大概原理:当一个低优先级的任务正在使用互斥信号量时,此时一个高优先级的任务也要访问信号量,此时互斥量就会让低优先级的任务翻转,得到与最高优先级任务相同的优先级,让高优先级任务进入阻塞状态。在我们设计系统的时候要避免发生优先级翻转的情况(前图),这样会使高优先级任务收到影响,使用互斥量保护机制可以让这种影响降低至最小。
2025-07-27 15:11:01
1059
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅