Nios II嵌入式系统软件设计(五)
在SOPCBuilder中添加自定义指令并将其集成到Nios II处理器后,在Nios II IDE中编译工程,在生成的system.h文件中会出现自定义指令的宏定义,宏定义的具体内容根据不同的指令类型以及指令的输出输出变量类型而有所不同,我使用的自定义指令添加后经过编译在system.h文件中生成如下代码:
#define ALT_CI_CRC_N 0x00000000<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
#define ALT_CI_CRC_N_MASK ((1<<3)-1)
#define ALT_CI_CRC(n,A) __builtin_custom_ini(ALT_CI_CRC_N+(n&ALT_CI_CRC_N_MASK),(A))
ALT_CI_CRC_N即为硬件篇中说明的每个指令的序号,从0~255,总共可以有256个指令。因为这条指令是扩展用户自定义指令,N从0到7总共有8个功能,((1<<3)-1)刚好是111,作为N值的掩码,ALT_CI_CRC(n,A)是供软件调用的自定义指令,ALT_CI_是自定义指令的标识,CRC是在指令集成进NIOS II处理器时用户设置的指令名字,该指令功能有函数__builtin_custom_ini()函数实现,Nios II 总共包含52种内建函数,在本文后面会详细解释,在这里该函数的第一个参数是指令序号,由于该指令为扩展指令,还需加上N的值以确定函数具体实现哪一功能,用ALT_CI_CRC_N_MASK与N进行与操作(进行掩码),使其值只能在0~7之间,以避免用户不小心将N值设置为大于7而执行其他指令。第二个参数为输入变量A,即输入端口中的dataa。
这样,只要在源文件中include “system.h”文件即可以方便的调用指令ALT_CI_CRC(n,A)。
关于自定义指令内建函数,其格式为:
__builtin_custom_<return type>n<parameter types>
return type和parameter types有三种形式,i代表int,f代表float,p代表Void *,根据返回类型和输入参数类型的不同,内建函数总共有52种形式。
不返回结果
void __builtin_custom_n (int n);
void __builtin_custom_ni (int n, int dataa);
void __builtin_custom_nf (int n, float dataa);
void __builtin_custom_np (int n, void *dataa);
void __builtin_custom_nii (int n, int dataa, int datab);
void __builtin_custom_nif (int n, int dataa, float datab);
void __builtin_custom_nip (int n, int dataa, void *datab);
void __builtin_custom_nfi (int n, float dataa, int datab);
void __builtin_custom_nff (int n, float dataa, float datab);
void __builtin_custom_nfp (int n, float dataa, void *datab);
void __builtin_custom_npi (int n, void *dataa, int datab);
void __builtin_custom_npf (int n, void *dataa, float datab);
void __builtin_custom_npp (int n, void *dataa, void *datab);
返回int型
int __builtin_custom_in (int n);
int __builtin_custom_ini (int n, int dataa);
int __builtin_custom_inf (int n, float dataa);
int __builtin_custom_inp (int n, void *dataa);
int __builtin_custom_inii (int n, int dataa, int datab);
int __builtin_custom_inif (int n, int dataa, float datab);
int __builtin_custom_inip (int n, int dataa, void *datab);
int __builtin_custom_infi (int n, float dataa, int datab);
int __builtin_custom_inff (int n, float dataa, float datab);
int __builtin_custom_infp (int n, float dataa, void *datab);
int __builtin_custom_inpi (int n, void *dataa, int datab);
int __builtin_custom_inpf (int n, void *dataa, float datab);
int __builtin_custom_inpp (int n, void *dataa, void *datab);
返回float型
float __builtin_custom_fn (int n);
float __builtin_custom_fni (int n, int dataa);
float __builtin_custom_fnf (int n, float dataa);
float __builtin_custom_fnp (int n, void *dataa);
float __builtin_custom_fnii (int n, int dataa, int datab);
float __builtin_custom_fnif (int n, int dataa, float datab);
float __builtin_custom_fnip (int n, int dataa, void *datab);
float __builtin_custom_fnfi (int n, float dataa, int datab);
float __builtin_custom_fnff (int n, float dataa, float datab);
float __builtin_custom_fnfp (int n, float dataa, void *datab);
float __builtin_custom_fnpi (int n, void *dataa, int datab);
float __builtin_custom_fnpf (int n, void *dataa, float datab);
float __builtin_custom_fnpp (int n, void *dataa, void *datab);
返回指针
void *__builtin_custom_pn (int n);
void *__builtin_custom_pni (int n, int dataa);
void *__builtin_custom_pnf (int n, float dataa);
void *__builtin_custom_pnp (int n, void *dataa);
void *__builtin_custom_pnii (int n, int dataa, int datab);
void *__builtin_custom_pnif (int n, int dataa, float datab);
void *__builtin_custom_pnip (int n, int dataa, void *datab);
void *__builtin_custom_pnfi (int n, float dataa, int datab);
void *__builtin_custom_pnff (int n, float dataa, float datab);
void *__builtin_custom_pnfp (int n, float dataa, void *datab);
void *__builtin_custom_pnpi (int n, void *dataa, int datab);
void *__builtin_custom_pnpf (int n, void *dataa, float datab);
void *__builtin_custom_pnpp (int n, void *dataa, void *datab);
用户412948 2011-10-12 19:55