
移植一些算法到STM32上,算法在PC上能够运行,而移植到STM32的时候就会出现问题, 总结来说主要是因为编译器的版本不同,MDK5的编译器是很古老的编译器,有些C语法会有问题。 ![]() 常见的问题就是: 1.结构体赋值的时候,在32里面的代码,结构体赋值必须要一个变量一个变量的赋值,不能够直接赋值。 2.定义变量的时候不能用的时候才定义变量,需要将变量放在这个模块的前面 将算法移植到STM32的时候,首先要考虑的就是STM32的内存大小是否足够大,如果不够大,一般就是报有.ANY的一些错误。(所以建议一开始移植算法的时候使用比较好的硬件条件来移植,不然后面出了问题可能都不知道到底在哪里出错了) 如果定义的数组太大,超出了STM32堆栈的大小,那么STM32就会进入Hardfault。(因为进入Hardfault会有延时一行代码,所以建议查看Hardfault的时候建议使用上一盘中JTAG调试窗口中查看中断的窗口,能够更明白的清除Hardfault在哪里产生的) ![]() 调试算法一定要善用汇编语言,用汇编语言看C语言的本质. ![]() 移植算法的时候也经常需要使用动态内存分配,STM32自带的SRAM又很小,很难满足算法需要的SRAM要求,所以需要在32中外扩SRAM芯片。既然需要动态内存分配,自然也就需要内存管理了。在STM32中c语言标准动态内存分配的关键字malloc也就没这么好用了,最好就是要使用正点原子的内存管理使用,用它提供的分配函数来进行内存的分配与管理。 好了,说了这么多,终于说到了标题的内存了,在调试内存管理的时候,为了防止有申请的内存溢出堆栈的大小,因此在申请的时候最好每一步都调用一次的内存使用率函数查看一下现在内存占用率。防止堆栈溢出。而且在运行的时候,最好能够清楚的了解到这个分配程序是在哪一个文件的哪一行,这样能够方便我们的调试。 这个函数的演示效果: ![]() 分享一下H7将内存使用率和获取到这个函数在哪一行上传到串口的函数。(即实现上面效果的函数) .c文件中的上传代码:
在.h中需要添加的一个宏定义。
获取到文件名和行数不单单只可以在内存管理函数中使用,也可以看你个人的需求移植到其他的地方。 |
拷打cubemx【003】——找不到的芯片包
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享4-使用MVP架构从硬件外设读取数据并显示到图形界面、从图形界面发送指令控制硬件外设
【2025·STM32峰会】GUI解决方案实训分享3-搭建空白TouchGFX例程并实现简单的功能(含硬件部分的串口打印)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
【2025·STM32峰会】+TouchGFX实现动态进度显示以及界面切换
【2025·STM32峰会】+使用TouchGFX快速创建GUI
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
实战经验 | 关于STM32H7使用LL库生成ADC代码工作异常问题说明
实战经验 | 关于STM32H745的MC SDK电机控制工程问题的解决办法