Zynq-7000示例设计 - 修改14.2 FSBL以加载多个可执行分区

描述

在14.2中,FSBL被构建为将代码切换到图像中找到的第一个可执行分区。

如果您的图像结构如下,那么application1.elf会立即执行,而application2.elf不会从flash复制到内存。

fsbl.elf
bitstream.bit
application1.elf
application2.elf

通过选择New - > Application Project并选择独立的FSBL来创建FSBL模板。

按如下所示修改FSBL以加载两个可执行分区并执行第一个(application1.elf)。

1.在“image_mover.c”中定义全局变量:

u32 ExecutionAddress = 0;

2.修改“update_status_reg”部分下“image_mover.c”中的代码,以实现以下算法:

2.1。加载分区后,检查它是否是可执行分区(例如:application1.elf)。如果是这样,将执行地址存储到变量ExecutionAddress并继续查找其他分区。
2.2。继续加载其他分区。在我们的例子中,application2.elf
2.3。加载最后一个分区后,使用ExecutionAddress变量作为切换地址。 Application1.elf将执行。

注意:此代码没有被测试的备用机制

注意:目前的计划是在未来版本中为FSBL实施更好,更稳定和经过测试的解决方案。

update_status_reg:

..............................................

if(IsLastPartition(Hap)){
debug_xil_printf(“没有更多分区要加载\ r \ n”);

NextPartition = PartitionNum;

//已更改:最后一个分区已加载,下一步该怎么办?

if(ExecutionAddress){
//已更改:已加载先前的“代码分区”

debug_xil_printf(“已更改:准备在%x \ r \ n”处执行,ExecutionAddress);

ExecAddr = ExecutionAddress;

SkipPartition = 0;

} else {

//已更改:未找到“代码分区”
debug_xil_printf(“已更改:没有要执行的分区\ r \ n”);
而(1){
PatWDT();

}

}
} else if(IsEmptyHeader(Hap)){

debug_xil_printf(“空分区头%x \ r \ n”,NextPartitionAddr);
OutputStatus(EMPTY_PARTITION_HEADER);
返回MOVE_IMAGE_FAIL;

} else {// CHANGED:它不是最后一个分区,但它是稍后执行的分区。


if(SkipPartition == 0){

SkipPartition = 1;
ExecutionAddress = ExecAddr;
debug_xil_printf(“CHANGED:不执行但准备。\ r \ n”);

}
}

..............................................

编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2018-07-31 13:14:12 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它