- 博客(96)
- 资源 (6)
- 收藏
- 关注
原创 记录一次问题的解决流程
最后发现UFSR=2,说明是usageFault的INVSTATE错误导致的,但是迫于能耐即便有了这些信息也还是难分析出是哪行代码出了问题,我就想如果能知道出错前执行的代码那是最好最直接的了,因此结合以前的知识和查阅资料,发现在异常发生时,硬件会自动将R0-R3,R12,LR,PC等的值推入栈里面,其中LR的值就是异常的返回地址,应该就是我要找的出错前执行的代码,因此如果能够在出错时打印出LR的值岂不就能够定位到出错前执行的代码了;3.每次都是进入的usageFault,说明是用法错误导致的。
2024-09-20 10:57:34
1094
原创 GD32相较于STM32的优劣势-完全总结
GD32单片机的主频可以达到108MHz,而STM32的最大主频为72MHz,这意味着GD32在代码执行速度上具有优势,适合需要快速处理数据的场景。
2024-07-23 19:03:31
1341
1
原创 Free-RTOS高阶使用手册
FreeRTOS 是市场领先的面向微控制器和小型微处理器的实时操作系统 (RTOS),与世界领先的芯片公司合作开发,现在每 170 秒下载一次。FreeRTOS 通过 MIT 开源许可免费分发,包括一个内核和一组不断丰富的 IoT 库,适用于所有行业领域。FreeRTOS 的构建突出可靠性和易用性。
2024-05-15 17:31:25
293
原创 记录一个GD32E230的ADC+DMA的重大问题
经过各种研究都没发现问题:正常和不正常情况下ADC和DMA的寄存器值都是一样的,内存也没有越界访问;确认flash读写函数无问题;而且最离谱的是,有的时候开机是正常的,有的时候是异常的,也就说是同一个程序有的时候启动正常,有的时候异常;虽然最后发现了问题,但是也没发现问题,因为还是没搞懂为啥会跟flash读写有关,更没有搞懂为啥同一个程序有时启动就没问题有时就有问题!,即7个通道的数据位置错了,原本1通道的数据到了5通道,5通道的到了3通道!把这一句注释掉了就再也不会出问题了~
2024-04-26 11:37:46
798
4
原创 C/C++提高代码稳定性/健壮性的一些小细节
对于C/C++编程本来就是要摸透两大块,一个是编译器,另一个是相应处理器的内核和外设的知识和特性,这其中编译器是比较容易被忽视的
2024-03-29 10:07:58
706
原创 git使用记录
将第一个提交记录的动作保持为 "pick" 或 "p"。1.使用 "git reset --hard 版本号"的方式回退版本号会覆盖从当前版本到回退版本之间的版本号,为避免这种情况,可以用"git revert -n 版本号"指令,具体看:https://blog.youkuaiyun.com/L1147484597/article/details/128480953。12.git合并两次提交:git rebase -i HEAD~2,HEAD~2表示要合并的提交数量,2表示合并最近两个,要合并最近三个则改为3;
2024-02-20 09:48:24
1165
原创 C/C++与汇编交互总结
并且在C中调用汇编函数时可以传入参数,需要传入哪些参数和参数类型只要在extern时声明下就可;也可以有返回值,存在R0或R0-R1中,但是。如果该C函数有传递参数的,则在调用前把参数赋值到R0-R4即可;若有返回值的,则调用后从R0或者R0-R1(返回值为64位)读取即可;2.汇编当中可以引用C全局变量,也是"IMPORT"一下即可,如上例;引用进来的是该变量的地址,不是变量的值。当有返回值时,汇编函数中在退出前需要将返回值赋值给R0或R0-R1。4.C当中也可以使用汇编的标号,用法还是先。
2024-02-18 18:39:19
817
原创 ARM/CM3/CM4:读写内核寄存器和内核特殊寄存器
可以发现每一个函数都用到了“ldr r0,=core_res_c”这句话,这句话可以非常神奇的将core_res_c全局变量的地址传递给内核寄存器,就相当于建立了一个C和汇编直接数据传输的通道,我们就可以借助这个通道对内核寄存器进行读写了,当然这个通道的存在是借助于编译器的,所以文章第一句话就声明了和编译器的瓜葛。注:以下代码涉及内联汇编,所以跟C编译器有关,有些编译器可能会不支持(每种编译器内联汇编的形式都不一样),本代码在MDK的“defaul compiler version 6”编译器里测试通过。
2024-01-29 15:07:52
767
原创 记录:获取栈顶地址
此时就要结合任务栈的栈底地址和栈大小来判断任务栈有没有溢出了;当然对于很多嵌入式操作系统来说都会提供一个获取任务最高水位线的函数,如对于freertos是:uxTaskGetStackHighWaterMark()。有了栈顶地址再加上栈底地址(__initial_sp)和栈的大小就可以判断出当前栈有没有溢出了。
2024-01-04 10:30:10
835
原创 链接文件/分散加载文件的作用
上诉代码中UNINIT就是表示该段不需要初始化的意思,在这里面存的数据就不用担心程序异常复位后数据丢失的问题了;只要不是上电复位里面存的数据都会在(上电复位是因为断电了,RAM断电的话数据是必然丢失的)6.新增一个flash或者RAM段(如外挂FLASH或RAM的情况),并指定将某些数据存在该段里面。上面三行代码分别指定了gd32f30x.o文件的堆、RW、ZI、RO的存储位置。那个+First是指首先存储,即存储在开头位置。7.目前知道的就这么多,后续发现更多作用再增加。
2023-12-22 17:28:05
479
原创 MDK(Keil)的MAP文件都记录了啥
MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。
2023-10-08 10:05:53
302
原创 记录一个Cortex-M23的一个重要问题
对于Cortex-M23,它要求按照字访问的内存,其访问地址必须是字(4字节)对齐的,否则就进入Hard_fault
2023-09-22 16:36:01
643
原创 git使用记录
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 [1]也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
2023-08-02 18:37:28
149
原创 C/C++:将数值作为函数执行、assert、结构体位域
位域:是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
2023-07-27 18:36:34
760
1
原创 关于SVC和PendSV
实时操作系统(Real Time Operating System,简称RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。
2023-07-21 14:10:11
1018
原创 指针、常量指针、指针常量以及const、volatile修饰符
指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
2023-07-19 18:10:31
962
原创 今日C/C++二维数组理解简记
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。
2023-07-18 18:27:17
148
原创 VSCode常用快捷键设置
vscode是一种简化且高效的代码编辑器,同时支持诸如调试,任务执行和版本管理之类的开发操作。它的目标是提供一种快速的编码编译调试工具。然后将其余部分留给IDE。vscode集成了所有一款现代编辑器所应该具备的特性,包括语法高亮、可定制的热键绑定、括号匹配、以及代码片段收集等。要快速高效的使用此软件,就得把常用快捷键设置成自己顺手的
2023-07-10 16:46:30
230
原创 面向过程和面向对象编程详解
面向对象是把跟要处理的事情相关的所有事物封装成一个对象,每个对象内有各种属性、行为(函数)和变量,然后用这些对象的属性、行为、变量去完成事情;所有高级语言都是面向对象的或者说能够面向对象编程的,然后几乎所有高级语言都是在C的基础上发展起来的,所以说面向对象编程是正确的编程语言发展方向,是大势所趋,因为面向过程更符合机器的思维(机器就是想让你告诉他一步一步该怎么做),而面向过程更符合人类的思维,而编程语言的发展肯定是要让人类更加方便快速的编程,所以发展面向对象编程是理所应当的。
2023-03-10 17:23:21
245
原创 实测STM32 DMA的数据传输速率不如CPU
用CPU和DMA同样搬运32KB的数据(内存到内存),对比搬运耗时。实测下来DMA搬运数据并没有CPU快,使用DMA只是省CPU并不省时间
2022-12-29 09:43:18
4559
6
原创 GCC编译输出中text,data,bss和dec的含义
bss是不会算入最终生成的bin文件里面的,因为对于未初始化的变量,只需要在内存中开辟个相应大小的空间就行了。2.data:已初始化的全局/静态变量,相当于MDK的rw_data。3.bss:未初始化的全局/静态变量,相当于MDK的ZI_DATA。1.text:代码和常量,相当于MDK的code+ro_data。4.dec:上述3者的算术和。
2022-09-08 22:37:49
3159
原创 visual c++:error LNK2019: 无法解析的外部符号 __imp....
visual studio;c++;error LNK2019
2022-05-30 15:34:19
1089
原创 Windows环境变量是啥
环境变量代表的就是一个文件夹路径,即用一个变量代表一个路径,类似C/C++的宏定义。 环境变量有两种:系统环境变量(简称系统变量)和用户环境变量(简称环境变量),顾名思义,系统环境变量不区分用户,作用于所有用户;用户环境变量只作用于当前用户。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序...
2022-04-21 14:53:56
2772
转载 内联函数简介与作用
简介 在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要特别注意的是对递归函数的内联扩展可能引起部分编译器的无穷编译。设计内联函数的动机 ...
2022-03-08 15:59:43
595
原创 Linux系统主要目录的功用
/var 某些大文件的溢出区,比方说各种服务的日志文件 /lost+found 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里 /proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息 /mnt 系统提供这个目录是让用户临时挂载其他的文件系统 /root 系统管理员的主目录(呵呵,特权阶级) /tmp 公用的临时文件存储点 /sbin 系统管理命令,这里存放的是系统管理员
2022-01-10 14:55:24
99
原创 文件系统类型总结/简介
ext2 早期linux中常用的文件系统 ext3 ext2的升级版,带日志功能 RAMFS 内存文件系统,速度很快 NFS 网络文件系统,由SUN发明,主要用于远程文件共享 MS-DOS MS-DOS文件系统 VFAT Windows 95/98 操作系统采用的文件系统 FAT Windows XP 操作系统采用的文件系统 NTFS Windows NT/XP 操作系统采用的文件系统 HPFS OS/2 操作系统采用的文
2022-01-10 14:23:49
317
原创 关于C/C++宏定义/预编译
1.宏定义在函数内部和外部是一样的(都视为在外部),所以一般不把宏定义放在函数内部以免造成误导;如果一个函数里面只有宏定义 那么该函数相当于不存在。2.在一个文件或者多个文件中重复定义一个标志编译不会报错,有的编译器会出警告。3.预编译时对宏定义的处理就是简单的替换,如果说涉及标志重定义的,那么替换时就以最新宏定义为准,关于这点下面作详细说明:假设现在有a.c,a.h,b.c,b.h四个文件:1.先在a.h中定义testdef为20,再在b.h中定义testdef为30,然后在a.c中先包含
2022-01-07 18:14:07
1558
原创 关于音频EQ、DRC、等响度、3D环绕音、虚拟低音、变音、AEC、AGC、ANS等解释
1.EQ:EQ是均衡器的缩写。它的基本作用是通过对声音某一个或多个频段进行增益或衰减,达到调整音色的目的。当然,EQ还有一个显著的功能,降噪。EQ通常包括如下参数:F(requency),频率――这是用于设定你要进行调整的频率点用的参数;G(ain),增益――用于调整在你设定好的F值上进行增益或衰减的参数;Q(uantize)――用于设定你要进行增益或衰减的频段 “宽度”。2.DRC(动态压缩)当输出的音频信号不是很大的时候,系统会按照原来的设定输出,但是当输出的音频信号过大的时候,为了保护喇叭
2021-12-30 15:06:20
15675
转载 关于C与C++区别的摘录
1.博主:恒虚之境作者:恒虚之境链接:https://www.zhihu.com/question/28834538/answer/477487776来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。大家都知道,上古时代,猿猴用机器代码写程序,而且好像还是01二进制编码的表现方式。这些01代码精确表达了计算机CPU所要做的每一个动作(每一条指令)从内存的某个地址中读数到寄存器中,寄存器中又再做那些事情,动作完了之后,又将运算结果送回内存,程序计数器跳转到那个位置.
2021-12-23 18:11:12
167
keil/MDK 5.4.2版本,当前最新的版本,在官网下载需要提交信息以及下载很慢,所以分享出来
2025-03-25
c166v757.exe
2020-09-10
c251v560.exe
2020-09-10
MDK531.EXE
2020-07-31
KEA128+FreeRTOS.zip
2020-06-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人