1、指定某个函数到特定位置
1.1 默认分散加载文件
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
}
}
默认情况下代码地址
void dev_test(void)
{
rt_kprintf("dev_test function address = 0x%08x\n",dev_test);
}
MSH_CMD_EXPORT(dev_test,devtest);
msh />dev_test
dev_test function address = 0x0800a2f1 //可以看出,默认情况下这个函数在 flash 中
1.2 在分散加载文件中加入以下代码
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
*(.RAM1) // 新增
}
}
在要指定的函数前加入以下代码
__attribute__((section(".RAM1"))) void dev_test(void)
{
rt_kprintf("dev_test function address = 0x%08x\n",dev_test);
}
MSH_CMD_EXPORT(dev_test,devtest);
msh />dev_test
dev_test function address = 0x20000001 // 指定到了 ram 中
但是如果需要整个.c 文件的代码都要放到 ram 中去运行怎么办?总不可能一个一个加代码吧?
2、指定某个文件到特定地址
2.1 分散加载文件修改
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
test_dev.o (+RO)//新增,为何不加入+RW +ZI ? 是因为 .ANY(+RW +ZI) 已经制定了,任何的 RW ZI 都在这块区域,又因为只有这一块 ram ,因此,加上 +RW +ZI 显然是多余的。
}
}
查看 map 文件
rt_test_dev_init 0x20000015 Thumb Code 34 test_dev.o(i.rt_test_dev_init)
test_close 0x20000059 Thumb Code 12 test_dev.o(i.test_close)
test_open 0x20000071 Thumb Code 14 test_dev.o(i.test_open)
test_read 0x2000008d Thumb Code 22 test_dev.o(i.test_read)
test_write 0x200000b1 Thumb Code 22 test_dev.o(i.test_write)
查看 map文件 发现,整个文件的代码都放到了 ram 中执行。
3、总结
由于这块芯片只有一片 ram, 因此 RW-data 与 ZI-data 只能放在这一块内存中去,如果有多个 ram 区且内存不连续,可以新增一块运行域,将指定的数据以及一些代码指定到这个位置即可。
本文介绍了如何通过分散加载文件配置,将特定函数或整个.C文件加载到RAM中执行。通过在分散加载文件中添加指定段落,并使用__attribute__((section(.RAM1)))函数属性,可以实现函数在RAM中的定位。同时,为整个.C文件指定加载位置,只需在分散加载文件中添加相应.o文件并明确其为RO区域。这在需要快速执行或动态分配内存的嵌入式系统中尤为重要。
6344

被折叠的 条评论
为什么被折叠?



