lgwd
发表于 2024-11-27 21:06:15
我们产品的程序就是一个程序模块,所有子模块都包含在内。用了二十多年,不断修改完善。为了适用CDC和HID接口,已经用C语言全部重写了。但是C语言改写的程序毕竟是近年的,没有长期经过多方面考验!做产品的都知道,如果一个用户发现使用产品的问题,后面的补救是一件很麻烦的事。所以使用CDC和HID接口需要慎重!既然STC推出汇编使用CDC,本想加入原程序就行了,就像C编程那样,现在看来不是一件简单的事!如果是重新开发一个成品肯定会用C编程和重新规划!现在打算STC的CDC库怎样能简便加入原汇编程序。我会根据上述建议看能否找到简便的方法?以前的教材讲授A51汇编编程也少有介绍多文件,后来就推广C编程了。
神农鼎
发表于 2024-11-27 21:35:03
下帖是讲汇编 调用 C 的库,就是针对楼主的场景的,
你先把这个贴实际操作下
51 开源 汇编语言调用USB-CDC库文件实现USB-CDC虚拟串口通信,取代传统串口 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)
lgwd
发表于 2024-11-27 23:42:21
我们的全部程序编译后代码不到6K。放在一个汇编文件中管理应方便些。Keil使用的是Lx51,查看了一下生成的MAP文件,STC的USB库分为好多模块,不是一两个。不知道怎么定位到Code的靠后位置?与STC手册中提到的CODE定位也不相同,BL51界面也不相同。
STC的模板也是使用Lx51,换成BL51编译根本通不过。我们的程序编码后也不超过6K,如果按建议分成多个小程序就怕还是不行,那费的功夫可不小!之前将C编写的CDC库加入到我们的C改写的程序中也很快通过了,改写了STC的CDC和HID双接口示例程序,我们自己编译的库在C程序中也能实现CDC和HID同时通讯。目前看来汇编实现CDC还要费些功夫!
LAOXU
发表于 2024-11-28 05:52:28
lgwd 发表于 2024-11-27 23:42
我们的全部程序编译后代码不到6K。放在一个汇编文件中管理应方便些。Keil使用的是Lx51,查看了一下生成的MA ...
我经常优化C编写的程序, 先将C编译转化为SRC文件, 再去C将SRC文件加入项目重新编译.
经常发现编译通不过, 通过分析程序代码, 得出结论, ASM汇编 仅是 C 的一个子集, C语言的
有些特性, ASM汇编 不支持!
AX51-Lx51 扩展汇编连接器, 比 A51-BL51 标准汇编连接器, 增加了不少功能. 我喜欢用A51-BL51 标准 编译 程序建立库,
这样, 在 AX51-Lx51 下, 一般都能用(也有特例, 因 AX51-Lx51 的检查条件更严格, 比如扩展中断向量就通不过)
LAOXU
发表于 2024-11-28 06:03:22
根据楼主的问题, 我昨晚 分析了官方CDC库, 结论是放弃 LIB.
又花了几个小时, 转而 分析 官方CDC例程(带C源码), 有十几个USB例程, 分析得出结论, 有点乱, 主要是 每个例程, 根据功能, 随意修改 usb库,
想提炼出 单纯的 usb库, 比较吃力, 短时间未能成功.
LAOXU
发表于 2024-11-28 06:27:09
lgwd 发表于 2024-11-27 23:42
我们的全部程序编译后代码不到6K。放在一个汇编文件中管理应方便些。Keil使用的是Lx51,查看了一下生成的MA ...
我仔细想了一下, 将 LIB 重定位怕不行, 但将 obj 文件重定位行的通, 前提是 STC提供 USB库 的源代码(建库用的 C).
方法1.将其拆分 重新 编译建 LIB, 再 连接到 你的长汇编中.
方法2.搞个 假C框架启动程序, 可调用USB C程序.
以上两种方法, 都需要 STC官方提供 USB库 源代码.
通过分析 官方USB例程(带C源码) 提取, 由于不规范, 太累了.
LAOXU
发表于 2024-11-28 08:28:42
lgwd 发表于 2024-11-27 23:42
我们的全部程序编译后代码不到6K。放在一个汇编文件中管理应方便些。Keil使用的是Lx51,查看了一下生成的MA ...
你的 6K 代码, 我理解为 用最原始的 ORG 定位, 内存 RAM 应用也未标准化定义, 变量地址以 EQU 命名, 具体怎么用, 靠人工安排(编译器不认识), 是这种类型的 ASM程序.
我将官方 stc8h_cdc_demo_asm 例程, 编译后查看 MAP 文件, 发现内存 RAM存在严重的冲突, 就算你 再努力, 编译通过, 估计要解决你程序中的内存冲突(编译器无法识别,双方占用共同存储器), 也要大改特改你的程序.
采用官方已编译的 USB库, 这条路走不通, 只能使用官方未编译的 USB源码, 重新定义USB中变量占用地址, 才能根本解决问题.
lgwd
发表于 2024-11-28 22:11:24
我的程序以前是用内存小模式,精心安排变量包括位变量地址。一个大程序模块,各个子程序紧密连接。考虑到STC的库可能占用内存较大,才选择内存大模式。现在看来还是不行。之前根据STC的CDC和HID复合设备原代码,我编译了CDC和HID复合设备库,初步测试还行。下一步想在此基础上,参考网上搜寻的一篇文献,在xdata开辟一个公共存储区实现C编译的库与汇编程序通过公共存储区共享数据!谢谢大家费心回复!
神农鼎
发表于 2024-11-28 22:21:43
51 开源 汇编语言调用USB-CDC库文件实现USB-CDC虚拟串口通信,取代传统串口 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)
先将这个 汇编调用 C的USB库,测试下,专为 汇编调用C的USB库写的演示
lgwd
发表于 2024-11-29 21:50:01
好的,谢谢!下载看看,不知这个版本是否更新一点?