嵌入式处理器通过串行接口或以太网接口接收到的可编程逻辑器件的更新程序是一种Jam文件,使用类似于Altera公司Quartus II development tool的开发工具根据Jam标准和测试语言(Jam Standard Test andProgramming Language 以下简称Jam语言)的要求由Programmer Object File (*.pof,文件后缀名为pof)一类的目标文件转换生成[3] 。Jam文件是一个ASCII文件,文件中包含了对可编程逻辑器件进行编程的所有信息,包括编程算法和数据,详细介绍如下:
Jam Player通过一个jam_jtag_io函数(int jam_jtag_io(int tms_tdi))来控制对JTAG接口的读写操作。每次调用这个函数的时候,JTAG的TMS和TDI输出信号将被设定为需要的值,而TDO输入信号将被采样,值将被返回,之后TCK时钟信号将产生一个下降沿。tms_tdi参数包含3比特信息,分别指示TMS信号和TDI信号的状态以及是否需要读取TDO的输出(如果不需要用到TDO的值则可以跳过对TDO的读取操作)。最低位比特代表TMS的值,第2位比特代表TDI的值,第3位比特指示是否读取TDO:如果置位,则必须读取TDO的值,否则不需要。如果TDO为低电平,返回零值,高电平则返回非零值。如果没有对TDO进行读取也将返回零值。
下面讨论使用嵌入式处理器对可编程逻辑器件重编程时内存的使用情况。为了能够兼容没有内存分配服务的嵌入式处理器,Jam Player 不仅需要程序存储空间而且需要动态内存。程序存储空间(如硬盘驱动器或ROM)用于存储Jam Player 可执行二进制文件和Jam 文件;动态内存(如RAM)将在调用Jam Player的时候使用。
Jam Player 按照下面的步骤来使用内存:
(1)嵌入式处理器从ROM 中调用Jam Player;
(2)Jam Player 从ROM 中读取Jam 文件,然后把它存入RAM;
(3)Jam Player 对Jam 文件中包含的压缩程序数据解压,并将解压后的数据存入RAM;
(4)Jam Player 在RAM 中初始化符号表(symbol table)、堆栈(stack)和堆(heap)。