usb中断是否不允许写flash

 今天发现之前的之前工程师遗留的问题,他在usb中断的时候调用了写flash,这样会容易出错是吗?正常情况下,中断函数是不运行操作flash的。因为写flash会进入安全模式,安全模式一般会关闭总中断。想和原厂确认一下,是否usb中断不能操作flash。谢谢



case UIS_TOKEN_OUT | 4:       

if( U_TOG_OK )

{

len = USB_RX_LEN;

UEP0_CTRL ^= bUEP_R_TOG;/* ·?×? */

UEP0_CTRL = UEP0_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_NAK;  

//state = 1;


//if(Ep0Buffer[64] == 0x05 && Ep0Buffer[65] == 0x01 && Ep0Buffer[66] == 0x01 && Ep0Buffer[67] == 0x00 && Ep0Buffer[68] == 0x08 && Ep0Buffer[69] == 0x05){

//state = 2;

//}else{

//state = 1;

//}

//if(Ep0Buffer[65] == 0x01){

//state = 2;

//}

if(Ep0Buffer[65] == 0x01){

memset(HIDData1,0,sizeof(HIDData1));//°?HIDData1??0

memcpy(HIDData1, &Ep0Buffer[66], Ep0Buffer[64] - 1);

WriteDataFlash(0, &HIDData1, sizeof(HIDData1));

}


1、安全模式需要关闭总中断,这个不是强制的,只是安全模式有效时间较短,如果有中断可能会导致安全模式有效时间被中断消耗掉,导致目标操作超时,变成无效操作。


2、芯片可以在任何时候进行FLASH的操作。

image.png

但是操作FLASH的代价是芯片(CPU)会“停止”,代码、交互逻辑要足够健壮,确保芯片在进入这种暂停状态之前所有的通讯都处于期望状态。

举个例子:

1、芯片作为USB设备,在写FLASH之前应当将所有使用到的Endpoint的应答状态改成NAK,这样即使芯片暂停运行,也不会有USB事务能够被完成,从USB主机的视角来看,设备是正常的,否则可能会有非期望的数据被传输。

2、串口通讯,芯片要操作FLASH之前应当告知串口通讯的对象,自身即将处于无响应的状态,这个时候不要发送数据,直到芯片写FLASH结束,通知串口通讯对象,自身已经退出无响应状态,再继续双向的数据交互。



只有登录才能回复,可以选择微信账号登录