清霜一梦

基于FPGA的DW8051移植(三)

0
阅读(6442)

总结一下问题:

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


Baidu
map