Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
BSP
CACHE
针对STM32F7系列平台的MPU,Cache特性,需要注意哪些问题?
发布于 2017-05-08 11:59:58 浏览:5585
订阅该版
由于工作的需要,需要在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.6k
关于作者
softwind
这家伙很懒,什么也没写!
提问
38
回答
150
被采纳
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
N32L40XCL-STB 开发板模块评测任务大挑战
2
参加thread训练营有感
3
RT-Thread with VS Code之MacOS篇
4
RT-Thread开发GD32F450 添加串口外设,以及一种串口接收数据处理的方法
5
RT-Thread Studio软件正常下载,终端串口不显示问题
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
FinSH
Bootloader
CAN总线
ART-Pi
Hardfault
文件系统
USB
DMA
RT-Thread
线程
SCons
RT-Thread Nano
stm32
MQTT
ESP8266
ota
UART
RTC
rtthread
rt-smart
packages_软件包
freemodbus
I2C
WIZnet_W5500
flash
cubemx
FAL
定时器
BSP
AB32VG1
PWM
ADC
SDIO
msh
socket
keil
Debug
C++_cpp
LVGL
中断
编译报错
SFUD
SMP
MicroPython
本月问答贡献
宇宙码蚁
46
个答案
7
次被采纳
xiaorui
27
个答案
4
次被采纳
lchnu
15
个答案
4
次被采纳
Ryan_CW
6
个答案
4
次被采纳
张世争
6
个答案
3
次被采纳
本月文章贡献
张世争
6
篇文章
14
次点赞
YZRD
6
篇文章
10
次点赞
快乐小鸟
4
篇文章
4
次点赞
RTT_逍遥
3
篇文章
24
次点赞
recan
3
篇文章
19
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部