首先,malloc( )属于标准C语言函数,当然可以在单片机上使用,如STM32可以先在启动文件中设置heap的大小,再使用动态内存分配:
Heap_Size EQU 0x00000200 \也就是 512字节;
但是一般单片机的内存都比较小,而且没有MMU,malloc 与free的使用容易造成内存碎片。而且可能因为空间不足而分配失败,从而导致系统崩溃,因此应该慎用,或者自己实现内存管理。
以下摘自网络:
在函数中使用malloc,如果是大的内存分配,
而且malloc与free的次数也不是特别频繁,使用malloc与free是比较合适的,
但是如果内存分配比较小,而且次数特别频繁,那么使用malloc与free就有些不太合适了。
因为过多的malloc与free容易造成内存碎片,致使可使用的堆内存变小。
尤其是在对单片机等没有MMU的芯片编程时,慎用malloc与free。
如果需要对内存的频繁操作,可以自己实现一个内存管理。
使用动态内存分配,应分不同的应用场合。
对于在操作系统上运行的程序,实际的物理内存分配与释放使用操作系统来实现的,即使程序调用了 malloc和free物理内存并不会马上变化。物理内存的变化,直到系统的内存管理操作时才发生。
对于裸机跑在MCU上的程序,分配与释放内存都会造成实际物理内存的变化。因为此时物理内存的分配是由自己实现的,而内存管理我们自己并没有去做。这样,盲目的使用malloc与free恰恰并不好,反而会造成内存的不恰当使用。甚至于内存溢出。
所以,动态内存的使用前提是有一套好的内存管理方法,这样动态内存的使用才会合理使用内存。如果没有合适的内存管理代码,还是用静态内存好一些。
关键字:STM32 malloc 动态内存
引用地址:
关于STM32能否使用malloc申请动态内存的问题
推荐阅读最新更新时间:2024-11-12 04:09
STM32无法使用IAR下载程序问题
一开始建立了工程,然后程序下载都很正常。不知道什么情况自己下载代码之后,再重新下载代码无法成功。 我按照提示找了一下FlashStm32f30x8.flash这个文件,却发现IAR的目录下没并没有。又怀疑是IAR文件丢失。 重新安装IAR,却发现问题仍然继续. ~~~~感觉像是芯片坏了~~~ 于是通过STVP工具,读取一下。 奇迹发生了,竟然可以读取程序。 嗯~~那可以排除芯片的问题。 好吧,那我重新用IAR下载应该可以吧。 于是重新下载程序, 晕~~~居然还是弹出那个错误。 难道自己的程序竟然会引起这样的错误??? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 于是通过STVP将
[单片机]
【stm32】ADC的规则通道和注入通道混合使用
之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的;可能有时候会需要立刻采样,那样我们就需要利用到注入通道了。文档关于注入通道的解释: 1、利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。 2、如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。 3、然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。 将变阻器的那路ADC设置为注入通道: 1 ADC_InjectedSeq
[单片机]
STM32 USB 从机HID分析
概述 将STM32的USB初始化为USB从机,使用标准HID协议。控制板自带VBUS供电,因此不需要VBUS、GND引脚。 只要连接2根数据线到电脑即可。 源码分析 当使用USB线连接电脑端后,收到电脑端的USB复位包 USBD_OTG_ISR_Handler -- DCD_HandleSof_ISR -- /* Clear interrupt */ OTG_HS_GINTSTS- SOF:在设备模式下,模块将该位置 1 时,指示 USB 上已接收到一个 SOF 令牌。应用程序可通过读取设备状态寄存器来获得当前的帧编号。只有在模块以 FS 模式运行时,才会出现此中断。 GINTS
[单片机]
再造STM32---第五部分:使用寄存器点亮 LED 灯
学习本章时,配合《STM32F4xx 中文参考手册》 “通用 I/O(GPIO)” 章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。 关于建立工程时使用 KEIL5 的基本操作,请参考前面的章节。 5.1 GPIO 简介: GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚, STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO 被分成很多组,每组有 16 个引脚,如型号为 STM32F4IGT6 型号的芯片有 GPIOA、 GPIOB、 GPIOC 至 GPIOI 共 9 组 GPIO,芯片一共 176
[单片机]
关于stm32 usb虚拟串口 程序问题的讨论
主要问题是 串口有时收到乱码 有时收到丢包数据: 关于 乱码 我们其实很容易想到 奇偶校验的问题,而我们平常都是默认为没有奇偶校验。 请看程序: * USART1 default configuration */ /* USART1 configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit - Parity Odd - Hardware flow control desabled - Receive and transmit enabled - U
[单片机]
stm32专题二十一:FSMC模拟8080时序
ILI9341的8080通讯接口时序可以由STM32使用普通 I/O 接口进行模拟,但这样效率太低,STM32 提供了一种特别的控制方法,使用FSMC接口实现8080时序。 由于 FSMC 外设可以用于控制扩展的外部存储器,而 MCU 对液晶屏的操作实际上就是把显示数据写入到显存中,与控制SRAM 存储器非常类似,且 8080 接口的通讯时序完全可以使用 FSMC 外设产生,因而非常适合使用 FSMC控制液晶屏。 FSMC结构框图: LCD — 液晶显示: NADV引脚是专门拥堵地址 / 数据线复用时做锁存信号,如下。当我们不需要地址 / 数据线复用时,NADV就不用管。 NADV由以下寄存器位来配置:
[单片机]
STM32 CubeMX输入捕获测量PWM波形频率与占空比
使用的开发板是官方的STM32F412ZGTx NUCLEO开发板。本次主要是为了对PWM波形进行脉宽和频率的测量。很多的工程使用的是软件对同一个通道进行3次捕获,比较耗费系统资源,本次介绍使用硬件进行捕获,尽可能降低代码的工作量。 首先打开CubeMX,做如下设置: 1.先设置定时器10,用于输出PWM波形。 2.设置TIM2,用来进行输入捕获 至于为什么这么设置,我们放在最后面说明,此处使用一路信号进行两次捕获,可以降低软件的工作量。 3.其他的串口设置,这里不做说明。时钟树设置如下: 4.对定时器10进行如下设置: TIM10使用的频率为100M,这里分频为20M,按照图中设置的周期,输出的P
[单片机]
STM32入门-时钟篇
STM32中使用任何一个外设都必须打开相应的时钟。在STM32中有5个时钟源可供用户选择: 1.HSI高速内部时钟,RC震荡器,频率为8MHz。 2.HSE高速外部时钟,右英/陶瓷谐振器,或着外部时钟源,4MHz-16MHz. 3.LSI内部低速时钟,RC震荡器频率为40Hz。 4.LSE外部低速时钟,接频率为32.768KHz的石英晶体。 5.PLL锁相环频输出,时钟源可选为HIS/2、HSE或HSE/2。倍频可选2-16倍,但其输出频率最大不能超过72MHz。 系统时钟SYSCLK,它是供STM32中绝大部分器件工作的时钟源,系统时钟可选择为PLL输出、HSI或者HSE。系统时钟的做大频率为72MHz,它通过AHB分频器分频后
[单片机]