Zephyr移植到NXP MIMXRT1060_EVK-RT1061 CVL5A过程
Posted 17岁boy想当攻城狮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zephyr移植到NXP MIMXRT1060_EVK-RT1061 CVL5A过程相关的知识,希望对你有一定的参考价值。
目录
硬件与软件环境
厂商:FeiLing |
型号:OK10xx-S |
版本:V1.1 |
级别:工业级 |
主频:528MHZ |
MCU:MIMXRT1060_EVK-RT1061 CVL5A |
SOC:i.mxRT1061 |
RAM:内置RAM |
ROM:QSPI Nor Flash |
SYS:Zephyr 7.0 |
Zephyr移植过程
我最初认为我的MCU是MIMX RT1060,而Zephyr支持的官方板中对MIMX RT1060是支持的
但遗憾的是烧录进去无法正常运行,我开始使用Jlink-SWD调试,发现Zephyr在初始化BSS段时出现错误。
我在调试之前查过cpu寄存器的值,PC寄存器指向的是NOR_FLASH地址,0x60000000所以是正确的
(gdb) info registers
r0 0x600033f9 1610626041
r1 0x0 0
r2 0x3e75d 255837
r3 0x90f0 37104
r4 0x600033f9 1610626041
r5 0x20203a70 538983024
r6 0xc6f1bf4b 3337731915
r7 0xf0 240
r8 0x200300 2097920
r9 0x0 0
r10 0x0 0
r11 0x400f8000 1074757632
r12 0x1fe 510
sp 0x20200f70 0x20200f70
lr 0x215329 2183977
pc 0x600033fa 0x600033fa <z_arm_reset+2>
xpsr 0x41000000 1090519040
msp 0x20200f70 538972016
psp 0x0 0
primask 0x0 0
basepri 0x0 0
faultmask 0x0 0
control 0x0 0
fpscr 0x0 0
我开始继续调试
Zephyr 在执行到 z_bss_zero() 时崩溃
z_arm_prep_c () at C:/Users/zhihao3x/work/zephyrproject/zephyr/arch/arm/core/aarch32/prep_c.c:183
183 z_bss_zero();
尝试进入z_bss_zero函数进行调试,发现是先执行memset函数清除bss基地址
基地址从 0x80000000 开始
我觉得这里有问题,我开始查看我的芯片手册
仔细看了一下我的芯片说明书,发现我的MCU使用的SOC是RT1061 CVL5A。 据我所知,MIMXRT1060有两个版本。 这两个版本使用不同的 SOC。 一个版本使用 RT1061 CVL5A,另一个版本。 使用的是RT1062 DVL6A,Zephyr可以在RT1062 DVL6A版本上正常运行。
于是我继续调试和排除故障。 我通过文档发现RT1061_继承了RT1050的特性。 内部没有RAM,也没有划分SDRAM。
内存划分目的:
内存区 | 作用 |
---|---|
ITCM | 将需要运行的函数代码存放在RAM中,属于cache,cpu一级缓存,速度较快,可以将一些想要快速运行的代码放入此处,它距离CPU最近,总线传输速度最快 |
DTCM | 用于存放内核读写的变量数据,如栈,频率与主频一致 |
OCRAM | 用于通用变量,外设读写缓存,频率为主频的1 / 4 |
同时发现我的SDRAM(0x80000000)被划分在了SEMC片外控制器中。 如果要访问它,必须通过SEMC 访问它。 Zephyr 无法直接访问此内存。
根据我手册中的RAM内存划分,我把Zephyr DTS文件中的SDRAM改成了DTCM地址
sdram0: memory@0x20000000 {
/* Micron MT48LC16M16A2B4-6AIT:G */
device_type = "memory";
reg = <0x20000000 DT_SIZE_KB(128)>;
};
然后在重新编译,并烧录bin文件,注意是烧录bin文件,这里Zephyr生成的xip格式的elf文件无法正常运行,这里推测可能是Zephyr生成的xip文件里的向量表与1061不兼容导致的,但bin文件是可以的。
虽然最终不是大问题,但是调试过程非常缓慢,因为是使用最初不了解问题原因在哪儿,需要验证的东西太多了,如zephyr有没有被bootload正确引导,xip格式是否正确等经过一系列验证才能找到最终问题原因,这是一个非常缓慢且需要耐心的过程。
最后我向zephyr的官方提交了一个patch和一个lssuse
patch收到了作者邮件回复
但是我没有去提交分支,因为我的解决方案只能适用于当前的soc,并不能根据MCU使用不同的SOC来切换,由于我没有那么多时间去处理这些,就将问题提交到了lssuse上:https://github.com/zephyrproject-rtos/zephyr/issues/39293
这也是一个记录过程
以上是关于Zephyr移植到NXP MIMXRT1060_EVK-RT1061 CVL5A过程的主要内容,如果未能解决你的问题,请参考以下文章
uboot | 移植NXP官方uboot到imx6ull开发板(2016.03)
uboot | 移植NXP官方uboot到imx6ull开发板(2016.03)
Linux | 移植NXP官方linux内核到imx6ull开发板(4.1.15)