chunjiu 发表于 2021-3-26 08:40:04

B52 (BigSam-8052 模拟器) 源码在 Debug 的时候 BUG 满天飞

本帖最后由 chunjiu 于 2021-3-26 09:58 编辑

当然这是意料之中的事情,要做到物理上的时序同步,有好多细节在之前写代码时没有注意到,例如:

1、串口 SBUF 的两次写入问题,即第一个还没有发送完,就写入了第二个数据,导致发送混乱。

处理方案是在第一个字节数据没发送完时,第二个写入的数据会被直接抛弃,B52 给出一个警告提示。

2、串口接收中,用户的代码忽然清除了 REN 位,或设置了 RI,导致不可预知的歧义。

处理方案是立即停止接收并清除缓冲后进入闲置,等 REN 和 RI 信号重新归位。这里假设是用户想主动中止接收操作,但 B52 会发出一个警告提示。

3、对串口模式 0 的时序进行了纠正,原先的设计是将同步信号发出后,就假设数据已经准备好,立即进行读取操作。但这和标准的 8052 不一样,若外设来不及准备好就会收到错误数据。

处理方案是将一个“读取/发送”周期拆分成前后半周,前半周修改同步信号,后半周“读取/发送”数据位,与标准的 8052 保持了正确的兼容。

4、将单个的密集型运算任务做了拆分,即本来的单线程代码运行流程改成 “假的多线程” ,一个大任务被拆分成几个小任务,在循环调度中依次执行(状态机)。

这么做的好处是对每个系统周期内的运算量做了均衡,因为单个密集型运算任务是提高 B52 系统主频的瓶颈,拆分均衡后有望在 STM32 上得到更高的模拟主频。

5、然后在删除大量冗余代码和美化排版时,搞乱了代码间的依赖关系,导致编译老出错。

这个没办法,慢慢找,慢慢改。 {:lol:}

mowin 发表于 2021-3-26 08:42:47

前排观望,不明觉厉

canspider 发表于 2021-3-26 10:54:40

本帖最后由 canspider 于 2021-3-26 10:57 编辑

老51是固定指令周期,新的cortex指令周期随条件变化,如果老51代码用指令周期来做延时,新的cortex怎么来处理这这类情况
还有中断处理,老51进入中断时间是可控的,新cortex怎么来应对
比如有的51程序做上升沿检测,通过计算得出上升沿到中断要4个指令周期,这样在中断中补偿这4个指令周期就行了,如果这样的程序移植到你这个上面,还能正常工作吗?

chunjiu 发表于 2021-3-26 11:15:31

本帖最后由 chunjiu 于 2021-3-26 11:24 编辑

canspider 发表于 2021-3-26 10:54
老51是固定指令周期,新的cortex指令周期随条件变化,如果老51代码用指令周期来做延时,新的cortex怎么来处 ...

B52 模拟器的 ALU 部分早就完成了,只要不涉及到硬件时序上的操作就可以完美运行用户程序。

目前对代码进行修正的也正是硬件时序上问题,暂时改用 “硬件滴答令牌” 的方式,对指令周期和中断响应采用了状态机的处理方式。

只要时钟周期和时序的部分修正完成了,应该会和真实的 8052 一样完美,指令的延时计算和中断响应时间不会出现误差。

PS:

真的会等待像你比喻的那样:实时的、物理性的 4 个指令周期时间。

chunjiu 发表于 2021-3-26 17:27:12

终于编译成功了,不过添加了滴答令牌之后,运行效率下降了 30% 多 {:lol:} !

现在继续除 bug,代码调整后还有些冗余部分没找到,不过下周应该能整理完。
页: [1]
查看完整版本: B52 (BigSam-8052 模拟器) 源码在 Debug 的时候 BUG 满天飞