zoukankan      html  css  js  c++  java
  • 基于FPGA的DW8051移植(三)

      总结一下问题:

      1) http://www.cnblogs.com/sepeng/p/4137405.html  基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了idata区间初始化循环中跳转不出来,没有进入用户程序这一块。

      2) http://www.cnblogs.com/sepeng/p/4141072.html 基于FPGA的DW8051移植(二)里面将idata区间初始化去掉,程序进入了用户程序却发现在执行DelayMs 函数的时候,循环执行完毕,在最后跳转回主函数main的时候居然跳进了for循环。

    这一篇我将会去掉for循环再追查核的执行情况

     1 #include <reg51.h>
     2 #define uchar unsigned char 
     3 #define uint unsigned int 
     4 
     5 sbit LED = P0^0 ; 
     6 
     7 void DelayMS (uint x )
     8 {
     9     //uchar i ; 
    10     while (x--);
    11     //{
    12         //for (i=0;i<2;i++) ;
    13         
    14     //}
    15 }
    16 
    17 void main ()
    18 {
    19    LED = 1 ; 
    20    while (1) 
    21     {
    22      
    23         DelayMS(5);
    24         LED=~LED ;
    25     }
    26 }

    这一次的执行情况依据keilC里面的调试,执行地址顺序应该是

    00 01 02 --> 1B 1C 1D --> 1E 1F 20(头文件执行完成)

    -->(进入主函数) 03 04 --> 05 06 --> 07 08 --> 09 0A 0B(开始向子函数转跳

    -->(进入子函数)10 -->11 --> 12 13 --> 14 15 ()--> 17 --> 18 19 -->(跳回子函数循环

       10 .....(这里循环五次)

           --> (最后一次)10 --11 -->12 13 --> 14 15 --> 16 --> 17 --> 18 19 --> 1A(子函数执行完毕)

    --> (回到主函数) 0C 0D --> 0E 0F --> 05 06 --> 07 08 --> 09 0A 0B (向子函数跳转)

    --> ...............循环
      

      在modelsim中看到指令执行错误,上面红色字体的地方执行错误,错误方式就是每次多读了一个数据。

            正常 :09 0A 0B(开始向子函数转跳)   实际 : 09 0A 0B 0C 

                正常 : 14 15 ()                            实际 : 14 15 16

            正常 :18 19 -->(跳回子函数循环)    实际 : 18 19 1A

      这三个地方有一个共同的特点就是需要跳转。

      

      

      

      既然如此就第三次回避(第一次回避memory初始化loop,第二次回避for )修改C程序如下,回避子函数的转跳行为

     1 #include <reg51.h>
     2 
     3 sbit LED = P1^0 ; 
     4 
     5 
     6 void main ()
     7 {
     8    LED = 1 ; 
     9 
    10    while (1) 
    11         LED=~LED ;
    12 
    13 }

     可是这主函数main里面必须要有一个循环啊,所以loop还是无法避免,最终的地址跳转为

    00 01 02 --> 03 04 05  --> 06 07 08  (初始化运行完毕)

    (进入主函数)09 0A --> 0B 0C --> 0D 0E (主函数运行完毕) 

    (循环)0B 0C --> 0D 0E (循环) 

    从modelsim中看到这个核运行的情况是 

    每次跳转的前一个时刻0D 0E 都执行成0D 0E 0F 。就是多执行了一条语句,语句地址0F

    在让我们看看我关心已久的sfr

    前面的01 81 00 我真是醉了,81可是P0^1啊,无法解释,后面的90 倒是符合期望,问题又来了,这个data_out 怎么又不听话了呢?

    抓狂,核你到底怎么了

      下午仔细的去看datasheet,发现在Application Software Compatibility 这一章节里面有这么一句话: However, becausethe DW8051 usesa different instruction timing than the standard 8051, code with timing loops may require modification.

      新思你丫的到底是个什么意思,出现了timing loop 就需要修改代码,但是没有说如何修改。我的所有的程序中都有循环,难道意思就是说应用程序中有了loop就有问题吗,如果是这样那岂不是在代码中故意埋了个地雷

      mmd 这半个月岂不是白忙活了

  • 相关阅读:
    Daily Scrum 12.9
    成员总结
    反省与深思
    M1事后分析报告--We have power to change the origin state
    PowerTeam--Alpha阶段个人贡献分及转会人员
    Pipeline Alpha版本项目展示
    js 字符串操作函数
    js与jq对数组的操作
    js 与 jq 的节点添加删除实例
    js,jq,css选择器
  • 原文地址:https://www.cnblogs.com/sepeng/p/4143483.html
Copyright © 2011-2022 走看看