- 博客(44)
- 资源 (4)
- 收藏
- 关注
原创 pyinstaller 打包后运行出现: ModuleNotFoundError: No module named。
使用pyinstaller打包遇到的问题
2025-01-17 09:45:21
3022
原创 idf.py menuconfig按方向键完全没反应
现象:在新版本的esp-idf中(vscode+ win10),输入 idf.py menuconfig可以正常弹出菜单,按回车键可以进入菜单项,按ESC可以返回。解决方法:按J,K键代替方向键的上下键。
2024-05-23 09:11:30
618
原创 分散加载(8)---使用举例
所以,code_ram_1的加载域地址必然是在LR_ROM_1范围中,图中分配的地址 = 0x08000a74 (Code),0x08000ab4 (Data). 当程序跑起来,code_ram_1必然在ER_RAM_1的范围中,图中分配的地址 = 0x2000004c. 基于这个原理推理,加载域中包含的执行域的地址范围全部加起来,不得超过加载域的最大范围。3)分散加载文件有什么好处?test_variant_C,test_func_A(u8 input),存放到ER_RAM_3;五、分散加载文件内容。
2023-04-03 16:06:27
813
原创 分散加载(7)---输入节input section
这个适配器是用来找出输入节名称的,比如在程序中定义了一些输入节名称:__attribute__((section(“ram_code_1”)), __attribute__((section(“ram_code_2”)), __attribute__((section(“ram_code_3”)), 那么可以使用ram_code*作为input_section_pattern,这样就可以把所有含有ram_code的输入节名称找出来,输入节对应的内容(代码或者数据)放到指定的存储器位置。
2023-04-03 16:00:55
603
原创 分散加载(6)---根域root region
使用偏移量 +0 的方式定义根域,有一个特别需要注意的地方,就是后面的执行域都视作根域,但是包含ZI数据的执行域除外。在分散加载文件中,我们必须定义一个这样的执行域:这个执行域的开始地址必须等于它所在的加载域的开始地址,并且在这个执行域中,必须包含整个程序(也称镜像文件)的入口点(entry point),说白了就是我们常用的启动文件***.S,在这个文件中包含了RESET段,C语言入口函数_main(). 这样的一个执行域,称作根域;必须定义根域,必须把入口点放在根域中,否则连接器报错。
2023-04-03 15:57:39
651
原创 分散加载(5)---函数放在指定内存位置
通过连接器,把一个函数放在指定存储器期望的位置,大体有两种方法。第二种,指定函数在某一个范围,使用name section,配合分散加载文件使用。我也不知道准确的翻译,大概意识就是定义一个段section,给这个段取一个name,合起来就是name section。2)方法二:使用name section把函数放在指定存储器位置,配合分散加载文件。1)方法一:使用放置符号__at把函数放在指定存储器位置,无需修改分散加载文件。这种方式可以指定函数在一个执行域的地址范围内,而不是指定在绝对物理地址。
2023-04-03 15:51:56
1044
原创 分散加载(4)---变量放在指定内存位置
第二种,指定全局变量在某一个范围,使用name section,配合分散加载文件使用。这种情况,一定要注意,在分散加载文件中,放置".ARM.__at_0x20004000"所在执行域的地址范围包含了0x20004000地址。感觉这种方法,没有必要,方法二不修改分散加载文件,也能实现目的,何必还使用方法三修改分散加载文件呢。3)方法三:使用name section把变量放在指定存储器位置,配合分散加载文件。2)方法二:使用放置符号__at把变量放在指定存储器位置,配合使用分散加载文件。
2023-04-03 15:49:45
1240
原创 分散加载(3)---sct文件说明
1)分散加载文件由加载域Load region和执行域Execution region组成,一个分散加载文件中可以定义多个加载域Load region,一个加载域Load region中可以定义多个执行域Execution region,一个执行域Execution region可以定义多个输入节input section。2)区域单位名称: 域region,节section。2.1)加载域的构成:定义一个加载域,由以下几个部分组成:加载域名称,基地址,属性,最大内存空间,至少一个执行域。
2023-04-03 15:45:24
1744
原创 分散加载(2)---分散加载文件执行机制
分散加载文件一般用于复杂的工程,比如一个MCU/SOC中有几块ROM/FLASH,几块RAM,我们需要指定,哪些代码存放在哪个位置,哪些数据存放在哪个位置。固件烧录到芯片,此时还没有运行,此时的代码(code)和数据(RO,RW,ZI)在芯片存储器(这里的存储器指flash/ROM/RAM等)中的分布,应该就是Load view。ARM连接器ArmLink通过分散加载文件,把目标文件*.o,库文件*.lib,数据,连接在一起,生成镜像文件---即编译后的elf,bin,hex文件,以及输出map文件。
2023-04-03 15:37:27
994
原创 分散加载(1)---初步介绍
使用MDK开发cortex m 系列内核,复杂的场合需要使用到分散文件scatter file,scatter file类似gcc编译器的连接脚本,就是分配存储器空间,代码和数据按自定义的设置,存放到自己想要存放的位置。打开keil的help---about uVsion ,可以看到使用的编译器,汇编器,连接器等信息,如下图,注意:这里的信息跟你选择的编译器类型有关。四、分散文件官网文件。
2023-03-30 17:12:20
772
原创 Keil/MDK编译后内存大小RO,RW,ZI理解.
从上面可以看到,ZI Data即占用了FLASH空间又占用了RAM空间。这是因为ZI Data数据,在固件烧录的时候是存放在FLASH中,当程序运行后,会把这部分数据拷贝到RAM中。4)ZI Data:表示程序中定义的初始化值为0的全局变量和函数内部定义的static变量;3)RW Data:表示程序中定义的初始值非0的全局变量和函数内部定义的static变量;2)RO Data:表示程序中定义的常量,const定义的变量,总共占用的空间;1)Code(inc. data): 表示所有代码占用的空间;
2023-03-30 16:10:36
1606
1
原创 pyqt5点击按钮多次执行槽函数
我每次打开子界面,就执行一次这个代码,那么,我打开了N次,就connect了N次,当点击按键btn_open_comm就会执行N次连接的槽函数。解决方法: 只执行一次连接槽函数的代码(上面红色部分的代码)。
2022-11-30 11:42:56
1493
原创 vscode 无法跳转到定义引用
该安装的插件(C/C++, C++ intellisense)都已经安装,但是,有时候用着用着就无法跳转了,按CTRL + 鼠标左键,局部变量也无法跳转到定义位置,局部变量也无法自动代码补全,全局变量倒是可以跳转,但是也是乱跳转,结构体变量代码补全也是异常。之所以会出现这个波浪线的现象,可能是文件改变了路径,或者用VS CODE打开文件的时候,习惯的直接把代码文件拖入VS CODE中,正确配置c_cpp_properties.json这个文件,确保include头文件文件的波浪线消失。
2022-10-05 10:08:06
16384
原创 蓝牙属性表理解(Bluetooth Attribute Protocol / ATT )
一、在server端编写维护属性表(Attribute Table) 属性表一般在server端维护(设备端也称作:peripheral,server,slave。与之对应的手机端,称作:central,client,master。),一般在设备端编写MCU程序,维护属性表,蓝牙芯片MCU厂商(比如TI CC26xx)都有自己的SDK,我们的精力主要用在维护属性表,属性表编写好后,设备注册,蓝牙连接成功,就可以进行通信,收发数据了。 属性表的内容一般就是属性的内容,对应4个部分,attr...
2021-11-29 11:35:51
8470
原创 Linux系统(4.1.5)字符设备驱动相关知识(2)——驱动程序调用过程
一、字符设备驱动调用过程的一些理解: 设备驱动文件(也就是设备驱动程序源代码ap3216c.c)在内核中注册成功后,会生成一个设备文件,设备文件的名称就是设备驱动文件中定义的设备名称(.name字段的值 = ap3216c),设备文件注册成功后,在./dev.目录下就可以看到这个驱动文件ap3216c。 在应用程序中通过open函数打开一个文件,打开的文件就是设备文件./dev./ap3216c,一旦打开文件成功,就会创建struct file结构体的对象,创建struct inode结...
2020-08-31 14:15:59
523
原创 Linux系统(4.1.5)字符设备驱动相关知识(1)——主要的结构体
一、字符设备驱动主要结构体:1.struct file(文件结构体) , struct file_operations(文件操作函数集结构体),以上结构体都位于include/linux/fs.h;2.struct inode (节点结构体), struct inode_operations ,以上结构体都位于include/linux/fs.h;3.struct cdev(字符设备结构体) ,结构体都位于include/linux/cdev.h;3.struct device(设备结构体.
2020-08-31 13:22:18
1186
原创 Linux应用程序调用驱动程序的过程
一、大体调用过程应用程序位于用户空间,驱动程序位于内核空间,Linux系统规定,用户空间不可以直接调用内核空间的函数。所以必须经过系统调用,应用程序才可以调用驱动程序的函数。具体系统调用的过程,这是属于更高级别的知识,以后有机会再补充,大体就是通过C库函数实现的,目前只要知道这个过程即可。另外,应用程序通过系统调用去调用驱动程序的函数,还有一个前提就是驱动程序必须留有接口,这里的接口就是ops函数操作集(有点类似Windows的DLL),所以我们一般在驱动程序中设计好接口,然后实现接口函数。..
2020-08-23 16:49:56
7107
原创 使用STVP菜单乱码阴影很乱变坏等情况
使用STM8S的STVP开发环境的时候,有时候所有菜单突然变得乱七八糟,有时候卸载软件重装,重建工程都不能解决这个问题,很是绝望,是不是。 发现一种解决的办法: 1.卸载STVP软件;2.在注册表中搜索"st_toolset",搜素出来的相关项删除,逐步按F3全部删除出现的相关项(最关键的一步);3.重新安装软件;4.删除原来的工程,新建工程。变坏的界面如图:...
2020-06-30 09:59:47
444
原创 STM8S003/903 使用ADC中断功能
对使用STM8S003/903这个片子的ADC中断功能(包括两种情况),记录下自己的理解:一、单通道使用ADC中断的场合: 如果项目中只需要采集一路模拟量,并且想使用中断方式来获取AD值,那么,设置如下:void ADC1_Init(void){ CLK->PCKENR2 |= CLK_PCKENR2_ADC; ...
2020-01-08 13:40:03
2719
原创 STM8S003/103K使用uart1注意事项
我们知道STM8S003/103K只有uart1, 如果按中文手册设置,会出现uart1无法使用的情况:一、中文手册描述有一个错误或者说误导吧,如图:如果按上面的信息配置uart1的时钟:CLK->PCKENR1 |= CLK_PCKENR1_UART1; //UART1 Clock Enable. CLK_PCKENR1_UART1=0x04将会出现UART1...
2019-12-21 16:54:55
1306
原创 U-BOOT-1.1.6 移植SMDK2440
在u-boot-1.1.6基础上,把smdk2410移植为适合smdk2440的开发板。Smdk2440开发板使用的是100ask网的JZ2440 V3开发板,硬件资源:CPU:ARM920T; SOC:S3C2440A; SDRAM——2块EM63A165TS-6G组成64M/32位; NOR FLASH ——MX29LV160DBTI, 2M/16位; NAND FLASH ——K9F2G...
2019-12-05 19:19:00
556
原创 嵌入式/单片机关于BLDC使用PID调速的理解
1.对于Kp系数的理解: u(t) - u(t-1)是两次偏差之间的差值, Kp就是系数, P = (1/Kp)*[u(t) - u(t-1)], 我们调节的就是Kp这个值。 从公式可以明白,P表示的就是偏差的趋势,如果偏差的趋势增大了(正数),就要增大调节量让当前值更快的接近目标值从而抑制偏差增大。如果偏差的趋势减小了(负数),就要减小调节量让当前值更快的接近目标值从而抑制偏差增大;2....
2019-11-26 20:33:33
3600
1
原创 ** Connection error (usb://usb): gdi-error [40201]: can't access configuration database
解决办法:1.在这个目录下,C:\Program Files (x86)\STMicroelectronics\st_toolset\stvd\dao , 双击先卸载:2. 然后还是回到这个目录,双击, 选择安装。 这样就ok了。...
2019-11-21 16:56:08
2975
6
原创 s3c2440A两种启动方式理解nor flash/nand flash
我们知道S3C2440A支持两种启动方式,nor flash 启动和 NAND FLASH启动,由OM[1:0]引脚决定。不管是哪种方式启动,最终都是把u-boot代码复制到SDRAM中,然后执行相关功能:烧录固件或者引导内核等。1.如果是nor flash启动,那么我们就会事先把u-boot的代码烧录在nor flash中,开发板直接从nor flash执行代码(u-boot的第一阶段代...
2019-11-13 14:54:45
628
原创 u-boot 之 环境变量的理解
/*一、U-Boot 环境变量 的概念 U-Boot通过环境变量(env)为用户提供一定程度的可配置性,这些环境变量包括: bootdelay 执行自动启动的等候秒数 baudrate 串口控制台的波特率 netmask 以太网接口的掩码 ethaddr 以太网卡的网卡物理地址 boot...
2019-11-06 09:32:01
1388
原创 u-boot 之 run_comman()函数的理解
/*** 在u-boot-1.1.6中添加自定义命令的步骤:** 1.增加一个u-boot命令文件,可以在common目录下复制一个文件名是cmd_***的文件,重命名为cmd_mynew.c;** 2.把文件放置目录dir: common/cmd_mynew.c;** 3.文件内大体包括这些内容: 3.1包含需要的头文件:common.h, command.h, mynew...
2019-11-06 09:23:33
527
原创 对u-boot 之 main_loop()函数的理解
/*** 对u-boot-1.1.6中 main_loop()函数的理解。** main_loop function in diractory: /common/main.c。** u-boot启动内核过程:start.S -> start_armboot() -> main_loop() -> run_command() -> do_bootm_linux() -&...
2019-11-06 09:13:00
432
原创 u-boot 之start_armboot()函数的理解
/*** 对u-boot-1.1.6中 start_armboot()函数的理解。** 第一阶段全部用汇编语言实现。进入函数start_armboot表示进入u-boot的第二阶段,这个阶段全部用c语言实现。** 所以在进入第二阶段前,一定要把堆栈设置好。** 调用过程:start.S -> start_armboot() -> ......*//*** 注解:定义一个...
2019-11-06 09:05:24
345
原创 关于u-boot 之 lowlevel_init.S 的理解
/*** 版本:u-boot-1.1.6**路径:board/smdk2410/lowlevel_init.S** lowlevel_init.S中主要定义了函数lowlevel_init,被start.S文件中的函数cpu_init_crit调用。** 属于u-boot第一阶段的第二部分,主要是对存储控制器进行初始化,从bank0 - bank7.*/#include <...
2019-11-05 16:51:37
396
原创 关于u-boot 之 start.S理解
/*** 版本:u-boot-1.1.6** 路径:cpu/arm920t/start.S*/#include <config.h>#include <version.h>/**************************************************************************** Jump vect...
2019-11-05 16:39:15
243
原创 直流电机(BLDC)转速和频率的计算关系
在做BLDC电机转速PID控制的时候,需要检测BLDC反馈回来的实际转速,跟目标转速进行比较,通过PID算法,修改驱动PWM脉冲的占空比,实现速度闭环控制。转速到频率的计算我们假设转速用n表示,单位RPM。 RPM就是每分钟旋转了多少圈。 再假设电机的极对数用P表示,如果电机旋转一圈产生12个脉冲,那么P = 12. 那么电机一分钟旋转了n圈,产生了 n * P 个脉冲, 那...
2019-10-29 11:04:58
29691
原创 函数指针数组的简单定义方法
在u-boot中会使用到函数指针数组,用VC6实现了一下,虽然简单,这里还是记录下。/************************************** main.h 的内容*************************/#ifndef __MAIN_H#define __MAIN_Htypedef int (*func_handle)(int para1,...
2019-10-18 20:49:51
689
原创 segment .text size overflow(xxx)
使用STM8S的时候可能会报这个错误,这是flash溢出了,.text对应的区域就是存放代码的。后面的(xxx)表示的就是溢出的空间大小,单位是byte。很多人第一步想到的可能就是优化编译代码来压缩代码空间从而避免报错。作为专业的嵌入式工程师,最好不要随便使用编译器的优化代码功能,在某些极端的情况下会出现莫名其妙的问题。 其实,出现这个情况,有三种情况:第一种情况:STVD里面配置的...
2019-05-15 19:22:14
2465
原创 socket网络编程服务端程序支持多客户端(重叠I/O方式)
1.采用重叠I/O方式实现的socket网络编程,异步非阻塞方式,代码效率比阻塞式的socket编程方式高。2.实现了TCP server方式,只用于服务端,可以支持多客户端。3.可以使用在各种场合用于监控网络数据。4.代码封装成库形式,非常方便移植。5.本程序使用到了多线程技术,互斥同步线程技术,同时支持多通道连接技术,非常经典,程序注释完整,思路清晰。6.平台使用的是VC6.0,语言用的是...
2019-05-07 13:07:53
3348
原创 socket网络通信(重叠I/O方式实现)包含4种方式
采用重叠I/O方式实现的socket网络编程,异步非阻塞方式,代码效率比阻塞式的socket编程方式高。实现了TCP server,TCP client,UDP server,UDP client,四种方式可选,可以使用在各种场合用于监控网络数据。本程序只支持单客户端和服务端的应用场合。代码封装成库形式,非常方便移植。平台使用的是VC6.0,语言用的是C++,MFC做的界面。使用ws2_32....
2019-05-07 11:21:54
753
原创 用C++在MFC中实现的socket编程,四种方式任意选择
采用C++和socket实现的网络通信上位机,具体用的是socket阻塞和多线程方式实现。可以监控基于网络通信的设备通信,四种通信方式可任意选择,包括:TCP 服务端,TCP客户端,UDP服务端,UDP客户端;通信部分代码封装成了库,可以方便移植。 首先把各种模式封装到一个库,在库中实现各种通讯模式。 可以通过复选框任意切换想要的模式,切换前需要结束当前的模式的socket连接。连接和接收放...
2019-04-29 12:43:45
1769
原创 关于MFC窗口句柄,窗口ID,窗口指针
一、关于窗口句柄 首先讲一下MFC中句柄的概念,句柄是一种资源标识,他是一个整数,由操作系统分配,用户(程序员)没法指定。举个例子来说,当你创建了一个对话框,那么系统就会为这个对话框分配一定的资源,并且为这个资源分配一个整数来标识这块资源,那么这个整数就是句柄。 什么是资源,资源当然就是内存,堆栈。对话框的所有资源封装在一个类中,形成自己的数据结构,这个数据结构占用系统的一块内存。 其...
2019-04-19 10:10:06
4052
原创 VS2015修改工程名方法
自己写的一个项目,由于稍微修改就可以做成另外一个项目,所以修改原工程名为新工程名。 下面具体方法如下:一、复制原工程到一个目录,把原工程文件夹名OldProjectName改成新工程文件夹名NewProjectName;二、用VS打开原项目名为OldProjectName.vcxproj 工程文件, 然后修改解决方案名称和项目名称,方法是在“解决方案资源管理器”里面的 “解决方案Old...
2019-04-09 17:02:52
5453
3
原创 MFC修改图标简单方法(包括exe图标,任务栏图标,应用程序运行左上角图标)
先说原理,在MFC中,应用程序的图标调用默认的图标,默认图标的资源ID为IDR_MAINFRAME,与资源ID对应的图标路径为:...\\工程名字\\res\\ 工程名字.ico,然后在构造函数中装载这个资源,就显示这个默认图标了。 1.现在我们需要修改这个默认的图标资源,只需要把我们的想要的图标资源放在工程文件目录...\\工程名字\\res\ \中, 然后把这个图标的名称修改为:工程名...
2019-04-03 16:24:23
5257
socket网络编程服务端程序支持多客户端
2019-05-07
socket网络通信(重叠I/O方式实现)包含4种方式
2019-05-07
c++和socket实现的网络通信监控软件包含四种方式(TCP服务器,TCP客户端,UDP服务器,UDP客户端)
2019-04-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人