ZHCADC3B February 2019 – October 2023
复制表具有以下格式:
typedef struct
{
uint16 rec_size;
uint16 num_recs;
COPY_RECORD recs[num_recs];
} COPY_TABLE;
rec_size 是 16 位无符号整数,指定表中每个复制记录的大小,以16 位单元为单位。
num_recs 是 16 位无符号整数,指定表中的复制记录数。
表的其余部分由复制记录向量组成,每个复制记录具有以下格式:
typedef struct
{
uint32 load_addr; /* 32-bit storage for data or code pointer */
uint32 run_addr; /* 32-bit storage for data or code pointer */
uint32 size;
} COPY_RECORD;
load_addr 字段是离线存储中源数据的地址。
run_addr 字段是将数据复制到的目标地址。
size 字段已重载:
源数据的其余部分特定于格式。copy-in 例程读取源数据前面的 16 位以确定其格式/索引,使用该值索引到处理程序表中,并调用处理程序来完成解压缩和复制数据。
处理程序表具有以下格式:
copy-in 例程如所示那样通过由链接器定义的特殊符号引用该表。处理程序索引的分配不是固定的;链接器会根据每个应用程序所需的解压缩例程来为该应用程序重新分配索引。处理程序表生成到可执行文件的 .cinit 节中。
TI 工具链中的运行时支持库包含所有受支持压缩格式的处理程序函数。此函数的第一个实参是指向 16 位(位于 16 位索引后)的地址。第二个实参是目标地址。
Copy-In 函数的参考实现提供了 copy_in 函数的参考实现:
typedef void (*handler_fptr)(const unsigned char *src, unsigned char *dst);
extern int __TI_Handler_Table_Base;
void copy_in(COPY_TABLE *tp)
{
unsigned short i;
for (i = 0; i < tp->num_recs; i++)
{
COPY_RECORD crp = tp->recs[i];
const unsigned char *ld_addr = (const unsigned char *)crp.load_addr;
unsigned char *rn_addr = (unsigned char *)crp.run_addr;
if (crp.size) // not compressed, just copy the data.
memcpy(rn_addr, ld_addr, crp.size);
else // invoke decompression routine
{
unsigned char index = *ld_addr++;
handler_fptr hndl = ((handler_fptr *)(__TI_Handler_Table_Base))[index];
(*hndl)(ld_addr, rn_addr);
}
}
}