我使用CubeMX + Keil5 + AC6进行开发,正在学习V7用户手册(V3.5)。第28章关键代码在ITCM执行的方法提及,我们希望将需要实时性的程序和变量放在TCM中执行。对此有以下问题:
1. ITCM的空间有限(64KB),如何评估哪些代码属于时间/安全关键代码?
(1) 教程中将APP、BSP配置至ITCM区域(含stm32h7_it.c),而其中也包含许多初始化代码。个人习惯使用CubeMX,其生成的分组Application/User/Core是否也不必要置于ITCM?
(2) 程序中将大量调用HAL库函数,是否将其一并置于ITCM区域更为妥当?
2. 用户手册采用将Vector Table配置至DTCM的方法,如果想将其配置至ITCM:
(1) 除使用memcpy将FLASH_BANK1_BASE复制至D1_ITCMRAM_BASE,并配置SCB->VTOR外,还有其他需要注意的吗?
(2) 编程手册(PM0253 Rev5)的4.3节指出,SCB->VTOR的复位值为Unknown,那对于未调整Vector Table地址的程序,是由何文件配置该值为D1_ITCMRAM_BASE的?
3. 用户手册采用将工程分组的Code/Const分配至ITCM,但这依赖于工程的Target配置,需要勾选Use Memory Layout from Target Dialog。而这与第26章DTCM、SRAM使用方法中,由自定义的sct文件管理不兼容,应当如何解决呢?根据硬汉哥的stm32-v7.sct与坛友指导,目前已实现第26章功能,适配AC6的sct文件如下。
[C] 纯文本查看 复制代码 ; **************************************************************
; *** Scatter-Loading Description File generated by Penguins ***
; **************************************************************
LR_IROM1 0x08000000 0x00200000 { ; load region size_region
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data - 128KB DTCM
.ANY (+RW +ZI)
}
RW_IRAM2 0x24000000 0x00080000 { ; RW data - 512KB AXI SRAM
*(.bss.RAM_D1)
*(.data.RAM_D1)
}
RW_IRAM3 0x30000000 0x00048000 { ; RW data - 128KB SRAM1 + 128KB SRAM2 + 32KB SRAM3
*(.bss.RAM_D2)
*(.data.RAM_D2)
}
RW_IRAM4 0x38000000 0x00010000 { ; RW data - 64KB SRAM4
*(.bss.RAM_D3)
*(.data.RAM_D3)
}
}
4. 硬汉哥曾指出因TCM已与CPU紧密耦合,不应对其配置MPU,但应用笔记(AN4839 Rev2)的3.1节指出,含ITCM在内的0x00000000~0x1FFFFFFF段的Cache缺省策略为WT,含DTCM在内的0x20000000~0x3FFFFFFF段的Cache缺省策略为WBWA,是否意味其与CPU间同样经过Cache?
5. 我目前的主要应用包括UART、ADC、DAC,均使用DMA进行数据交换,已知通用DMA无法访问DTCM:
(1) 仅对ADC,是否推荐升级至MDMA,并继续将数据存于DTCM?若是,应如何解决数据一致性问题,是否遵循问题4不配置MPU;若否,MDMA还有何应用场景?
(2) 若继续使用通用DMA,并将数据存于SRAM,对UART低速外设、DAC赋全局常量仅输出不计算、ADC高速采样且需后续数据处理,分别推荐使用何种MPU策略?
|