Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
BSP
CACHE
针对STM32F7系列平台的MPU,Cache特性,需要注意哪些问题?
发布于 2017-05-08 11:59:58 浏览:5880
订阅该版
由于工作的需要,需要在STM32F7平台上进行开发。看了一下,RT-Thread的BSP下已经包含了STM32F7平台的移植,准备基于这个BSP进行后续的工作。感谢提供F7平台移植的大侠! 大致了解了一下STM32F7,除了外设和底层库的变化之外,最主要的是MPU和Cache特性的引入。之前还是单片机的开发思路,没有深入的了解过微处理器中MPU,Cache的特性;看了一些文档,越看越没底的感觉。想请教一下大家,在F7平台上使用RT-Thread的话,对于MPU和Cache的使用需要注意些什么? 因为了解不深,不知道该提哪些具体的问题,可能问题比较笼统,先问几个比较困惑、没有把握的问题: 1)用作RT-Thread的系统Heap的Memory,属性应该怎么设置?不设置Cacheable? 所有动态创建的线程,实际上都是分配在系统的Heap上的,包括任务堆栈。如果设置成Cacheable的话,因为任务切换的位置事先是不知道的,怎么保证数据一致性的问题? 2)如果线程中有针对Memory的操作,比如说rt_memcpy之类的,如果操作的是Cacheable的Memory的话,如果发生任务切换,怎样保证一致性问题? 以上两点从根本上来说应该是一个问题,就是任务切换时数据一致性的问题? 将系统的Heap设置成Non-Cacheable是不是就可以了? 3)我看RT-Thread的发布说明里,也提到了F7平台上的Cache特性,主要强调了使能Cache时,DMA操作的数据一致性问题。这个是否如一些应用笔记说的,在DMA操作的前后加入针对Cache的Clear,Invalidate之类的相关操作就可以解决? 4)很多文档提出了很多应用场景,也有一些指导性的原则。但针对使用了OS的系统来说,有没有相关的原则,比如说系统的Heap应该设置成什么属性?静态内存应该设置成什么属性?中断服务程序对于内存的操作有什么新的约束或限制? 5)F7是有D-Cache,I-Cache。OS层面和应用层面,要考虑I-Cache吗? 啰嗦了一堆,感觉完全不知道在说什么。就当是抛砖引玉,希望得到大家的指导。 
查看更多
17
个回答
默认排序
按发布时间排序
softwind
2017-05-08
这家伙很懒,什么也没写!
还有就是F7的BSP中,关于MPU的部分, [code] /* Configure the MPU attributes as WB for SDRAM */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.BaseAddress = 0xC0000000; MPU_InitStruct.Size = MPU_REGION_SIZE_8MB; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER1; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.SubRegionDisable = 0x00; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Configure the MPU attributes as none-cache for 1MB SDRAM */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.BaseAddress = 0xC0100000; MPU_InitStruct.Size = MPU_REGION_SIZE_1MB; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER2; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.SubRegionDisable = 0x00; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct)[/code] 然后系统的Heap是这样定义的: [code]#ifdef RT_USING_EXT_SDRAM rt_system_heap_init((void*)EXT_SDRAM_BEGIN, (void*)EXT_SDRAM_END); sram_init(); #else rt_system_heap_init((void*)HEAP_BEGIN, (void*)HEAP_END); #endif[/code] 也就是说把整个的外部SDRAM作为System Heap;但SDRAM又定义了两个具有不同的MPU属性Region,而且是Overlapped的,这是出于什么样的考虑?
bernard
2017-05-08
这家伙很懒,什么也没写!
1. 尽量使用cache,这样才能加速代码执行效率;不管是静态还是heap,都全开cache; 2. cache一致性问题在于多硬件访问的情况,例如cpu访问(其他cpu访问),dma访问(通用dma、外设专用dma)。这个时候就要考虑一致性的问题,该flush就flush,或者invalid等等。 3. mpu,很早就有了,可以查看相关的arm芯片说明文档. 4. 注意下cache line大小的问题,这部分有的时候最好是做cache line对齐的
softwind
2017-05-08
这家伙很懒,什么也没写!
[quote]1. 尽量使用cache,这样才能加速代码执行效率;不管是静态还是heap,都全开cache; 2. cache一致性问题在于多硬件访问的情况,例如cpu访问(其他cpu访问),dma访问(通用dma、外设专用dma)。这个时候就要考虑一致性的问题,该flush就flush,或者invalid等等。 [/quote] 1)如果没有多硬件访问,全开cache的话,不会影响任务切换,也就是说任务堆栈的数据一致性与cache无关? 2)只在多硬件访问的时候,需要考虑数据一致性的问题? [quote] 3. mpu,很早就有了,可以查看相关的arm芯片说明文档. 4. 注意下cache line大小的问题,这部分有的时候最好是做cache line对齐的[/quote] 多谢bernard指点方向,我再看看相关文档。
softwind
2017-05-09
这家伙很懒,什么也没写!
另外,考虑到DMA访问时数据一致性的问题,F7平台上的一些底层的驱动也需要改写? 比如说SD卡,以太网这些用到了DMA传输的外设驱动。
bernard
2017-05-09
这家伙很懒,什么也没写!
[quote]另外,考虑到DMA访问时数据一致性的问题,F7平台上的一些底层的驱动也需要改写? 比如说SD卡,以太网这些用到了DMA传输的外设驱动。[/quote] of course
softwind
2017-05-09
这家伙很懒,什么也没写!
[quote][quote]另外,考虑到DMA访问时数据一致性的问题,F7平台上的一些底层的驱动也需要改写? 比如说SD卡,以太网这些用到了DMA传输的外设驱动。[/quote] of course[/quote] 看来还有很多工作要做。多谢指教。
softwind
2017-05-09
这家伙很懒,什么也没写!
[quote]1. 尽量使用cache,这样才能加速代码执行效率;不管是静态还是heap,都全开cache; 2. cache一致性问题在于多硬件访问的情况,例如cpu访问(其他cpu访问),dma访问(通用dma、外设专用dma)。这个时候就要考虑一致性的问题,该flush就flush,或者invalid等等。 [/quote] 1)全开cache的话,不会影响任务切换,也就是说任务堆栈的数据一致性与cache无关?
softwind
2017-05-09
这家伙很懒,什么也没写!
或者说在OS或RT-Thread内核的层面需要考虑Cache和数据一致性的问题吗?
bernard
2017-05-09
这家伙很懒,什么也没写!
按理说,OS层面应该要考虑cache line大小的。至于说cache与否与任务切换等的关系,那么这部分能加速尽量加速,特别是最好有TCM,能够让OS内核部分代码和CPU主频跑在一致频率上
softwind
2017-05-09
这家伙很懒,什么也没写!
[quote]按理说,OS层面应该要考虑cache line大小的。至于说cache与否与任务切换等的关系,那么这部分能加速尽量加速,特别是最好有TCM,能够让OS内核部分代码和CPU主频跑在一致频率上[/quote] 就是说主要是效率优化方面的问题。 那么当前rt-thread在F7平台上的实现(基于STM32F7 Disco平台的BSP),Cache全开的话,内核的安全性是不受影响的?主要是在设备驱动和应用层需要考虑多硬件访问的数据一致性问题?
撰写答案
登录
注册新账号
关注者
0
被浏览
5.9k
关于作者
softwind
这家伙很懒,什么也没写!
提问
40
回答
152
被采纳
0
关注TA
发私信
相关问题
1
STM32 407 串口接收数据 系统卡死
2
RTT nrf24l01 设备驱动程序
3
stm32f10x串口只能发送数据,无法接收
4
第一次尝试移植rt-thread 到stm32F103系列问题
5
有人把stm32L07xx的bsp移到rtt上来了吗?求一个
6
rt-thread线程调度异常在stm32f103芯片上
7
RTT是否支持STM32F429
8
请问谁有 STM32F40x HAL + RT-THREAD 模板
9
rt-thread在stm32f411下的移植问题
10
以后会把RT-thread移植到STM32的cube库上面么?我自己移植了一下STM32F373
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RyanMqtt 移植指南(三)
2
RyanMqtt QOS质量测试(二)
3
WCH APT 零等待FLASH的思考
4
RyanMqtt使用介绍和示例代码(一)
5
RTT平台 zephyr_polling软件包 Bluenrg2 蓝牙芯片启动流程
热门标签
RT-Thread Studio
串口
Env
LWIP
AT
SPI
Bootloader
FinSH
ART-Pi
CAN总线
Hardfault
USB
文件系统
DMA
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
stm32
ESP8266
rt-smart
WIZnet_W5500
RTC
flash
ota
UART
FAL
packages_软件包
I2C
freemodbus
cubemx
潘多拉开发板_Pandora
定时器
PWM
BSP
ADC
socket
AB32VG1
SDIO
keil_MDK
中断
消息队列_msg_queue
编译报错
Debug
C++_cpp
msh
QEMU
SFUD
MicroPython
本月问答贡献
出出啊
1463
个答案
324
次被采纳
小小李sunny
1379
个答案
274
次被采纳
张世争
700
个答案
155
次被采纳
crystal266
518
个答案
152
次被采纳
whj467467222
1215
个答案
146
次被采纳
本月文章贡献
出出啊
1
篇文章
11
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
4
篇文章
6
次点赞
crystal266
2
篇文章
5
次点赞
whj467467222
2
篇文章
4
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部