清霜一梦

基于FPGA的DW8051移植(三)

0
阅读(7666)

总结一下问题:

  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 这半个月岂不是白忙活了