搜索
bottom↓
回复: 79

终于将 8052 的指令码校对完了

  [复制链接]

出280入168汤圆

发表于 2021-3-4 20:21:54 | 显示全部楼层 |阅读模式
年前受 MCU 缺货影响,一时兴起准备写一个 8051 的 MCU 模拟器,做替换 MCU 的开发准备。

在网上找了一些相关的 MCU 手册,也来不及细看,赶着过年慌慌张张写完了内核模拟代码。

然后过年期间老友们打牌疯狂三缺一,就把代码扔那儿不管了 ...

好不容易过完年上班了,在调试代码的时候发现之前写的代码和手册内容对不上 ~ 有点懵逼 !

仔细检查之后才发现:操!现在的 8051 是变形金刚啊!那么多变种,没有重样的 ...

前面在写代码的时候没注意是按照哪本手册写,这里翻一下那里翻一下的,完蛋了!只好重新写一个吧!


重新在网上找了差不多上百本资料,慢慢筛查,终于搞明白了,现在的 8051 系列单片机基本上都是以 Intel 的原始 8052 内核扩展的。

但是这么老的资料现在很难找全,所以为了凑出一份准确的、纯血统 8052 指令表可费了老鼻子劲了!

现在很多家的手册都是从很旧的缩拍和影印资料上 OCR 来的,可能没法准确校对,所以错漏和遗失很严重,常常是前后描述对不上 ...

不过,还是花了两个星期,慢慢的交叉对比检查,终于将这份资料整理出来了,很值啊!

现将表格留在这里,给有相同需求的同行和同好们,请尽情享用。   








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2021-3-4 20:30:19 | 显示全部楼层
好资料。模拟器是否直接将hex文件转成其它单片机执行的,但是IO部分又如何对应呢?

出280入168汤圆

 楼主| 发表于 2021-3-4 20:37:49 | 显示全部楼层
zhikunWang 发表于 2021-3-4 20:30
好资料。模拟器是否直接将hex文件转成其它单片机执行的,但是IO部分又如何对应呢? ...

是的,就是给个 HEX 文件就能跑了,

I/O 也准备用专门的模拟代码输出 I/O 的状态,

还可以通过模拟串口和其它设备或电脑本机通讯。

主要目的是想写个 Debuger 供自己调试代码用。

出0入0汤圆

发表于 2021-3-4 20:54:31 | 显示全部楼层
谢谢分享,

出0入442汤圆

发表于 2021-3-4 21:13:54 来自手机 | 显示全部楼层
chunjiu 发表于 2021-3-4 20:37
是的,就是给个 HEX 文件就能跑了,

I/O 也准备用专门的模拟代码输出 I/O 的状态,

恭喜又造了个大轮子

出0入0汤圆

发表于 2021-3-4 21:53:48 | 显示全部楼层
以前老的805x的手册最后有指令集表格。

出0入0汤圆

发表于 2021-3-4 22:00:49 来自手机 | 显示全部楼层
找个模拟器源码,里面就有现成的指令码

出0入76汤圆

发表于 2021-3-4 22:04:07 | 显示全部楼层
你这个造的是大型拖拉机轮子吧

出280入168汤圆

 楼主| 发表于 2021-3-4 22:13:58 来自手机 | 显示全部楼层
造奔驰的轮子 ,哈哈哈!老的 MCU 开发工具太简陋了,习惯了新式工具很难再回头啦!

就像平时出门开惯了小车,突然从仓库里捡一辆三十年前的破单车骑出门一样。

找情怀可以,但当做生产力工具效率太低了,人力成本非常不划算。

出280入168汤圆

 楼主| 发表于 2021-3-4 22:16:23 来自手机 | 显示全部楼层
zhouqw1979 发表于 2021-3-4 21:53
以前老的805x的手册最后有指令集表格。

我下载了差不多上百本手册和书了,没有一本是百分百是正确的,大多数残缺不全。所以才要交叉比对来校正,可费劲了。

出280入168汤圆

 楼主| 发表于 2021-3-4 22:17:06 来自手机 | 显示全部楼层
oldban 发表于 2021-3-4 22:00
找个模拟器源码,里面就有现成的指令码

都是用宏展开的,没法看……

出10入12汤圆

发表于 2021-3-4 22:36:25 | 显示全部楼层
8051有很多模拟器吧,比如proteus,重写一个的意义何在?

出280入168汤圆

 楼主| 发表于 2021-3-4 22:48:04 来自手机 | 显示全部楼层
xxdd 发表于 2021-3-4 22:36
8051有很多模拟器吧,比如proteus,重写一个的意义何在?

将老式 MCU 的开发和调试现代化,提高工作效率,其实就是为目前 MCU 缺货做预防工作的。

在 proteus 上不能按照 STC 的库存来找型号吧?那只好自己做一个了。

出0入24汤圆

发表于 2021-3-5 01:30:50 | 显示全部楼层
有现成的文档






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出280入168汤圆

 楼主| 发表于 2021-3-5 07:27:06 | 显示全部楼层

谢谢兄弟,这么资料我也找到了,并也用于最终的校对。

出0入8汤圆

发表于 2021-3-5 08:04:37 | 显示全部楼层
我艹,膜拜一下大佬!

出0入0汤圆

发表于 2021-3-5 08:33:21 | 显示全部楼层
我也这么想过,但只是停留在想。楼主牛,开始做了

出0入4汤圆

发表于 2021-3-5 09:15:01 | 显示全部楼层
楼主狠人~~~你这么一搞,反。汇编不是易如反掌

出0入4汤圆

发表于 2021-3-5 09:23:43 | 显示全部楼层
zhanyanqiang 发表于 2021-3-5 09:15
楼主狠人~~~你这么一搞,反。汇编不是易如反掌

51指令的反汇编,网上早就有了
可以将机器码转为汇编语句

出0入0汤圆

发表于 2021-3-5 11:21:49 | 显示全部楼层
如果可以,最终在高性能的MCU上实现,提供和开发工具的调试接口,io,内置多数外设,不同型号的只要修改下对应的指令周期就可以了,

出0入0汤圆

发表于 2021-3-5 11:44:04 来自手机 | 显示全部楼层
本帖最后由 oldban 于 2021-3-5 11:45 编辑

visual51,以前玩的模拟器,源码在本坛就可以找到

出280入168汤圆

 楼主| 发表于 2021-3-5 13:57:03 | 显示全部楼层
oldban 发表于 2021-3-5 11:44
visual51,以前玩的模拟器,源码在本坛就可以找到

因为我想做的 Debuger 需要紧密耦合的定制地方太多,所以现成的代码基本上没太大用途,有那个时间去琢磨着边看边改还不如自己从头写来的快还省事。

出0入0汤圆

发表于 2021-3-6 11:16:54 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2021-3-6 11:29:40 | 显示全部楼层
牛人                                                               

出0入0汤圆

发表于 2021-3-6 11:44:54 | 显示全部楼层
不明觉厉。留名支持

出0入0汤圆

发表于 2021-3-6 12:37:01 | 显示全部楼层
只想说楼主真闲。。。

出0入8汤圆

发表于 2021-3-6 13:55:26 来自手机 | 显示全部楼层
模拟器在电脑上运行,执行hex目标程序?

出280入168汤圆

 楼主| 发表于 2021-3-6 14:00:40 来自手机 | 显示全部楼层
justdomyself 发表于 2021-3-6 13:55
模拟器在电脑上运行,执行hex目标程序?

是的,先在电脑上调算法跑 HEX 文件,无误后再优化到 mcu 上,让其它 MCU 可以跑 8051 家族的代码。

再后面就可以挂一个自己的 Debuger,调试 8051 的源程序。

出0入8汤圆

发表于 2021-3-6 14:14:29 | 显示全部楼层
chunjiu 发表于 2021-3-6 14:00
是的,先在电脑上调算法跑 HEX 文件,无误后再优化到 mcu 上,让其它 MCU 可以跑 8051 家族的代码。

再 ...

stm32能这么干么?

出280入168汤圆

 楼主| 发表于 2021-3-6 14:19:09 来自手机 | 显示全部楼层
justdomyself 发表于 2021-3-6 14:14
stm32能这么干么?

8051 HEX 可以放在 STM32 上跑,但 STM32 很难放到其它 MCU 上跑,因为速度跟不上。但在电脑上跑 STM32 的代码是完全没问题的。

出0入0汤圆

发表于 2021-3-6 14:33:24 | 显示全部楼层
楼主,请问模拟器是用C实现么

出280入168汤圆

 楼主| 发表于 2021-3-6 14:38:07 | 显示全部楼层
EMOSYN 发表于 2021-3-6 14:33
楼主,请问模拟器是用C实现么

核心部分只能用 C,否则在 PC 上调试完后很难移植到 MCU 上,因为 C++ 无法优化调节一些很关键的部分。

出0入0汤圆

发表于 2021-3-6 14:59:34 | 显示全部楼层
chunjiu 发表于 2021-3-4 22:16
我下载了差不多上百本手册和书了,没有一本是百分百是正确的,大多数残缺不全。所以才要交叉比对来校正, ...

大公司的手册应该比较准确详细,小公司的一般都是抄的,还抄的乱七八糟。

出280入168汤圆

 楼主| 发表于 2021-3-6 15:04:19 | 显示全部楼层
cddx 发表于 2021-3-6 14:59
大公司的手册应该比较准确详细,小公司的一般都是抄的,还抄的乱七八糟。 ...

大公司也一样的,随便拿一本手册,都是一堆错误 ... 只是错误排版的更好看

出280入168汤圆

 楼主| 发表于 2021-3-6 22:06:04 | 显示全部楼层
本帖最后由 chunjiu 于 2021-3-6 22:15 编辑

真正实用的资料来了:




enum INS_NAME_ENUM_TABLE {
    E_INS_TABLE_START = -1,
    e_ins_nop,            //  NOP            ; 0x00
    e_ins_ajmp,           //  AJMP           ; 0x01
    e_ins_ljmp,           //  LJMP           ; 0x02
    e_ins_rr,             //  RR             ; 0x03
    e_ins_inc,            //  INC            ; 0x04
    e_ins_jbc,            //  JBC            ; 0x05
    e_ins_acall,          //  ACALL          ; 0x06
    e_ins_lcall,          //  LCALL          ; 0x07
    e_ins_rrc,            //  RRC            ; 0x08
    e_ins_dec,            //  DEC            ; 0x09
    e_ins_jb,             //  JB             ; 0x0A
    e_ins_ret,            //  RET            ; 0x0B
    e_ins_rl,             //  RL             ; 0x0C
    e_ins_add,            //  ADD            ; 0x0D
    e_ins_jnb,            //  JNB            ; 0x0E
    e_ins_reti,           //  RETI           ; 0x0F
    e_ins_rlc,            //  RLC            ; 0x10
    e_ins_addc,           //  ADDC           ; 0x11
    e_ins_jc,             //  JC             ; 0x12
    e_ins_orl,            //  ORL            ; 0x13
    e_ins_jnc,            //  JNC            ; 0x14
    e_ins_anl,            //  ANL            ; 0x15
    e_ins_jz,             //  JZ             ; 0x16
    e_ins_xrl,            //  XRL            ; 0x17
    e_ins_jnz,            //  JNZ            ; 0x18
    e_ins_jmp,            //  JMP            ; 0x19
    e_ins_mov,            //  MOV            ; 0x1A
    e_ins_sjmp,           //  SJMP           ; 0x1B
    e_ins_movc,           //  MOVC           ; 0x1C
    e_ins_div,            //  DIV            ; 0x1D
    e_ins_subb,           //  SUBB           ; 0x1E
    e_ins_mul,            //  MUL            ; 0x1F
    e_ins_xa5,            //  ???            ; 0x20
    e_ins_cpl,            //  CPL            ; 0x21
    e_ins_cjne,           //  CJNE           ; 0x22
    e_ins_push,           //  PUSH           ; 0x23
    e_ins_clr,            //  CLR            ; 0x24
    e_ins_swap,           //  SWAP           ; 0x25
    e_ins_xch,            //  XCH            ; 0x26
    e_ins_pop,            //  POP            ; 0x27
    e_ins_setb,           //  SETB           ; 0x28
    e_ins_da,             //  DA             ; 0x29
    e_ins_djnz,           //  DJNZ           ; 0x2A
    e_ins_xchd,           //  XCHD           ; 0x2B
    e_ins_movx,           //  MOVX           ; 0x2C
    E_INS_TABLE_END
};

enum OPD1_ENUM_TABLE {
    E_OPD_ONE_TABLE_START = -1,
    e_opd1_addr11,            

...
enum BYTE3_ENUM_TABLE {
    E_BYTES_THREE_TABLE_START = -1,
    e_byte3_a16_7_to_0,                   //  addr16[7..0]                   ; 0x00
    e_byte3_offset,                       //  offset                       ; 0x01
    e_byte3__1_immed,                     //  #immed                     ; 0x02
    e_byte3_direct_des,                   //  direct(des)                   ; 0x03
    e_byte3_imm16_7_to_0,                 //  #immed16[7..0]                 ; 0x04
    e_byte3_null,  // 0x05
    E_BYTES_THREE_TABLE_START
};
...
//  ins,  opd1, opd2, opd3, bytes,cycs,cy,ac,ov, byte2,byte3
unsigned char c52_ins_data[] = {
    0x00, 0x16, 0x16, 0x01, 0x01, 0x01, 0, 0, 0, 0x09, 0x05,   //  0x00 : NOP
    0x01, 0x00, 0x16, 0x01, 0x02, 0x02, 0, 0, 0, 0x00, 0x05,   //  0x01 : AJMP
    0x02, 0x01, 0x16, 0x01, 0x03, 0x02, 0, 0, 0, 0x01, 0x00,   //  0x02 : LJMP
    0x03, 0x02, 0x16, 0x01, 0x01, 0x01, 0, 0, 0, 0x09, 0x05,   //  0x03 : RR
    0x04, 0x02, 0x16, 0x01, 0x01, 0x01, 0, 0, 0, 0x09, 0x05,   //  0x04 : INC
    0x04, 0x03, 0x16, 0x01, 0x02, 0x01, 0, 0, 0, 0x02, 0x05,   //  0x05 : INC
    0x04, 0x04, 0x16, 0x01, 0x01, 0x01, 0, 0, 0, 0x09, 0x05,   //  0x06 : INC
...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2021-3-8 09:30:58 | 显示全部楼层
围观。。。。。

出0入0汤圆

发表于 2021-3-8 12:34:35 | 显示全部楼层
这个资料写core也不错

出280入168汤圆

 楼主| 发表于 2021-3-10 18:26:32 | 显示全部楼层
指令译码执行部分完成了,下一步做系统总线控制单元,然后就可以合并调试了!

出280入168汤圆

 楼主| 发表于 2021-3-14 22:50:59 | 显示全部楼层
指令的解码和执行部分经过小程序验证暂时没有 BUG 了,

系统控制单元的框架完成并实现了基本的功能调度。

后续的工作:

1、对中断管理框架的功能进行填充;
2、添加串口仿真;
3、定时器仿真。

等差不多的时候就准备试一下移植到 STM32F、APM32F103 上跑跑看

出615入1076汤圆

发表于 2021-3-14 23:01:52 来自手机 | 显示全部楼层
真實硬件指令集兼容的話,搞一個 RISC-V 虛擬機。
虛擬指令集兼容的話,搞一個 llvm 或者 wasm 虛擬機。
這樣可能會比較好玩一點,51 已經是夕陽紅了。

出280入168汤圆

 楼主| 发表于 2021-3-15 00:09:06 来自手机 | 显示全部楼层
dukelec 发表于 2021-3-14 23:01
真實硬件指令集兼容的話,搞一個 RISC-V 虛擬機。
虛擬指令集兼容的話,搞一個 llvm 或者 wasm 虛擬機。
這 ...

不是简单的玩一下,是准备应对 MCU 缺货的问题,给自己整个高效的开发调试环境,这些老MCU的原始开发环境太老了,效率太低。

出615入1076汤圆

发表于 2021-3-15 02:59:28 来自手机 | 显示全部楼层
本帖最后由 dukelec 于 2021-3-15 03:12 编辑
chunjiu 发表于 2021-3-15 00:09
不是简单的玩一下,是准备应对 MCU 缺货的问题,给自己整个高效的开发调试环境,这些老MCU的原始开发环境 ...


最高效的調試環境就是串口打印,老 MCU 的原始開發環境絲毫不會影響開發效率,只是用來編譯一下代碼。
你的總效率 = 目標項目工作量 ÷ (造仿真工具時間 + 目標項目時間)。
實際要更低效,因為你定位 bug 更困難,不知道是仿真工具的 bug 還是被仿真的代碼有 bug,還是都沒 bug,配合之後出了 bug。。。

stm32 缺貨你可以選擇接近的國產兼容芯片。
等你仿真器造好穩定可用之時,stm32 都不缺貨了。
就算造好,你會發現,和實際硬件還是有很多差異。

出280入168汤圆

 楼主| 发表于 2021-3-15 07:21:09 来自手机 | 显示全部楼层
dukelec 发表于 2021-3-15 02:59
最高效的調試環境就是串口打印,老 MCU 的原始開發環境絲毫不會影響開發效率,只是用來編譯一下代碼。
你 ...

对于用惯了老 51 的兄弟们来说,开发工具和效率都不是问题,但对于我来说就有强迫症了,希望直接看到源代码的运行流程和历史回溯,这不是串口输出能解决的 ……bug 不用怕,有用的、但又没bug的软件在这个世界上是不存在的。

出0入0汤圆

发表于 2021-3-15 07:35:22 来自手机 | 显示全部楼层
牛人……

出0入0汤圆

发表于 2021-3-15 07:55:25 | 显示全部楼层
支持楼主。

出615入1076汤圆

发表于 2021-3-15 10:28:46 来自手机 | 显示全部楼层
本帖最后由 dukelec 于 2021-3-15 10:32 编辑
chunjiu 发表于 2021-3-15 07:21
对于用惯了老 51 的兄弟们来说,开发工具和效率都不是问题,但对于我来说就有强迫症了,希望直接看到源代 ...


代码的运行流程和历史回溯用串口打印可以的。

你在電腦上寫代碼,也應該強迫症一下,看下 CPU 每一步做了什麼。(或者是在 linux 嵌入式系統上寫代碼,看 CPU 每步做了什麼。)

有用且沒 bug 的軟件也有不少,有一些誰要是能找到 bug 会有高額獎金。

出280入168汤圆

 楼主| 发表于 2021-3-15 10:40:11 | 显示全部楼层
本帖最后由 chunjiu 于 2021-3-15 10:41 编辑
dukelec 发表于 2021-3-15 10:28
代码的运行流程和历史回溯用串口打印可以的。

你在電腦上寫代碼,也應該強迫症一下,看下 CPU 每一步做 ...


就是效率的问题,否则上下班骑骑单车甩甩腿多好,买小车开干嘛?费钱还不环保 ...

PS:

我都娶了第三个老婆了,在兄弟们看起来不是从折腾死?

出615入1076汤圆

发表于 2021-3-15 10:57:07 来自手机 | 显示全部楼层
本帖最后由 dukelec 于 2021-3-15 11:01 编辑
chunjiu 发表于 2021-3-15 10:40
就是效率的问题,否则上下班骑骑单车甩甩腿多好,买小车开干嘛?费钱还不环保 ...  

PS:


已經說了,效率最高的就是串口調試。

譬如之前,我的產品在其它城市的工廠那邊測到 bug,那邊的工程師把打印 log 發給我,我看一眼就知道 bug 在哪了。

還有些概率很低的 bug,要同時測試幾十台,加快 bug 復現概率。有次拿到了一次出 bug 的 log,我就知道 bug 範圍在哪了,針對性在那個範圍打開 verbose 打印(設置一下即可),然後再抓一次出 bug 的 log,bug 就找到了。(50 台機器,一起跑 4、5 個小時會有一台觸發這個 bug。)

出280入168汤圆

 楼主| 发表于 2021-3-15 11:12:42 | 显示全部楼层
dukelec 发表于 2021-3-15 10:57
已經說了,效率最高的就是串口調試。

譬如之前,我的產品在其它城市的工廠那邊測到 bug,那邊的工程師把 ...

兄弟 ~ 那是因为你太熟悉 51 了,就像闭着眼睛在家里怎么走都不会撞墙,但对于我这种没用过 51 的人来说就困难了 ...

而且通过这次做模拟器最大的收获就是对 51 的体系和工作原理彻底搞明白了。

因为我目前负责产品主控板的架构设计规划,对团队的其他成员来说,尽量能做到跨 MCU 型号的无缝切换。

之前的 arm 体系已经没问题了,我们的产品随便换 MCU 厂家和型号都无所谓,只要资源相配就行,

对于我来说,这次打算跨过不同的 MCU 架构来切换系统,又是一次很好玩的挑战,是充满了乐趣的 ... ...

其实这次失败了也无所谓,所积累的经验依然可以用到下一次的工作流程中。

出280入168汤圆

 楼主| 发表于 2021-3-15 11:34:05 | 显示全部楼层
断点随意设,现在是按照源代码行停下来的 ...

测试用的小程序,目前的 bug 已经改完了。

编译器是 sdcc。

  1. #include <stdio.h>

  2. long a = - 1234;
  3. unsigned long b = 0x12345678;

  4. char c1, c2, c3;
  5. void test_asm();

  6. int main()
  7. {
  8.     long c;
  9.    
  10.     c = a+b;
  11.    
  12.     c1 = 0x20;
  13.     c2 = 0x88;
  14.    
  15.     c3 = c1 + c2;
  16.    
  17.     printf("Hello!");
  18.    
  19.     test_asm();
  20.     return c;
  21. }

  22. void test_asm() {
  23.     __asm__ ("add a, #78");
  24.     __asm__ ("add a, @r0");
  25.     __asm__ ("add a, @r1");
  26.     __asm__ ("add a, r0");
  27.     __asm__ ("add a, r1");
  28.     __asm__ ("add a, r3");
  29.     __asm__ ("add a, 8");
  30.     __asm__ ("add a, 9");
  31.     __asm__ ("add a, 10");
  32. }


  33. int putchar(int c) {
  34.     return ++c;
  35. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出615入1076汤圆

发表于 2021-3-15 11:35:40 来自手机 | 显示全部楼层
chunjiu 发表于 2021-3-15 11:12
兄弟 ~ 那是因为你太熟悉 51 了,就像闭着眼睛在家里怎么走都不会撞墙,但对于我这种没用过 51 的人来说 ...

雖然我十年前是通過 51 入門的,但已經不用 51 很久很久,以後應該也不會用,早忘光了。

如果想各種芯片隨便切換,反而應該用串口打印来調試,因為所有平台、架構都支持的很好。反觀你的仿真器,能支持多少架構?

自己興趣玩一下無所謂,當成公司項目來整,只能說公司事真少,真羨慕。。。

出280入168汤圆

 楼主| 发表于 2021-3-15 11:48:04 来自手机 | 显示全部楼层
dukelec 发表于 2021-3-15 11:35
雖然我十年前是通過 51 入門的,但已經不用 51 很久很久,以後應該也不會用,早忘光了。

如果想各種芯片 ...

支持51就行了呀,arm 都是现成的,因为用惯了,所以才觉得 51 系列的老式工具太落后。如果因 mcu 缺货必须要换到 51 上,不可能等到采购芯片和画板了才去解决此问题。

一个人自己的项目可以随便搞搞,效率是无所谓的,但我们团队不可能让一帮工程师等在那儿啥也不做,就等你架桥铺路了。

出280入168汤圆

 楼主| 发表于 2021-3-15 11:52:21 来自手机 | 显示全部楼层
dukelec 发表于 2021-3-15 11:35
雖然我十年前是通過 51 入門的,但已經不用 51 很久很久,以後應該也不會用,早忘光了。

如果想各種芯片 ...

另外团队是详细分工的,我只负责架构设计和整合,app 和产品调试我不用管的 …… 团队其他成员提需求,我负责将底层封装好就行了。

出615入1076汤圆

发表于 2021-3-15 12:56:26 来自手机 | 显示全部楼层
chunjiu 发表于 2021-3-15 11:48
支持51就行了呀,arm 都是现成的,因为用惯了,所以才觉得 51 系列的老式工具太落后。如果因 mcu 缺货必 ...

你這都已經搞了一個多月時間了,不說用現有仿真器仿真一下(目的是熟悉 51,和 STC 不同沒所謂),也不說買 STC 開發板了,就是畫一個板子,也早焊好了。

出280入168汤圆

 楼主| 发表于 2021-3-15 13:29:37 | 显示全部楼层
dukelec 发表于 2021-3-15 12:56
你這都已經搞了一個多月時間了,不說用現有仿真器仿真一下(目的是熟悉 51,和 STC 不同沒所謂),也不說 ...

我们主控板上的 MCU 单价已经快 100 了,而且没货,库存就剩那么一点点,备选型号已经准备好了,只是不太清楚未来的供应状态如何  ... 所以这不是个时间问题,而是战略方向上的问题。

而 51 家族单片机是目前国产 MCU 的大路货,无所谓哪一家的品牌,都是用 8052 扩展来的,所以目标单一,容易在不同厂家之间移植,所以投入的切换成本是比较划算的。

对于产品的架构规划来说,长时间的持续性和稳定性是很重要的,因为后面有一个研发团队在持续不间断工作,不能说停就停,在真正启用一个计划之前,需要反复验证和计算性价比的,

再加上整个工厂的采购、业务、生产线和售前售后等部门在协同工作,可不是一个人想咋整就咋整,而我的工作中心就是决定是否真正启动一个设计方案,让研发团队和工厂切换方向。

所以我们的侧重点是不一样的,我需要解决的问题不是个简单的小框框呀,51 模拟器就是其中的一个小环节而已,而且是冗余的备源,如果之前的备选型号解决了缺货问题,那 51 模拟器这次就用不上了。

台上十分钟,台下十年功,没有什么成功是天上掉下来的!我们团队之所以信任我的决策,那是因为我之前已经独自将成功和失败遍历过了,再提供给他们的是经过筛选的较为合理方案了。

如果到了最后无可奈何的启用了 51 方案,那么我就要给团队提供一个顺滑的切换过程,而不是将厂家的 MCU 手册丢给他们自己慢慢啃,那样的话工厂就要关门了 ...

出615入1076汤圆

发表于 2021-3-15 13:40:22 来自手机 | 显示全部楼层
本帖最后由 dukelec 于 2021-3-15 13:42 编辑
chunjiu 发表于 2021-3-15 13:29
我们主控板上的 MCU 单价已经快 100 了,而且没货,库存就剩那么一点点,备选型号已经准备好了,只是不太 ...


你應該做的,是找一個打算會用的 51/52 MCU,按照你們公司的 HAL 風格,整理一份你們公司工程師熟悉的 HAL 層,再寫一些平台切換的文檔、框架工程,常用的庫先移植過來,bootloader IAP 也先弄好,這樣他們就可以無痛切換了。
如果我是你們公司的工程師,被迫熟悉 51 已經夠不爽了,還要另外熟悉你寫的模擬器,然後遇到 bug 需要調試也基本不關你事,你猜我會不會駡娘。。。

出0入0汤圆

发表于 2021-3-15 13:53:35 | 显示全部楼层
dukelec 发表于 2021-3-15 13:40
你應該做的,是找一個打算會用的 51/52 MCU,按照你們公司的 HAL 風格,整理一份你們公司工程師熟悉的 HA ...

在当前大环境下,51的供货是最靠谱的。

出280入168汤圆

 楼主| 发表于 2021-3-15 13:58:40 | 显示全部楼层
dukelec 发表于 2021-3-15 13:40
你應該做的,是找一個打算會用的 51/52 MCU,按照你們公司的 HAL 風格,整理一份你們公司工程師熟悉的 HA ...

HAL 不是他们的工作,这部分工作属于我,他们关注的是研发产品本身的应用功能和客户需求,但那部分我是不管的。

我只提供一个平台,但要像 Windows 那样保证平台的持续性和兼容性,团队中的软件和硬件成员分工明确,他们通常不太关心各个平台间底层的差异性。

只要原有的软件算法代码在新平台上没有啥毛病就行,应用工程师们无需花费时间和心思去学新的 MCU 架构,否则那才是折腾,

公司里新项目需求是源源不断的、客户需求也这样,所以应用工程师们没有时间去学习新换的 MCU 架构体系,但这才是我的工作内容重心。

出280入168汤圆

 楼主| 发表于 2021-3-15 14:00:07 | 显示全部楼层
su33691 发表于 2021-3-15 13:53
在当前大环境下,51的供货是最靠谱的。

所以我决定冗余的备选方案就是 51 了,而且近期内也只有它才靠谱,别的都是未知数。

出0入0汤圆

发表于 2021-3-15 14:31:35 | 显示全部楼层
期待大师大作

出0入0汤圆

发表于 2021-3-15 18:37:06 | 显示全部楼层
似乎,照着51指令表,用汇编一条条写,然后看生成结果核对是不是更快?  KEIL编译器没道理有误。

出145入215汤圆

发表于 2021-3-15 18:39:22 来自手机 | 显示全部楼层
51放心,有stc在量足又便宜。

出280入168汤圆

 楼主| 发表于 2021-3-15 18:55:45 | 显示全部楼层
huangqi412 发表于 2021-3-15 18:37
似乎,照着51指令表,用汇编一条条写,然后看生成结果核对是不是更快?  KEIL编译器没道理有误。 ...

之前写的代码就是这么推翻了重来的,不同厂家的 MCU 对 51 架构都做了细微的调整和扩展,它们不兼容。

微指令涉及到操控硬件外设资源,现有的东西只能当作参考,结果是否正确还是要依赖自己人工检查。

出0入25汤圆

发表于 2021-3-16 00:28:22 | 显示全部楼层
不知道指令执行周期对你有影响不?

我印象中条件跳转指令,跳转和非跳转执行周期是不一样的。

出0入25汤圆

发表于 2021-3-16 00:31:36 | 显示全部楼层
而且现在单周期核和标准核在指令周期上还是不同的。
即便是单周期核,不同厂牌核心,指令周期还是有差异。

出145入215汤圆

发表于 2021-3-16 01:56:13 来自手机 | 显示全部楼层
hecat 发表于 2021-3-16 00:31
而且现在单周期核和标准核在指令周期上还是不同的。
即便是单周期核,不同厂牌核心,指令周期还是有差异。 ...

stc一开始是12t的系列,后来出了6t,在烧录时候可以选择。所以说是不是可以简单理解为6m换12m晶振,其实内核结构没有本质改变的。如果单独改变某些指令的周期那将无法兼容标准51内核的代码。

出280入168汤圆

 楼主| 发表于 2021-3-16 06:12:16 来自手机 | 显示全部楼层
hecat 发表于 2021-3-16 00:28
不知道指令执行周期对你有影响不?

我印象中条件跳转指令,跳转和非跳转执行周期是不一样的。 ...

全部计算在内了,在处理定时器的时候要用到,每条指令都是原子操作,所以不能分割。

出280入168汤圆

 楼主| 发表于 2021-3-16 06:19:46 来自手机 | 显示全部楼层
hecat 发表于 2021-3-16 00:31
而且现在单周期核和标准核在指令周期上还是不同的。
即便是单周期核,不同厂牌核心,指令周期还是有差异。 ...

可以简化判定逻辑,只要总线控制器的同步不出错就能正常调度任务。毕竟用软件模拟比真的硬件竞争处理要好办多了。

在软核里面,模拟时钟和时间都是可以暂停的,和真的 MCU 不一样,真实电路在 debug 时时钟很难处理,软核的优势就是这个。

出0入0汤圆

发表于 2021-3-16 13:22:14 | 显示全部楼层
chunjiu 发表于 2021-3-15 18:55
之前写的代码就是这么推翻了重来的,不同厂家的 MCU 对 51 架构都做了细微的调整和扩展,它们不兼容。

...

KEIL的编译器对所有厂家编译是一样的还是针对不同做了不同处理。感觉应该编译成机器码时一样的,烧进去CPU译码过程才有差别吧。

出280入168汤圆

 楼主| 发表于 2021-3-16 13:41:19 | 显示全部楼层
huangqi412 发表于 2021-3-16 13:22
KEIL的编译器对所有厂家编译是一样的还是针对不同做了不同处理。感觉应该编译成机器码时一样的,烧进去CP ...

Keil 是单独做了处理的,所以选错了 MCU 型号会导致你写的代码死机,因为不同厂家的 MCU 时序不一样。

从理论上说微指令码应该是相同的,但 MCS-51 家族的指令码和硬件是深度耦合的,所以不同的 MCU 在相同的指令码上可能产生出不同的效果,因此用 Keil 来验证自己的结果是不可靠的。

你可以理解一下:在新植物育种过程中的 DNA 一定要找到原生的植株,而不是随便在市场上拿培育过的植株是一个道理的。

出615入1076汤圆

发表于 2021-3-16 13:51:02 来自手机 | 显示全部楼层
本帖最后由 dukelec 于 2021-3-16 13:55 编辑
chunjiu 发表于 2021-3-16 13:41
Keil 是单独做了处理的,所以选错了 MCU 型号会导致你写的代码死机,因为不同厂家的 MCU 时序不一样。

...


Keil 選錯型號死機是鏈接腳本不同導致死機,和 CPU 架構有毛關系啊。

出280入168汤圆

 楼主| 发表于 2021-3-16 13:59:17 | 显示全部楼层
dukelec 发表于 2021-3-16 13:51
MCU 有 微指令碼?!

Keil 選錯型號死機是鏈接腳本不同導致死機,和 CPU 架構有毛關系啊。 ...

将硬件电路对指令解码并处理的过程理解为 “执行微码” 是一样的,如果一定要严格定义的话在这儿讨论就不合适了,因为那需要到专业的 CPU 内核实现论坛上去探讨了。

对比一下不同厂家对 SFR 的定义,同一个地址编码上的功能是完全不同的,所以这在内核的电路译码架构上完全不一样的,这么说有歧义吗?

出0入0汤圆

发表于 2021-3-16 14:57:47 | 显示全部楼层
chunjiu 发表于 2021-3-16 13:41
Keil 是单独做了处理的,所以选错了 MCU 型号会导致你写的代码死机,因为不同厂家的 MCU 时序不一样。

...

这个就折腾了,对比ARM芯片,51不同厂家居然汇编对应的机器码还能不同,那反汇编器也必须相同的厂家才能反编译对。     

出280入168汤圆

 楼主| 发表于 2021-3-16 15:16:11 | 显示全部楼层
huangqi412 发表于 2021-3-16 14:57
这个就折腾了,对比ARM芯片,51不同厂家居然汇编对应的机器码还能不同,那反汇编器也必须相同的厂家才能反 ...

是的,因我以前没用过 51 ,所以刚开始不了解,结果导致第一次写的代码全部推翻重来。

出0入0汤圆

发表于 2021-3-16 17:08:18 来自手机 | 显示全部楼层
所有51体系的MCU指令都一样的,不同的是外设和指令周期,不同厂家不同型号对同一SFR地址有可能会安排不一样的外设和名称定义

出0入0汤圆

发表于 2021-3-16 17:28:48 来自手机 | 显示全部楼层
本帖最后由 oldban 于 2021-3-16 17:47 编辑

楼主毅力可嘉,不过理解不透彻就可能构思不出合理的软件架构,估计有得折腾

出280入168汤圆

 楼主| 发表于 2021-3-16 19:00:49 | 显示全部楼层
本帖最后由 chunjiu 于 2021-3-16 19:03 编辑
oldban 发表于 2021-3-16 17:28
楼主毅力可嘉,不过理解不透彻就可能构思不出合理的软件架构,估计有得折腾 ...


问题不太大,之前是因为不了解,现在资料收集齐了,也核对过了。刚才把外部中断功能做完了,正在开始做定时器部分。

比较麻烦的是现在的新电脑上没有标准串口了,我要买几个 USB 转串口的模块为下一步写模拟串口部分的代码做准备了。

PS:

还有不太会写 C51 的程序,刚开始学,不然没代码测试模拟出来的功能是否正确

出280入168汤圆

 楼主| 发表于 2021-3-18 16:07:20 | 显示全部楼层
基础定时器 0/1 部分完成,代码继续 ~ 冲 冲 冲 ....

对 定时器 2 的工作模式有点懵,看资料看得有点绕 ...

出280入168汤圆

 楼主| 发表于 2021-3-18 21:12:21 | 显示全部楼层
本帖最后由 chunjiu 于 2021-3-18 21:14 编辑

整体框架调试调整完毕,还剩下 定时器 2串口没完成。

因为 定时器 2 和串口波特率发生器有关联,但定时器 2 的工作模式我还没看懂 ...

下面是毛版效果,代码尚未优化,在 AMD 的 3900X 上当前的运行速度相当于 MCU 的主频是(单指令 NOP 相当于一个周期):



Rrelease
=======


14875 KHz
16042 KHz
16116 KHz
16209 KHz
16398 KHz
16341 KHz
16135 KHz
16111 KHz
16153 KHz
16176 KHz
16131 KHz
16245 KHz
16392 KHz
16371 KHz
16209 KHz
16325 KHz
16281 KHz
16380 KHz
16356 KHz
16358 KHz
16358 KHz
16362 KHz

Debug
========


2404 KHz
2612 KHz
2626 KHz
2614 KHz
2622 KHz
2621 KHz
2618 KHz
2618 KHz
2619 KHz
2619 KHz
2627 KHz
2629 KHz
2627 KHz
2627 KHz
2621 KHz
2623 KHz
2621 KHz

PS:补充 C51 的 DEMO 代码 :

  1. #include "at89c52.h"
  2. #include <stdio.h>

  3. long a = - 1234;
  4. unsigned long b = 0x178;

  5. char c1, c2, c3;
  6. void test_asm();
  7. // void e0_isr (void) __interrupt (0) __using (1);

  8. int main()
  9. {
  10.     /*
  11.     // 1. Init Serial Port
  12.     EA = 0;             // Enable global interrupt mask
  13.     SCON1 = 0x50;       // Set SCI_1 to 8N1, Rx enabled
  14.     TMOD |= 0x20;       // Set Timer 1 as Mode 2
  15.     TH1 = 0xDD;         // Set SCI_1 for 2400 baud
  16.     TR1 = 1;            // Enable Timer 1
  17.     ES1 = 1;            // Enable interrupts for SCI_1
  18.     EA = 1;             // Disable global interrupt mask
  19.    
  20.     */

  21.     EA = 0;
  22.    
  23.     TMOD |= 0x1;       // T0 mode = 1, T1 mode = 2
  24.    
  25.     TH0 = 0xfe;
  26.     TL0 = 0;

  27.     TH1 = 0x90;
  28.     TL1 = 0;
  29.    
  30.     TR0 = 1;
  31.     TR1 = 1;
  32.    
  33.     ET0 = 1;            //  enable timer 0
  34.     ET1 = 1;            //  enable timer 1
  35.    
  36.     EA = 1;

  37.     IT0 = 1;            //  edge


  38.    
  39.     long c;
  40.    
  41.     c = a+b;
  42.    
  43.     c1 = 0x20;
  44.     c2 = 0x88;
  45.    
  46.     c3 = c1 + c2;
  47.    
  48.     printf("Hello!");
  49.    
  50.     test_asm();
  51.    
  52.     while (c) {
  53.         c--;
  54.     };
  55.    
  56.     return c;
  57. }

  58. void test_asm() {
  59.     __asm__ ("add a, #78");
  60.     __asm__ ("add a, @r0");
  61.     __asm__ ("add a, @r1");
  62.     __asm__ ("add a, r0");
  63.     __asm__ ("add a, r1");
  64.     __asm__ ("add a, r3");
  65.     __asm__ ("add a, 8");
  66.     __asm__ ("add a, 9");
  67.     __asm__ ("add a, 10");
  68. }


  69. int putchar(int c) {
  70.     return ++c;
  71. }

  72. /*
  73.     “__interrupt” 关键字后面的可选编号是此例程将服务的中断编号。如果存在,编译器将在中断向量表中为指定的中断号插入对此例程的调用。
  74.     如果项目中有多个源文件,则任何一个中都可以存在中断服务程序,但是必须在包含main函数的文件中包含isr的原型。可选的(特定于8051的)
  75.     关键字 “__using”可用于告诉编译器在为此函数生成代码时使用指定的寄存器组。
  76.     中断服务程序为一些非常有趣的错误打开了大门:

  77.     如果中断服务程序是在没有____使用寄存器组或没有使用寄存器组0(____使用_0)的情况下定义的,则编译器将在进入时将自身使用的寄存器保存在堆栈中,并在退出时将其恢复,但是如果这样的中断服务程序调用 另一个功能,则整个寄存器库将保存在堆栈中。 对于具有低寄存器使用率的小型中断服务例程,该方案可能是有利的。

  78.     如果将中断服务程序定义为使用特定的寄存器组,则仅保存,恢复a,b,dptr和psw,如果这样的中断服务程序调用另一个函数(使用另一个寄存器组),则该寄存器的整个寄存器组 被调用的函数将被保存在堆栈中。 对于较大的中断服务程序,建议使用此方案。
  79. */
  80. void e0_isr (void) __interrupt (0) __using (1)
  81. {
  82.     printf("e0 !");
  83. }

  84. void e1_isr (void) __interrupt (2) __using (1)
  85. {
  86.     printf("e1 !");
  87. }

  88. void t0_isr (void) __interrupt (1) __using (1)
  89. {
  90.     printf("t0 !");
  91.     TH0 = 0xf4;

  92. }

  93. void t1_isr (void) __interrupt (3) __using (1)
  94. {
  95.     printf("t1 !");
  96. }
复制代码

出0入0汤圆

发表于 2021-3-24 11:17:00 | 显示全部楼层
不明觉厉。留名支持
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 01:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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