hotpower 发表于 2008-6-25 23:09 侃单片机 ←返回版面
25楼: 程序所能访问的任意区域~~~真有事求助IceAge老师~~~
下午求助了几位年轻的C++村民:
我用C++和COM都出现了数据指针和函数指针不规范或不标准转换的警告.
在VC++下没问题,但在DSP的CCS3.1环境下就出现了警告. 我用所有C++或C的强制转换都未果,甚至用中间变量折腾一次也不行~~~
H文件: typedef long HRESULT; typedef interface IHotAsmArrayCom IHotAsmArrayCom;
typedef struct IHotAsmArrayComVtbl { void (*comASMArray)(void);//定义数组可执行汇编的函数指针 int (*comintASMArray)(void);//定义数组可执行汇编的函数指针 void (*comASMArrayInt)(int);//定义数组可执行汇编的函数指针 int (*comintASMArrayInt)(int);//定义数组可执行汇编的函数指针 }IHotAsmArrayComVtbl;
interface IHotAsmArrayCom { struct IHotAsmArrayComVtbl *lpVtbl; };
extern void HotCOMDemo(void);
C文件: void HotCOMDemo(void) { TI_IREG __ASMCodeArray[]= {//下面的"数据"实际为汇编代码 __asm_push__(ASMCODE_REGS_AR6), __asm_push__(ASMCODE_REGS_AR7), __asm_frame__(-15), __asm_char_SetACC__(0x88), __asm_frame__(15), __asm_pop__(ASMCODE_REGS_AR7), __asm_pop__(ASMCODE_REGS_AR6), __asm_return__(), };
TI_IREG __intASMCodeArray[]= {//下面的"数据"实际为汇编代码 __asm_push__(ASMCODE_REGS_AR6), __asm_push__(ASMCODE_REGS_AR7), __asm_frame__(-15), __asm_char_SetACC__(0x88), __asm_frame__(15), __asm_pop__(ASMCODE_REGS_AR7), __asm_pop__(ASMCODE_REGS_AR6), __asm_return__(), };
TI_IREG __ASMCodeArrayInt[]= {//下面的"数据"实际为汇编代码 __asm_push__(ASMCODE_REGS_AR6), __asm_push__(ASMCODE_REGS_AR7), __asm_frame__(-15), __asm_char_SetACC__(0x88), __asm_frame__(15), __asm_pop__(ASMCODE_REGS_AR7), __asm_pop__(ASMCODE_REGS_AR6), __asm_return__(), };
TI_IREG __intASMCodeArrayInt[]= {//下面的"数据"实际为汇编代码 __asm_push__(ASMCODE_REGS_AR6), __asm_push__(ASMCODE_REGS_AR7), __asm_frame__(-15), __asm_char_SetACC__(0x88), __asm_frame__(15), __asm_pop__(ASMCODE_REGS_AR7), __asm_pop__(ASMCODE_REGS_AR6), __asm_return__(), };
TI_IREG result, parameter = 0x1234; //申请COM接口指针 IHotAsmArrayCom *AsmArrayCom = new (IHotAsmArrayCom*)[sizeof(IHotAsmArrayCom)]; //挂接汇编数组代码到COM接口 AsmArrayCom->lpVtbl->comASMArray = (ASMCodeArray_FPtr)__ASMCodeArray; AsmArrayCom->lpVtbl->comintASMArray = (intASMCodeArray_FPtr)__intASMCodeArray; AsmArrayCom->lpVtbl->comASMArrayInt = (ASMCodeArrayInt_FPtr)__ASMCodeArrayInt; AsmArrayCom->lpVtbl->comintASMArrayInt = (intASMCodeArrayInt_FPtr)__intASMCodeArrayInt; //通过COM访问汇编数组中的汇编代码 AsmArrayCom->lpVtbl->comASMArray(); result = AsmArrayCom->lpVtbl->comintASMArray(); AsmArrayCom->lpVtbl->comASMArrayInt(0x1234); result = AsmArrayCom->lpVtbl->comintASMArrayInt(0x1234); delete AsmArrayCom; }
再一种:
H文件: typedef void (*ASMCodeArray_FPtr)(void);//定义数组可执行汇编的函数指针 typedef int (*intASMCodeArray_FPtr)(void);//定义数组可执行汇编的函数指针 typedef void (*ASMCodeArrayInt_FPtr)(int);//定义数组可执行汇编的函数指针 typedef int (*intASMCodeArrayInt_FPtr)(int);//定义数组可执行汇编的函数指针 extern void HotASMDemo(void);
C文件:
void ASMObj::ArrayProcess(ASMCodeArray_FPtr process) { process();// }
__TI_IREG ASMObj::ArrayFunction(intASMCodeArray_FPtr function) { return function(); }
void ASMObj::ArrayProcess(ASMCodeArrayInt_FPtr process, __TI_IREG arg) { process(arg);// }
__TI_IREG ASMObj::ArrayFunction(intASMCodeArrayInt_FPtr function, __TI_IREG arg) { return function(arg); }
void HotASMDemo(void) { TI_IREG __ASMCodeArray[]= {//下面的"数据"实际为汇编代码 __asm_pushACC__(), __asm_char_SetACC__(0x88), __asm_popACC__(), __asm_return__(), };
TI_IREG __intASMCodeArray[]= {//下面的"数据"实际为汇编代码 __asm_char_SetACC__(0x88), __asm_return__(), };
TI_IREG __ASMCodeArrayInt[]= {//下面的"数据"实际为汇编代码 __asm_char_SetACC__(0x88), __asm_return__(), };
TI_IREG __intASMCodeArrayInt[]= {//下面的"数据"实际为汇编代码 __asm_char_SetACC__(0x88), __asm_return__(), };
TI_IREG result, parameter = 0x1234; ASM.ArrayProcess((ASMCodeArray_FPtr)(__ASMCodeArray)); result = ASM.ArrayFunction((intASMCodeArray_FPtr)__intASMCodeArray); ASM.ArrayProcess((ASMCodeArrayInt_FPtr)__ASMCodeArrayInt, parameter); result = ASM.ArrayFunction((intASMCodeArrayInt_FPtr)__intASMCodeArrayInt, parameter); }
都是一样~~~
我想是CCS太聪明了~~~
|