- 博客(52)
- 资源 (4)
- 收藏
- 关注
原创 嵌入式设备上电启动全流程详解(从硬件复位到应用运行)
嵌入式设备的上电过程是一个系统化的硬件和软件初始化流程,本文将详细解析从电源接通到应用程序运行的完整过程,帮助开发者深入理解嵌入式系统启动机制。嵌入式设备上电过程涉及硬件复位、Bootloader执行、C环境初始化、外设配置、OS启动和应用初始化等多个阶段。理解完整的启动流程对于:优化启动时间解决启动故障设计可靠系统都具有重要意义。建议开发者结合具体芯片手册和调试工具,深入掌握自己平台的启动特性。
2025-03-27 14:09:47
712
原创 存储器基础介绍
文章目录存储器分类按存储介质分类按存取方式分类按信息的可改写性分类按信息的可保存性分类按功能和存取速度分类存储系统层次结构主存的基本结构存储器分类按存储介质分类磁存储器:磁存储器都以磁性材料作为存储介质,利用磁化单元剩磁的不同磁化方向来存储数据0 和1。它主要包括磁芯、磁盘、磁带存储器等,目前广泛使用的磁盘、磁带中都包含机械装置,所以其体积大、存取速度慢,但磁存储器单位容量成本最低。半导体存储器:用半导体器件组成的存储器称为半导体存储器。目前有两大类:一种是双极型存储器,主要包括TTL 型和ECL
2024-10-12 09:19:18
732
原创 MCU的启动
启动地址:0x1FFF0000从系统存储器启动,这种模式启动的程序功能是由厂家设置的。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader 中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。boot0=0,Flash memory启动。
2024-10-11 20:37:18
981
原创 嵌入式设备调试基础知识
仿真器是一种用于模拟和调试电子设备的工具。它可以创建一个虚拟环境,使开发人员能够测试硬件和软件的交互,并进行错误排查和性能优化。调试接口用于对MCU进行编程和调试,这里的编程指将源代码编译后的.hex文件写入MCU闪存特定地址中,调试指MCU运行代码debug的过程。它通常用于生产过程中,将固件或软件代码写入到微控制器、存储器芯片或其他可编程设备中。这里SWD和JTAG的对应关系未TCK-SWDCLK、TMS-SWDIO。其中VBAT表示电源,第二个引脚表示地线,其余的是SDW协议接口引脚。
2024-10-11 19:12:28
389
原创 IAR相关知识介绍
IAR是一家瑞典公司,IAR Embedded Workbench是该公司研发的带有C/C++编译器和调试器的集成开发环境(IDE)。IAR在安装软件本身外,还需要安装驱动,安装程序可以直接安装驱动。IAR工程下.eww、.ewp、.ewd、.map、.hex、.bin、.browse、.ewt、.o文件的作用!1.eww:工作空间文件(不可删除)这个文件是多个工程的索引文件,也是我们打开IAR工程的文件。2.ewp:工程文件(不可删除)
2024-10-11 15:22:49
675
原创 原码、反码、补码
二进制的最高位是符号位:0正1负正数的原码、反码、补码都一样负数的反码=负数原码符号位不变,其他位取反负数的补码=负数的反码+10的反码、补码全是0Java没有无符号数计算机中的计算都是以补码的形式进行我们看到的结果是原码
2024-08-07 21:44:51
130
原创 环境变量相关知识辨析
可以发现:系统变量中的INCLUDE和VS 2019项目属性中包含目录所起作用一样,但是作用范围不一样。总结起来,用户环境变量是与每个用户账户关联的,用于存储用户特定的配置信息,而系统环境变量是与整个操作系统关联的,用于存储全局配置信息。用户环境变量的修改需要重新登录才能生效,而系统环境变量的修改会立即生效。(Registry,繁体中文版Windows操作系统称之为登录档案)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。在电脑“环境变量”设置中可以看到。
2024-07-04 16:26:27
441
原创 C++类基本常识
static变量是类变量,一般需要在类外部显示的初始化。const变量和static变量都存在于。const变量在构造列表初始化。C++的类都会有8个默认方法。,生命周期是整个程序。
2024-06-21 16:30:29
182
原创 wstring与wchar_t
wstring 是由宽字符wchar_t构成字节列表。一个wchar_t字符的大小是2 字节,char字符大小是1字节。
2024-06-21 09:57:28
409
原创 Qt多线程之moveToThread()函数
(之前对多线程的理解不够深入,有一些认识是错误的,最近重新写多线程程序,然后修改一下博客)在使用“继承QObject+QThread”实现多线程时,出现了一个BUG,最后发现是对moveToThread()函数理解不到位导致的。为了弄清楚这个问题最好将Demo代码拷贝,跟着跑一遍。
2024-06-13 22:42:37
1484
原创 C++ extern “C”
1、c与cpp的编译规则不同,extern "C"告诉cpp编译器已c的风格编译代码。c语言的extern关键字作用是说明“此变量/函数是在别处定义的,要在此处引用”。2、cpp调用c的函数时,除了声明extern “C”外还要在c文件添加宏定义。VS编译动态链接库供其他语言使用时使用到的命令。
2024-06-07 11:22:43
254
原创 Qt的四种多线程的简单代码
QThread的子类只有当调用start()方法时,run()函数是在子线程运行的;调用start()后会在子线程执行重写的run()函数,run()函数执行完毕后,线程自动销毁。调用QThread的start()后,子线程会一直处于running状态,当有槽函数接收到信号后,就会放到run()函数中执行,执行完毕后子线程不会自动销毁。2、由于没有继承QObject,QRunnable子类无法直接使用信号绑定槽函数的方式进行进程同步;QtConcurrent::run()是Qt调用多线程最简单的一种方式。
2024-05-22 16:39:37
248
原创 QT的互斥量和信号量
1、互斥锁(mutex) 是最常用的锁,它可以保护共享资源,使得在某个时刻只有一个线程或进程可以访问它。自旋锁(spinlock)可以用来保护共享资源,使得在某个时刻只有一个线程或进程可以访问它,但它会使线程或进程“自旋”,直到获得锁为止。当一个线程需要访问共享资源时,它首先必须获取信号量,这会将信号量的计数器减少1,而当它完成访问共享资源后,它必须释放信号量,以便其他线程也可以访问共享资源。当一个线程需要写入共享资源时,可以获取写入锁,这样其他线程就不能访问该资源,从而保证数据的完整性和一致性。
2024-05-21 15:51:39
1593
原创 实体店买衣服与网购的价格差
结论:老子以后试完衣服拍了照片就跑,再也不会不好意思不买了,学费已经交了。1.两件短袖+两条裤子+一双鞋子实体店=1138。网上买大概 = 850。
2024-05-19 17:34:50
552
原创 DLMS解析器
DLMS/COSEM协议比较复杂,完成协议部分内容的协议栈以及报文解析器花了5个月时间,同时同事也完成了基于协议栈的上位机,可以实现和DLMS电表进行通信。这里记录一下完成协议栈和报文解析器过程中遇到的报文类型。(推荐博文。
2024-05-17 16:53:32
1809
原创 Qt creator构建DLL库
4. 在新项目中包含dll库的头文件,既可以调用dll文件。第一次编译运行无法通过,此时需要将.dll文件复制到debug文件下,重新编译。3. 添加头文件和外部依赖库。添加外部依赖库后,可能需要修改配置文件中自动生成的.dll文件名。
2024-03-23 14:02:49
636
原创 C++生成动态连接库
静态库和动态库区别是库的加载时间不同。:在链接阶段库将会与.o目标文件一起打包生成可执行文件,成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。:在编译阶段都不会有任何动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。优点:动态库可以实现进程之间资源共享,有一份就行。升级程序简单,不需要重新编译。
2024-03-22 17:57:13
1290
原创 C++模板
模板是c++的一种特性,允许函数或者类(对象)通过泛型(generic types)的形式表现或者运行模板可以使得函数或类在对应不同的类型(types)的时候正常工作,而无需为每一种类型分别写一份代码。其中前两个例子的语法可以混用。
2024-03-20 11:00:00
251
原创 IEEE 754 浮点数表示
110000011101100101=−11×2100000112−127×10.1011001012−27.15625。
2024-03-05 14:13:40
425
原创 VS+Qt 串口读电表地址
改代码使用698协议读电表地址,串口监听显示电表接收和发送正常,但是PC端接收报文不完整,详细原因等待进一步研究。VS2019读串口操作。代码要想正常运行,需要进行相关配置,参考。
2024-01-31 18:32:22
524
原创 PyQt5的QScrollArea无法显示滑动框
Python 3.7的Pyqt5在Pycharm下提示ScrollArea实例有setLayout()函数,但是打开官方文档会发现根本没有该函数的实现,着实坑了我一把。建议将布局放在Widget()实例中,然后使用setWidget()方法实现滚动滑窗。
2023-11-15 17:58:20
356
原创 Python软件打包之Nuitka
对于第三方依赖包较多的项目(比如需要import torch,tensorflow,cv2,numpy,pandas,geopy等等)而言,这里最好打包的方式是只将属于自己的代码转成C++,不管这些大型的第三方包!当然这里你会发现真正运行exe的时候,会报错:no module named torch,cv2,tensorflow等等这些没有转成C++的第三方包。在装有Mingw并配置环境变量的情况下,直接。打包成一个exe文件的命令。至此,exe能完美运行啦!
2023-11-02 16:58:28
814
原创 Pyqt5 线程、计时器、UI卡顿
这段代码模拟端口每隔1秒向服务器发送报文,在发送报文0.4秒后读取服务器返回内容。这个时候会出现UI界面卡顿的情况。这是因为time库是由python写的,Qt是由cpp写的,在sleep等待时,Qt程序被迫阻塞。在Pyqt5程序中经常出现耗时的操作,这个时候一般使用Qthread或者Qtimer将耗时操作交给新的线程。解决方法:将timer.sleep()放在QThread中。
2023-10-20 17:17:27
454
原创 计算机中整数的存储
可是如果表示有符号数字,因为有负零1000和正零0000的存在,就只能表示15个数字,因此人为规定1000为-8(没有任何一个数的补码是1000),这样半个字节可以表示的数字仍未16个,即-8~7。大家肯定都听过“计算机只有加法,没有减法”这句话,3-1在计算机中是这样运算的0011(3的补码)+1111(-1的补码)=0010(2的补码)。另外,利用补码表示法,-8~7就构成了一个圈:7(0111)+1(0001)=-8(1000),-8(1000)-1(1111)=7(0111)。
2023-10-13 16:10:08
80
原创 Python函数修饰符@
Python Class类中有很多属性及方法,其中方法主要有三种:实例方法、类方法和静态方法。作用是为现有函数增加额外的功能,常用于插入日志、性能测试、事务处理等等。(3)修饰符返回值取代被修饰函数。(2)修饰符的参数是被修饰函数。(1)修饰符是一个函数。
2023-10-12 18:39:58
256
原创 Git本地仓库建立远程连接
Git除了使用克隆一个仓库(命令会自动将其添加为远程仓库并默认以 “origin” 为简写),还可以使用命令添加远程仓库,origin表示远程仓库名字。
2023-08-31 13:49:41
241
1
原创 Git上传代码到Github
global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定的不同的用户名和邮箱。–cat ~/.gitconfig 查看用户信息。
2023-08-16 10:24:34
63
原创 C语言函数声明
前面我们在使用 printf()、puts()、scanf() 等函数时引入了 stdio.h 头文件,很多初学者认为 stdio.h 中包含了函数定义(也就是函数体),只要有了头文件就能运行,其实不然,头文件中包含的都是函数声明,而不是函数定义,函数定义都放在了其它的源文件中,这些源文件已经提前编译好了,并以动态链接库或者静态链接库的形式存在,只有头文件没有系统库的话,在链接阶段就会报错,程序根本不能运行。有了函数声明,函数定义就可以出现在任何地方了,甚至是其他文件、静态链接库、动态链接库等。
2023-08-08 22:34:16
240
原创 C语言结构体
对于结构体,sizeof 将返回结构体的总字节数,包括所有成员变量的大小以及可能的填充字节。同时对一个结构体中的多个变量进行赋值只有在声明时才可以进行。
2023-08-08 18:20:03
74
原创 #define和typedef的区别
又称宏定义,标识符为所定义的宏名,简称宏。#define 的功能是将标识符定义为其后的常量。一经定义,程序中就可以直接用标识符来表示这个常量。
2023-08-08 07:48:48
518
softmax.zip
2019-05-14
fun.zip代码+实验报告+推导过程
2019-05-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人