发新帖我要提问
12
返回列表
打印

在MCU/ARM/DSP上实现动态链接不是梦~~~

[复制链接]
楼主: hotpower
手机看帖
扫描二维码
随时随地手机跟帖
21
gyt| | 2008-6-25 10:07 | 只看该作者 回帖奖励 |倒序浏览

相当厉害

使用特权

评论回复
22
makesoft| | 2008-6-25 11:54 | 只看该作者

哈哈,精力旺盛就强烈自恋 :-)

使用特权

评论回复
23
hotpower|  楼主 | 2008-6-25 20:05 | 只看该作者

哈哈~~~COM技术使人们梦入仙境~~~~

哈哈~~~不愿C++的人们可以一步到位越过C++直接进入COM世界~~~

哈哈~~~有时间再定出个MCU/ARM/DSP的COM接口的动态链接汇编数组(实际可为C/C++)的协议来~~~

哈哈~~~这样俺的"无限RAM"就可实现了~~~







使用特权

评论回复
24
IceAge| | 2008-6-25 21:12 | 只看该作者

hotpower 老兄,你是如何处理绝对地址的?

你的汇编数组是一定要放在指定位置,还是浮动的? 

使用特权

评论回复
25
hotpower|  楼主 | 2008-6-25 23:09 | 只看该作者

程序所能访问的任意区域~~~真有事求助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太聪明了~~~

使用特权

评论回复
26
hotpower|  楼主 | 2008-6-25 23:16 | 只看该作者

哈哈~~~上帖源码收入文潭~~~以后和老师要悄悄地交流了~~~

哈哈~~~没留意暴露了全部源码~~~
相关链接:http://blog.**/hotpower/128256/message.aspx

使用特权

评论回复
27
IceAge| | 2008-6-26 01:19 | 只看该作者

我以前也发现有这种问题

在我回你avr c++ 的代码里,有利用 任意参数类型 避过compiler 检查的代码。这种限制实在不合理,应该允许 强制,让敢于承担风险的高手去闯

我现在还在使用TI 51 DSP(40M) 的汇编,这个片子已经停产了,现在准备使用 80M 的5402,尽管可以直接移植汇编,不过我打算用 c/c++ 把代码重写一遍, 到时候,可以多多交流。

使用特权

评论回复
28
hotpower|  楼主 | 2008-6-26 01:24 | 只看该作者

哈哈~~~俺拥有"全球"最锋利的dsp54x利剑库,不日后即发布~~~

俺一直很尊敬IceAge老师~~~学生我跪拜了~~~

谢谢!!!

使用特权

评论回复
29
一朝成名| | 2008-7-1 09:03 | 只看该作者

请教

貌似用函数回调的方法就可以了
干吗搞的这么麻烦

呵呵。。。。。。。。

使用特权

评论回复
30
linqing171| | 2008-7-2 14:07 | 只看该作者

还是没有看明白怎么实现动态地址的。

看代码不如先给我辈讲解一下大体的实现。
单片机的地址是不分段的,比较麻烦啊,编译的时候jmp倒是是相对的偏差,可是call指令出来的后面是绝对地址啊。

还有人家微软的COM都已经到了3.0了(OLE算是COM2.0的话),都已经是托管的了,还支持反射,跨平台。

晚上仔细看看hot大叔搞的这个数组是干什么的。

使用特权

评论回复
31
winfeng| | 2008-7-3 21:06 | 只看该作者

楼主一贯简单问题复杂化

使用特权

评论回复
32
jxyhome| | 2008-7-6 18:27 | 只看该作者

呵呵,我早就在arm上实现了

楼主的思路利用com是对的,但后面就错了……com不仅仅是一种处理函数接口调用的东西,而是一个很不错的技术……

 我目前已经在手机上实现了arm上的动态链接已经在国内申请专利了,实现了可用于动态组件开发的sdk。
 不过还是佩服hotpower的知识广博,其实arm动态链接也很简单,国内大概也有不少人实现了,关键是做出很稳定好用的sdk,比如高通的brew,技术不是什么问题。

使用特权

评论回复
33
linqing171| | 2008-7-7 13:33 | 只看该作者

我还是想知道,不分页的mcu上call后面的参数怎么弄的?

在51上如果实现的话,是不是函数不能调用子函数?
如果能调用的话,一旦dll编译后,就固定了,那怎么办?
难道函数调用的子函数地址也要“数组”化?

使用特权

评论回复
34
zhiwei| | 2008-7-7 17:05 | 只看该作者

能否做成动态加载的模式

把n个模块编译到同一个SRAM运行地址,不过要求编译后的obj独立生成hex,然后不论存放到哪里都可以调过来运行。机制有点像MMU啊。

使用特权

评论回复
35
甄蔡组合| | 2008-7-8 10:10 | 只看该作者

这里都是啥呀

使用特权

评论回复
36
wzhigen| | 2008-7-8 16:36 | 只看该作者

厉害

使用特权

评论回复
37
XHTXZXW| | 2008-7-9 18:46 | 只看该作者

嘿嘿

LZ要搞DLL裤啊!很好很好!
某个裤子里面的函数,可能要调用其他裤子里的函数啊?这个怎么解决?还有就是代码重定位的问题,每个函数内部,几乎可以肯定都有跳转指令吧?是不是要定义一个严格的动态连接的机制呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则