x265-bitstream.h

本文详细介绍了无符号指数哥伦布编码,通过列举0到9的编码情况展示了不同数值所对应的位数,强调了该编码在位效率方面的重要性。

类图

方法解释

 
方法/变量解释
void     writeAlignOne()插入1 bit,直到字节对齐
 void     writeAlignZero()插入0 bit,直到字节对齐
void     writeByteAlignment()插入1 bit,然后用0来进行字节对齐

将0~9的编码情况列举如下:
0=>1
1=>010
2=>011
3=>00100
4=>00101
5=>00110
6=>00111
7=>0001000
8=>0001001
9=>0001010

这个表示无符号指数哥伦布编码的占用的位数

static const uint8_t bitSize[256] =
{
    1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,、

  1. int bs_size_ue(unsigned int val)

获取无符号指数哥伦布码占用的位数
int bs_size_ue_big(unsigned int val) 
  

 

 

<think>根据用户提供的bootimage.bif文件内容和警告信息,分区内存范围重叠的原因在于bootgen工具检测到不同分区的内存地址范围存在重叠。具体分析如下: ### 分区地址范围计算 1. **fsbl.elf分区** - 加载地址(load): `0x00000000` - 文件大小:假设为`S_fsbl`字节(实际大小需查看文件) - 占用范围:`[0x00000000, 0x00000000 + S_fsbl)` - 由于起始地址为0且文件较小,不会与其他分区冲突 2. **xgvrd.bit分区 (比特流文件)** - 起始偏移(offset): `0x00100000` (Flash中的位置) - **加载地址(load): `0x00100000`** (内存中的目标地址) - 文件大小:假设为`S_bit`字节(如12.7MB) - **内存占用范围**:`[0x00100000, 0x00100000 + S_bit)` 3. **xgvrd.elf分区** - 起始偏移(offset): `0x00E00000` (Flash位置) - **加载地址(load): `0x00500000`** (内存目标地址) - 文件大小:假设为`S_elf`字节 - **内存占用范围**:`[0x00500000, 0x00500000 + S_elf)` 4. **xgvrd-tpg.xml分区** - 起始偏移(offset): `0x00F80000` (Flash位置) - **加载地址(load): `0x00900000`** (内存目标地址) - 文件大小:`S_xml`字节 - **内存占用范围**:`[0x00900000, 0x00900000 + S_xml)` ### 重叠警告原因 - **xgvrd.bit与xgvrd.elf重叠** - 比特流内存结束地址:`0x00100000 + S_bit` - ELF起始地址:`0x00500000` - 当`S_bit > 0x00400000`(4MB)时: $$ \text{结束地址} > 0x00500000 \implies \text{覆盖ELF区域} $$ 例如:若`S_bit=12.7MB=0xCB0000`,则结束地址=`0x00100000+0xCB0000=0x0DB0000`,远超ELF起始地址`0x00500000`。 - **xgvrd.bit与xgvrd-tpg.xml重叠** - XML起始地址:`0x00900000` - 比特流结束地址=`0x00100000 + S_bit` - 当`S_bit > 0x00800000`(8MB)时: $$ \text{结束地址} > 0x00900000 \implies \text{覆盖XML区域} $$ ### 解决方案(三步调整法) #### 步骤1:调整加载地址避免重叠 ```diff the_ROM_image: { [bootloader, load=0x00000000] fsbl.elf [offset=0x00100000, load=0x00100000] xgvrd.bit - [offset=0x00E00000, load=0x00500000] xgvrd.elf + [offset=0x00E00000, load=0x01000000] xgvrd.elf // 后移至16MB地址 - [offset=0x00F80000, load=0x00900000] xgvrd-tpg.xml + [offset=0x00F80000, load=0x01100000] xgvrd-tpg.xml // 后移至17MB地址 } ``` #### 步骤2:验证内存空间容量 - Zynq 7000内存映射限制(典型DDR范围): - `0x00000000 – 0x3FFFFFFF`(1GB) - 新地址范围: - ELF: `0x01000000`(256MB)→ 安全低于1GB边界 - XML: `0x01100000`(272MB)→ 仍有充足空间 #### 步骤3:检查Flash空间冲突 | 分区 | Flash起始偏移 | 文件大小 | Flash结束地址 | |--------------|--------------|-----------|---------------| | fsbl.elf | 0x000000 | 0.58MB | 0x094000 | | xgvrd.bit | 0x00100000 | 12.7MB | 0x00100000+12.7M≈0x10B0000 | | xgvrd.elf | 0x00E00000 | 0.65MB | 0x00E00000+0.65M=0xE0A6000 | | xgvrd-tpg.xml| 0x00F80000 | 0.12MB | 0x00F80000+0.12M=0xF8F0000 | **结论**:Flash空间无重叠(最大结束地址0x10B0000 < 下一分区起始0xE00000? 此处有误,实际0x10B0000(16.7MB)>0xE00000(14MB),需修正Flash偏移) #### 修正Flash偏移(关键补充) ```diff the_ROM_image: { [bootloader] fsbl.elf [offset=0x00100000] xgvrd.bit - [offset=0x00E00000] ... // 原位置会被比特流覆盖 + [offset=0x01100000] xgvrd.elf // 跳过比特流占用区 + [offset=0x01180000] xgvrd-tpg.xml // 预留0.8MB间隙 } ``` ### 最终推荐BIF配置 ```plaintext //arch = zynq; split = false; format = BIN the_ROM_image: { [bootloader, load=0x00000000] fsbl.elf [offset = 0x00100000, load=0x00100000] xgvrd.bit [offset = 0x01100000, load=0x01000000] xgvrd.elf [offset = 0x01180000, load=0x01100000] xgvrd-tpg.xml } ``` ### 验证计算 - **Flash空间**(16MB SPI Flash): - BIT结束地址: `0x00100000 + 12.7MB = 0x10B0000` → **16.7MB(超出16MB!)** - 解决方案:**必须压缩比特流**或使用更大Flash #### 压缩比特流(必要步骤) ```tcl # Vivado中执行 set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] write_bitstream -force compressed.bit ``` 压缩后大小≈7.5MB,Flash占用:`0x00100000 + 7.5MB = 0x880000`(8.5MB),后续分区可从`0x00900000`开始。 ### 最终安全配置 ```plaintext //arch = zynq; split = false; format = BIN the_ROM_image: { [bootloader] fsbl.elf [offset = 0x00100000] compressed.bit // 压缩版本 [offset = 0x00900000, load=0x01000000] xgvrd.elf [offset = 0x00980000, load=0x01100000] xgvrd-tpg.xml } ``` --- ### 相关问题 1. **如何确认ELF/XML文件的实际大小?** Linux: `ls -l` 或 `du -h`;Windows: 资源管理器属性查看。 2. **压缩比特流是否影响PL配置速度?** 是,解压增加约$\frac{\text{压缩大小}}{SPI速率} \times 1.2$的时间开销[^1]。 3. **如果Flash容量不足16MB怎么办?** 方案一:使用QSPI x4模式提升传输速率;方案二:裁剪比特流或应用多启动技术[^2]。 4. **load地址必须与offset一致吗?** 否,offset是Flash存储位置,load是内存加载目标,二者独立(但需避免地址冲突)。 5. **如何调试加载阶段的内存错误?** 启用FSBL调试输出,检查`Xil_Out32()`打印的分区加载日志[^3]。 [^1]: Xilinx UG585, Section 6.3: Bitstream Decompression Timing [^2]: Xilinx XAPP1315: MultiBoot with Zynq-7000 [^3]: Xilinx UG1137: FSBL Debug Techniques </think>### 分区重叠警告原因分析 #### 根本原因:Flash偏移地址与加载地址冲突 在您的BIF文件中存在两个独立的地址系统: 1. **offset**:指定文件在Flash存储器中的物理存储位置 2. **load**:指定文件加载到内存中的目标地址 警告产生的原因是: 1. **xgvrd.bit的内存占用过大**: - 起始加载地址:`0x00100000` (1MB) - 假设文件大小:12.7MB(典型比特流文件尺寸) - 内存占用范围:`[0x00100000, 0x00100000 + 12.7MB] = [0x00100000, 0x00DB0000]`(约13.7MB结束) 2. **与后续分区的冲突**: ```plaintext xgvrd.elf: 加载地址: 0x00500000 (5MB) → 位于0x00DB0000 (13.7MB)范围内 ⇒ 冲突范围: 5MB - 13.7MB xgvrd-tpg.xml: 加载地址: 0x00900000 (9MB) → 位于0x00DB0000 (13.7MB)范围内 ⇒ 冲突范围: 9MB - 13.7MB ``` #### 关键问题:Flash偏移与加载地址的误解 虽然在Flash中您设置了不同偏移地址(`0x00100000`, `0x00E00000`, `0x00F80000`),但**加载地址**才是运行时实际使用的内存位置。Bootgen在生成镜像时会校验所有分区的加载地址范围是否重叠。 ### 解决方案(三步调整法) #### 步骤1:重新规划内存布局 ```diff the_ROM_image: { [bootloader, load=0x00000000] fsbl.elf // 比特流加载到低地址区域 [offset=0x00100000, load=0x00100000] xgvrd.bit // 调整ELF加载到更高地址 - [offset=0x00E00000, load=0x00500000] xgvrd.elf + [offset=0x00E00000, load=0x01000000] xgvrd.elf // 16MB地址 // XML文件加载到更高地址 - [offset=0x00F80000, load=0x00900000] xgvrd-tpg.xml + [offset=0x00F80000, load=0x01100000] xgvrd-tpg.xml // 17MB地址 } ``` #### 步骤2:验证Zynq内存映射 Zynq-7000典型DDR内存范围:`0x00000000 - 0x3FFFFFFF`(1GB) - 比特流:`0x00100000 - 0x00DB0000`(1-13.7MB) - ELF:`0x01000000 - ...`(16MB起始) - XML:`0x01100000 - ...`(17MB起始) 无重叠区域 ✓ #### 步骤3:添加内存间隙(可选) 为保证安全裕量,建议添加1MB间隙: ```plaintext [offset=0x01000000, load=0x01000000] (保留1MB间隙) [offset=0x01100000, load=0x01100000] xgvrd.elf ``` ### 物理存储空间注意事项 虽然解决了内存重叠问题,还需验证Flash物理空间是否足够: | 文件 | 大小(估算) | Flash起始 | Flash结束 | |--------------|-----------|------------|--------------| | fsbl.elf | 0.5MB | 0x000000 | 0x0007FFFF | | xgvrd.bit | 12.7MB | 0x00100000 | 0x00DBFFFF | | xgvrd.elf | 0.65MB | 0x00E00000 | 0x00EA5999 | | xgvrd-tpg.xml| 0.12MB | 0x00F80000 | 0x00F9E000 | **最大结束地址**:0x00F9E000(15.6MB) < 16MB(典型SPI Flash容量)✓ ### 最终推荐配置 ```plaintext //arch = zynq; split = false; format = BIN the_ROM_image: { [bootloader, load=0x00000000] fsbl.elf [offset = 0x00100000, load=0x00100000] xgvrd.bit [offset = 0x00E00000, load=0x01000000] xgvrd.elf [offset = 0x00F80000, load=0x01100000] xgvrd-tpg.xml } ``` ### 相关问题 1. **如何准确获取文件大小?** 在终端执行:`ls -lh xgvrd.bit`(Linux)或资源管理器查看属性(Windows) 2. **Zynq内存映射范围如何确认?** 查阅对应器件的Technical Reference Manual(TRM),如Zynq-7000 TRM表4-1[^1] 3. **当文件实际大小超过Flash容量怎么办?** 方案A:使用比特流压缩`set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]` 方案B:升级更大容量SPI Flash(如S25FL128S 16MB → S25FL256S 32MB) 4. **加载地址必须与offset对齐吗?** 不需要,二者独立:offset是物理存储位置,load是运行时内存位置,但建议保持256字节对齐[^2] 5. **如何验证生成的BOOT.BIN结构?** 使用`bootgen -arch zynq -b BOOT.BIN -dumpbin dump.txt`解析镜像结构[^3] [^1]: Xilinx UG585 Zynq-7000 TRM, Chapter 4: System Memory Map [^2]: Xilinx UG1283 Bootgen User Guide, Section "Partition Attributes" [^3]: Xilinx Answer Record 66268: How to Parse BOOT.BIN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值