阅读:1319回复:6
EZ-USB中固件程序任务分发的一点小问题
在Cypress给的C51固件框架代码中,函数TD_Poll是用来进行任务分发的,可是,在TD_Poll中如果用一个死循环的话,固件将无法回应上位机的Setup命令。 我在一本书上也看到这样的说法:如果需要大量的处理时间,EZ-USB会通过多次调用TD_Poll将时间分段。我不明白这句话的含义。请各位大侠指点一二,先行谢过。
:( :( :( |
|
最新喜欢:sunmac...
|
沙发#
发布于:2003-09-22 11:38
我连你说的都没明白啊! :(
|
|
板凳#
发布于:2003-09-22 11:49
在Cypress给的C51固件框架代码中,函数TD_Poll是用来进行任务分发的,可是,在TD_Poll中如果用一个死循环的话,固件将无法回应上位机的Setup命令。 我在一本书上也看到这样的说法:如果需要大量的处理时间,EZ-USB会通过多次调用TD_Poll将时间分段。我不明白这句话的含义。请各位大侠指点一二,先行谢过。 不会呀,ez-usb的死循环里是通过查询来判断是否有setup命令来的,我用的是ez-usb fx2,相关代码是: if(GotSUD) // Wait for SUDAV { SetupCommand(); // Implement setup command GotSUD = FALSE; // Clear SUDAV flag } 那句话的意思是说,如果你一次要进行的数据传输比较多,比如是64k,那么在这段时间里即使收到setup命令,因为程序没有运行到SetupCommand();函数,因此也就无法处理,如果超时的话这次setup就会以nak终结! 所以他们就建议多次调用td_poll,,例如,如果你在td_poll函数里只写2k的数据,那么就需要调用32次,代码如下,仅作参考: for(int i = 0; i < 32; i++) { if(GotSUD) // Wait for SUDAV { SetupCommand(); // Implement setup command GotSUD = FALSE; // Clear SUDAV flag } Td_Poll(); } 这样就能及时相应setup请求了,如果还不行,那每次传输的数据就在少一些,比如512自己等等,你可以自己尝试 不知道我说明白了没有,希望对你有所帮助! |
|
地板#
发布于:2003-09-22 15:09
谢谢jinghuiren前辈的教导,你的意思我完全明白了。
但是如果我在TD_Poll里必须执行一项无法分解的长耗时的任务,可以吗?那个时候的Setup命令是不是都是以nak返回?还是可以等到耗时任务完成再处理? :P |
|
|
地下室#
发布于:2003-10-10 13:56
有个例子bulkloop,TD――POLL中,CPU一直在参加数据传输吧?
|
|
|
5楼#
发布于:2003-10-10 14:51
谢谢jinghuiren前辈的教导,你的意思我完全明白了。 返回nak是硬件自己的事情,不需要你来参与的,如果你耗时任务花费的时间超过了一个控制传输的完成的最大时间的话,那么这个setup会以失败终结的。一般没有数据阶段的控制传输最大时间是50ms吧,如果有数据的话按照协议规定来算。因此建议把任务分开比较好。 |
|
6楼#
发布于:2003-10-10 14:52
有个例子bulkloop,TD――POLL中,CPU一直在参加数据传输吧? 对头! |
|