如何使用STM32F4中的CCM内存

发布时间:2024-02-03  

我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?

如何使用STM32F4中的CCM内存

首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。

如何使用STM32F4中的CCM内存

我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。

如何使用STM32F4中的CCM内存

这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。

于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:

int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};

复制代码

再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:

Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)

Base AddrSizeTypeAttrIdxE Section NameObject

0x100000000x00000028DataRW7.ARM.__AT_0x10000000main.o

复制代码

太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。

那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:

#if( configAPPLICATION_ALLOCATED_HEAP == 1 )

extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

#else

static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

#endif

复制代码

这是FreeRTOS中堆内存的分配,我们可以加入__attribute__将其放进CCM中,这样做没有问题,但是去修改FreeRTOS的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。

修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。

如何使用STM32F4中的CCM内存

然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:

如何使用STM32F4中的CCM内存

由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:

如何使用STM32F4中的CCM内存

然后在链接器中选择我们自己的文件:

如何使用STM32F4中的CCM内存

现在,映像文件变成了这样:

如何使用STM32F4中的CCM内存

是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    了正确的库文件。 确认是否存在多线程访问 AES-GCM 的函数会在几个线程中调用,而且确认不会出现同时调用的情况,不存在 raise condition 的问题。 查看内存使用情况 最初怀疑是否因为任务栈溢出造成,于是查看内存使用情况......
    了正确的库文件。 确认是否存在多线程访问 AES-GCM 的函数会在几个线程中调用,而且确认不会出现同时调用的情况,不存在 raise condition 的问题。 查看内存使用情况 最初......
    ——Call Stack Window弹出Call Stack + Locals对话框。 然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。 ......
    Window弹出Call Stack + Locals对话框。 然后在对话框中右键选择Show Caller Code,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。 ......
    软件查看内存和SPD信息,兼容性是没有问题的。 采用TechPowerUP MemTest64软件测试,测试了6次,没拍照片,故障检测没有任何问题。 看综合评分情况,双通......
    单片机的内存分配详解;对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM、RAM启动,首先 需要对 链接......
    技术,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS这个页面文件。 二、虚拟内存不足怎么办 虚拟内存不足是指在使用计算机时出现了内存不足的情况......
    :热插拔模式 连接目标芯片,不复位/重置芯片,则此时可以查看芯片状态。 2.查看内核运行状态 硬件连接好:Target -> MCU Core 为什么讲这一条内容呢? 相信大家都遇到或听到过程序跑飞这种情况......
    高为非 MCU 平台编写的现有代码的可重复使用性。 以性能作为核心的全新基准测试功能 QulPerf QML 类型扩展了一组新的指标,以方便地显示和访问正在运行的应用程序的帧率情况、CPU 使用率、内存使用情况......
    效率的位操作或原子位操作。     8051设备提供各种物理内存空间:快速的DATA空间,16MB大XDATA空间,和CODE空间。对于CX51提供灵活的内存使用情况: 三个定义的内存模式,提供变量的默认内存分配 通用指针访问所有的内存......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>