Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ART-Pi
ITCM
在RAM运行_ramfunc
使用ITCM给ART-Pi(STM32H7)代码加速
发布于 2021-08-29 10:15:18 浏览:2240
订阅该版
[tocm] ## 一 ITCM 简介 ART-Pi 使用 STM32H750 做为主控。 STM32H7 使用的是 Cortex_M7 架构,中自带了ITCM(Instruction tightly coupled RAM)。下图可以看到 ITCM 与 Cortex_M7 内核直连,可实现 0 等待状态。  TCM RAM 与 CPU 是同频,其他 AHB 总线无法做到和 CPU 同频,所以使用 TCM 可以获得更好的性能。 虽然 TCM 的速度很快,但是他也有缺点,例如 DTCM 不能使用 DMA1 DMA2,ITCM 只能作为指令 RAM。 要使用 ITCM 得先知道他的地址:  通过上图可以看到 ITCM 的区域是 0x00000000 - 0x0000FFFF 的 64K。ITCM 从 0 地址就很尴尬了,一般在程序判断 `NULL` 就是用的 0 地址,所以最好的办法就是避开起始地址,为了某些情况下对齐操作,建议从 0x00000008 地址开始使用。 ## 二 ITCM 在不同编译器下的使用 一个可执行程序是由 **编译 --> 链接** 这个过程的产生的。如何将函数指定到 ITCM ,其实就是将函数链接的地址设置在 ITCM 区域就可以了。 本文以 [ART-Pi-LED](https://gitee.com/mirrors/ART-Pi/tree/master/projects/art_pi_blink_led) 的示例代码来展示这一过程。 ### 在 RTT Studio 中如何使用 ITCM RTT Studio 中使用的编译器为 :GCC ,所以直接按照 GCC 链接脚本的方式去定义就好了。 #### 在 RTT Studio 中如何指定某个函数到指定地址,需要三个步骤: 第一步:在链接文件中增加一个 ITCM 的描述信息 ```c MEMORY { ROM (rx) : ORIGIN =0x90000000,LENGTH =8192k RAM (rw) : ORIGIN =0x24000000,LENGTH =512k RxDecripSection (rw) : ORIGIN =0x30040000,LENGTH =32k TxDecripSection (rw) : ORIGIN =0x30040060,LENGTH =32k RxArraySection (rw) : ORIGIN =0x30040200,LENGTH =32k ITCM (rx) : ORIGIN =0x00000008,LENGTH =64k } ``` 最后一行增加了 ITCM 的描述信息 第二步:在链接文件中 SECTIONS 中增加 ITCM 的信息 ```c SECTIONS { .ITCM : { . = ALIGN(4); *(.ITCM) *(.ITCM.*) . = ALIGN(4); } > ITCM = 0 .text : { . = ALIGN(4); _stext = .; KEEP(*(.isr_vector)) /* Startup code */ . . . } } ``` 这里需要注意的是新增加的 .ITCM 一定要放到 .text 的前面 第三步,指定函数到 ITCM ```c __attribute__((section(".ITCM")))int main(void) { rt_uint32_t count = 0; rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); rt_kprintf("main adderss is 0x%08x\r\n",main); rt_thread_mdelay(500); led_light(); } ``` 在修改之后重新 build 工程,查看 map 文件 ``` *(.ITCM) .ITCM 0x00000008 0x3c ./applications/main.o 0x00000008 main ``` 可以看到 main 函数的地址已经被指定到 ITCM 的区域。 #### 在 RTT Studio 中如何某个文件夹的所有函数到指定地址,需要两个步骤: 第一步:在链接文件中增加一个 ITCM 的描述信息 ``` MEMORY { ROM (rx) : ORIGIN =0x90000000,LENGTH =8192k RAM (rw) : ORIGIN =0x24000000,LENGTH =512k RxDecripSection (rw) : ORIGIN =0x30040000,LENGTH =32k TxDecripSection (rw) : ORIGIN =0x30040060,LENGTH =32k RxArraySection (rw) : ORIGIN =0x30040200,LENGTH =32k ITCM (rx) : ORIGIN =0x00000008,LENGTH =64k } ``` 最后一行增加了 ITCM 的描述信息 第二步:在链接文件中 SECTIONS 中增加 ITCM 的信息 ```c SECTIONS { .ITCM : { . = ALIGN(4); ./applications/main.o (.text*) *(.ITCM) *(.ITCM.*) . = ALIGN(4); } > ITCM = 0 .text : { . = ALIGN(4); _stext = .; KEEP(*(.isr_vector)) /* Startup code */ . . . } } ``` 这里将 ./applications/main.o 中的 .text 段都放入到了 ITCM 查看 map 文件 ``` .text.led_light 0x00000024 0x38 ./applications/main.o 0x00000024 led_light .text.main 0x0000005c 0x3c ./applications/main.o 0x0000005c main .text.vtor_config 0x00000098 0x1c ./applications/main.o ``` 可以看到 main.c 中的文件都被定义到了 ITCM 段 ### 在 MDK 中如何使用 ITCM 在 MDK 中也需要修改对用的链接文件 #### 在 MDK 中如何指定某个函数到指定地址,需要二个步骤: 第一步,修改链接文件 ```c LR_IROM1 0x90000000 0x00800000 { ; load region size_region ER_IROM1 0x90000000 0x00800000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM0 0x00000008 0x0000FFF8 { ; ITCM 64K *(.ITCM) } RW_IRAM1 0x24000000 0x00080000 { ; AXI SRAM 512K .ANY (+RW +ZI) } } ``` 增加 ITCM 的描述 第二步,指定函数到 ITCM ```c __attribute__((section(".ITCM"))) void led_light(void) { rt_kprintf("main adderss is 0x%08x\r\n",led_light); while(1) { rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_LOW); } } ``` 查看 map 文件 ``` led_light 0x00000009 Thumb Code 46 main.o ``` 可以看到 `led_light ` 函数已经被放到 ITCM 区域 #### 在 MDK 中如何某个C文件的某些函数到指定地址,需要二个步骤: 第一步,修改链接文件 ``` LR_IROM1 0x90000000 0x00800000 { ; load region size_region ER_IROM1 0x90000000 0x00800000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM0 0x00000008 0x0000FFF8 { ; ITCM 64K *(.ITCM) } RW_IRAM1 0x24000000 0x00080000 { ; AXI SRAM 512K .ANY (+RW +ZI) } } ``` 增加 ITCM 的描述 第二步,指定某些函数到 ITCM 可以在这些函数的前面和结束之后地方加上关键字,如下所示: ```c #pragma arm section code = ".ITCM" void led_light(void) { rt_kprintf("main adderss is 0x%08x\r\n",led_light); while(1) { rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_LOW); } } int main(void) { rt_uint32_t count = 0; rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); rt_kprintf("main adderss is 0x%08x\r\n",main); rt_thread_mdelay(500); led_light(); return RT_EOK; } #pragma arm section ``` 查看 map 文件 ```c led_light 0x00000009 Thumb Code $Super$$main 0x00000037 Thumb Code ``` ## 三 注意事项 大家都知道 RAM 是掉电易失的,这种加速的方法如何在量产产品中使用呢?实际上使用以上的方法,MDK 会将特定的函数编译到 ROM 当中,在每次启动的时候都会将 ROM 中指定的函数拷贝到 RAM 放中。 但是上面的方法在 RTT Studio 中只会将函数写到指定的 RAM,这样掉电就丢失了,后续我会继续研究 RTT Studio 实现这个操作。
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
whj467467222
开源,分享,交流,共同进步
文章
32
回答
1222
被采纳
149
关注TA
发私信
相关文章
1
RT-Thread Studio 编译ART-Pi 的SDK报错 求助!-
2
ART-Pi 在 Studio 中使用TouchGFX Library 编译报错
3
RT-Thread Studio 更新错误
4
基于ART-Pi开发板创建的工程,RT-Thread Settings打不开
5
在 ART-Pi 平台使用 openocd 直接烧录到外部 spi flash?
6
ART-Pi工程用mdk5打开后提示文件找不到
7
ART-PI demo是否能够增加demo流程框图或者详细设计文档
8
ART-Pi 的ST_Link无法识别
9
请把ART-Pi仓库放到gitee上一份。
10
仅有ART-Pi开发包时,RTT Studio无法创建ART-Pi工程
推荐文章
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组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
10
个答案
3
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
lizimu
2
篇文章
9
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部