找回密码
 立即注册
楼主: lgwd

在汇编下如何使用Ai的CDC库?

[复制链接]

51

主题

190

回帖

1137

积分

金牌会员

积分
1137
 楼主| 发表于 2024-11-27 21:06:15 | 显示全部楼层
我们产品的程序就是一个程序模块,所有子模块都包含在内。用了二十多年,不断修改完善。为了适用CDC和HID接口,已经用C语言全部重写了。但是C语言改写的程序毕竟是近年的,没有长期经过多方面考验!做产品的都知道,如果一个用户发现使用产品的问题,后面的补救是一件很麻烦的事。所以使用CDC和HID接口需要慎重!既然STC推出汇编使用CDC,本想加入原程序就行了,就像C编程那样,现在看来不是一件简单的事!如果是重新开发一个成品肯定会用C编程和重新规划!现在打算STC的CDC库怎样能简便加入原汇编程序。我会根据上述建议看能否找到简便的方法?以前的教材讲授A51汇编编程也少有介绍多文件,后来就推广C编程了。
回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25428
发表于 2024-11-27 21:35:03 | 显示全部楼层
回复

使用道具 举报 送花

51

主题

190

回帖

1137

积分

金牌会员

积分
1137
 楼主| 发表于 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还要费些功夫!

点评

你的 6K 代码, 我理解为 用最原始的 ORG 定位, 内存 RAM 应用也未标准化定义, 变量地址以 EQU 命名, 具体怎么用, 靠人工安排(编译器不认识), 是这种类型的 ASM程序. 我将官方 stc8h_cdc_demo_asm 例程, 编译后查看 M  详情 回复 发表于 2024-11-28 08:28
我仔细想了一下, 将 LIB 重定位怕不行, 但将 obj 文件重定位行的通, 前提是 STC提供 USB库 的源代码(建库用的 C). 方法1. 将其拆分 重新 编译建 LIB, 再 连接到 你的长汇编中. 方法2. 搞个 假C框架启动程序, 可调  详情 回复 发表于 2024-11-28 06:27
我经常优化C编写的程序, 先将C编译转化为SRC文件, 再去C将SRC文件加入项目重新编译. 经常发现编译通不过, 通过分析程序代码, 得出结论, ASM汇编 仅是 C 的一个子集, C语言的 有些特性, ASM汇编 不支持! AX51-Lx51 扩  详情 回复 发表于 2024-11-28 05:52
回复

使用道具 举报 送花

50

主题

1219

回帖

5513

积分

荣誉版主

积分
5513
发表于 2024-11-28 05:52:28 | 显示全部楼层
lg*** 发表于 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 的检查条件更严格, 比如扩展中断向量就通不过)
回复

使用道具 举报 送花

50

主题

1219

回帖

5513

积分

荣誉版主

积分
5513
发表于 2024-11-28 06:03:22 | 显示全部楼层
根据楼主的问题, 我昨晚 分析了官方CDC库, 结论是放弃 LIB.
又花了几个小时, 转而 分析 官方CDC例程(带C源码), 有十几个USB例程, 分析得出结论, 有点乱, 主要是 每个例程, 根据功能, 随意修改 usb库,
想提炼出 单纯的 usb库, 比较吃力, 短时间未能成功.
回复

使用道具 举报 送花

50

主题

1219

回帖

5513

积分

荣誉版主

积分
5513
发表于 2024-11-28 06:27:09 | 显示全部楼层
lg*** 发表于 2024-11-27 23:42
我们的全部程序编译后代码不到6K。放在一个汇编文件中管理应方便些。Keil使用的是Lx51,查看了一下生成的MA ...

我仔细想了一下, 将 LIB 重定位怕不行, 但将 obj 文件重定位行的通, 前提是 STC提供 USB库 的源代码(建库用的 C).
方法1.  将其拆分 重新 编译建 LIB, 再 连接到 你的长汇编中.
方法2.  搞个 假C框架启动程序, 可调用  USB   C程序.
以上两种方法, 都需要 STC官方提供 USB库 源代码.
通过分析 官方USB例程(带C源码) 提取, 由于不规范, 太累了.
回复

使用道具 举报 送花

50

主题

1219

回帖

5513

积分

荣誉版主

积分
5513
发表于 2024-11-28 08:28:42 | 显示全部楼层
lg*** 发表于 2024-11-27 23:42
我们的全部程序编译后代码不到6K。放在一个汇编文件中管理应方便些。Keil使用的是Lx51,查看了一下生成的MA ...

你的 6K 代码, 我理解为 用最原始的 ORG 定位, 内存 RAM 应用也未标准化定义, 变量地址以 EQU 命名, 具体怎么用, 靠人工安排(编译器不认识), 是这种类型的 ASM程序.
我将官方 stc8h_cdc_demo_asm 例程, 编译后查看 MAP 文件, 发现内存 RAM存在严重的冲突, 就算你 再努力, 编译通过, 估计要解决你程序中的内存冲突(编译器无法识别,双方占用共同存储器), 也要大改特改你的程序.
采用官方已编译的 USB库, 这条路走不通, 只能使用官方未编译的 USB源码, 重新定义USB中变量占用地址, 才能根本解决问题.
回复

使用道具 举报 送花

51

主题

190

回帖

1137

积分

金牌会员

积分
1137
 楼主| 发表于 2024-11-28 22:11:24 | 显示全部楼层
我的程序以前是用内存小模式,精心安排变量包括位变量地址。一个大程序模块,各个子程序紧密连接。考虑到STC的库可能占用内存较大,才选择内存大模式。现在看来还是不行。之前根据STC的CDC和HID复合设备原代码,我编译了CDC和HID复合设备库,初步测试还行。下一步想在此基础上,参考网上搜寻的一篇文献,在xdata开辟一个公共存储区实现C编译的库与汇编程序通过公共存储区共享数据!谢谢大家费心回复!
回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25428
发表于 2024-11-28 22:21:43 | 显示全部楼层
回复

使用道具 举报 送花

51

主题

190

回帖

1137

积分

金牌会员

积分
1137
 楼主| 发表于 2024-11-29 21:50:01 | 显示全部楼层
好的,谢谢!下载看看,不知这个版本是否更新一点?
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 14:17 , Processed in 0.083128 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表