Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
BSP
CACHE
针对STM32F7系列平台的MPU,Cache特性,需要注意哪些问题?
发布于 2017-05-08 11:59:58 浏览:6702
订阅该版
由于工作的需要,需要在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吗? 啰嗦了一堆,感觉完全不知道在说什么。就当是抛砖引玉,希望得到大家的指导。 ![SDRAM属性.png](/uploads/779_8b372c0e4dbf126d38e1e8b5211855b5.png)
查看更多
17
个回答
默认排序
按发布时间排序
softwind
2017-05-08
这家伙很懒,什么也没写!
还有就是F7的BSP中,关于MPU的部分, ``` /* 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) ``` 然后系统的Heap是这样定义的: ``` #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 ``` 也就是说把整个的外部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
这家伙很懒,什么也没写!
>1. 尽量使用cache,这样才能加速代码执行效率;不管是静态还是heap,都全开cache; >2. cache一致性问题在于多硬件访问的情况,例如cpu访问(其他cpu访问),dma访问(通用dma、外设专用dma)。这个时候就要考虑一致性的问题,该flush就flush,或者invalid等等。 --- 1)如果没有多硬件访问,全开cache的话,不会影响任务切换,也就是说任务堆栈的数据一致性与cache无关? 2)只在多硬件访问的时候,需要考虑数据一致性的问题? >3. mpu,很早就有了,可以查看相关的arm芯片说明文档. >4. 注意下cache line大小的问题,这部分有的时候最好是做cache line对齐的 --- 多谢bernard指点方向,我再看看相关文档。
softwind
2017-05-09
这家伙很懒,什么也没写!
另外,考虑到DMA访问时数据一致性的问题,F7平台上的一些底层的驱动也需要改写? 比如说SD卡,以太网这些用到了DMA传输的外设驱动。
bernard
2017-05-09
这家伙很懒,什么也没写!
>另外,考虑到DMA访问时数据一致性的问题,F7平台上的一些底层的驱动也需要改写? >比如说SD卡,以太网这些用到了DMA传输的外设驱动。 --- of course
softwind
2017-05-09
这家伙很懒,什么也没写!
>>另外,考虑到DMA访问时数据一致性的问题,F7平台上的一些底层的驱动也需要改写? >>比如说SD卡,以太网这些用到了DMA传输的外设驱动。 > >--- > > > >of course --- 看来还有很多工作要做。多谢指教。
softwind
2017-05-09
这家伙很懒,什么也没写!
>1. 尽量使用cache,这样才能加速代码执行效率;不管是静态还是heap,都全开cache; >2. cache一致性问题在于多硬件访问的情况,例如cpu访问(其他cpu访问),dma访问(通用dma、外设专用dma)。这个时候就要考虑一致性的问题,该flush就flush,或者invalid等等。 --- 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
这家伙很懒,什么也没写!
>按理说,OS层面应该要考虑cache line大小的。至于说cache与否与任务切换等的关系,那么这部分能加速尽量加速,特别是最好有TCM,能够让OS内核部分代码和CPU主频跑在一致频率上 --- 就是说主要是效率优化方面的问题。 那么当前rt-thread在F7平台上的实现(基于STM32F7 Disco平台的BSP),Cache全开的话,内核的安全性是不受影响的?主要是在设备驱动和应用层需要考虑多硬件访问的数据一致性问题?
撰写答案
登录
注册新账号
关注者
0
被浏览
6.7k
关于作者
softwind
这家伙很懒,什么也没写!
提问
41
回答
153
被采纳
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
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
简单两步配置RTT源码阅读环境 vsc+clangd
2
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
3
LVGL使用字库IC芯片显示中文
4
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
5
freemodbus主机在freertos的适配,参考rtthread例程
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部