在许多情况下(测试某些模块、首次启动、DDR 不可用),编写在 iRAM(OCRAM)上运行的裸机(SDK)代码是唯一可能的情况。第一个(附加的)补丁创建一个具有适当部分的新链接器文件,第二个补丁使用前一个文件包含一个微型应用程序(根据定义,它应该很小)。以下是准备设置的步骤:
1.下载最新的i.MX6 SDK(撰写本文档时,v1.1.0是最新版本)。
2. 让 GIT 接管( git init; git add .; git commit -m '1st commit' )
3. 应用补丁( git am < patch1; git am < patch2 )
4. 编译
# 本示例适用于 mx6q sabreSD,修订版 C
$ ./tools/build_sdk -target=mx6dq \
-board=智能设备\
-board_rev=c \
-app=iram
5. SD卡闪烁并运行:
5.1.ELF文件和U-boot:
# 输出图像位于:
#elf=输出/mx6dq/minimal/smart_device_rev_c/minimal.elf
$ dd if=$elf \
的= / dev / sdb \
seek=2048 bs=512;同步
# 使用您最喜欢的 u-boot 版本启动您的主板,只需
# 确保 bootelf 命令是 presnet
> mmc dev Y
>mmc读取0x10800000 0x800 XXX
> bootelf 0x10800000
其中 Y 是 SD 设备,XXX 是 dd 闪烁时看到的记录。
5.2 BIN文件:
# 输出图像位于:
#bin=输出/mx6dq/minimal/smart_device_rev_c/minimal.bin
$ dd if=$bin \
的= / dev / sdb \
寻求=2跳过=2 bs=512;同步
# 将 SD 放入您的主板并打开电源。
附注:
+ 第一个补丁取自内部讨论MX6 SDK(PLATLIB):是否有人创建了可以从内部 RAM 运行的精简版本?
大家好,
当我为 mx6dq 构建 iram 时一切正常,但使用 mx6sdl 时遇到此错误:
$./tools/build_sdk-t mx6sdl-b smart_device-vc-app iram-clean
链接iram
/home/pod1hc/data/sdk_zcam/zcam_sdk/output/mx6sdl/iram/smart_device_rev_c/obj/apps/common/basic_iram_sdk_app.ld:113无法将位置计数器向后移动(从 00937b80 到 00920000)
制作[1]:*** [/home/pod1hc/data/sdk_zcam/zcam_sdk/output/mx6sdl/iram/smart_device_rev_c/iram.elf]错误 1
make: *** [iram] 错误 2
构建 mx6sdl smart_device rev_c 全部失败,返回代码为 2
您能给我一些建议来解决这个错误吗?谢谢 !
嗨,大家好,
有没有什么方法可以初始化、读取和写入外部 DDR3?
大家好,
我为 imx6 Solo 编译了 iRam ./tools/build_sdk -t mx6sdl -b smart_device -app iram -clean
你能帮我一下吗?
[错误]
链接iram
/home/lia1hc/projects/sdk/iMX6_Platform_SDK/output/mx6sdl/iram/smart_device_rev_a/obj/apps/common/basic_iram_sdk_app.ld:113 无法向后移动位置计数器(从 009376c0 到 00920000)
制作[1]:*** [/home/lia1hc/projects/sdk/iMX6_Platform_SDK/output/mx6sdl/iram/smart_device_rev_a/iram.elf]错误 1
make: *** [iram] 错误 2
{Error} !
andreaskarlsson描述的优化确实很好,但是有点过于激进。
链接器确实摆脱了 IVT 和 DCD 中包含的所有信息,从而产生了无法使用的二进制文件(我指的是 ROM)。
为了保留此信息,您应该在链接器脚本中的 ivt 和 dcd 相关部分通配符周围添加单词 KEEP。
例如:KEEP(*(.ivt)),保持(*.(boot_data))...
我希望它有帮助(或将会有帮助:-)。
2
一直在看那个。907000 - 918000 之间的区域被标记为 OCRAM 自由区域。不确定那方面的问题是什么。现在我最好的选择是 USB 加载程序 - 它抱怨“未知的加载地址”,而使用 sdk .bin 它成功加载到 0x1000_0000。我尝试过修改 conf 文件,但仍然没有成功。
如果您读取 RM,则内部 RAM 由内部启动使用。可能会有一些冲突。我只是从调试器运行它。
2
直到最近我才能够重新开始这项工作,但你的建议非常棒。当加载我的调试器时,效果很好,谢谢。
我的下一个项目是弄清楚为什么启动 ROM 不想加载它(通过 OTG 端口使用 USB 加载器工具),即使它可以很好地处理 sdk_unit_test 二进制文件。
我可以重现它,我一定是忘了我还使用了以下标志
在 flags.mk 中添加
CFLAGS += -f函数部分
LDFLAGS += --gc-sections
进行干净的构建,然后它应该会通过。至少对我来说是这样的。
您可以尝试添加编译器标志 -ffunction-sections 和链接器 --gc-sections
如果您为 DL 进行编译,是否会看到同样的问题?
2
2
有趣的。在应用了 andreas 的补丁和更改后,我尝试做同样的事情,尽管是使用 Solo。但我遇到了构建失败:
.../basic_iram_sdk_app.ld:113 无法向后移动位置计数器(从 00924200 到 0091dfb8)
该线位置在 .ivt 中(ORIGIN(OCRAM))部分。我会尽力查明真相。任何指点都值得赞赏。
我在 imx6DL 上运行了它,需要确认 DDR 的问题
小调整
#定义堆栈大小8K
#定义 L1_PAGE_TABLE_SIZE 8K
/* 为 malloc 堆定义部分 */
.heap(NOLOAD):ALIGN(32)
{
释放内存开始 = .;/* malloc 从这里开始分配 */
。+= 原点(OCRAM)+ 长度(OCRAM) - RAM_VECTORS_SIZE - L1_PAGE_TABLE_SIZE - .;
释放内存结束 = .;
} > 奥卡姆
Frias / ChristopherWilliams您是否知道如何减少标准运行时库或任何其他减少二进制文件以便它可以适合 MX6DL OCRAM?
Leo
莱昂纳多,这似乎不是那么简单。最小的 .text我使用最少的应用程序和 -Os 标志实现的区域大约是 75Kb,但我们只有 68Kb 的 OCRAM 可供使用。因此必须以某种方式进行优化。最大部分被标准运行时库所消耗。
正确的。由于 OCRAM 较大,因此为 Q 完成了设置。不确定 DL 的正确数字,如果您能够在其上运行某些东西,请告诉我。
Leo
Leonardo,
定义OCRAM ORIGIN = 0x0091_0000的原因是什么?这使得 i.MX6SDL 板没有空间。