裸机离奇事件:Freescale usb
ucosii
Freescale\KSDK_1.2.0\examples\twrk65f180m\demo_apps\usb\host\cdc\cdc_serial
{
1. usb 发送函数卡死,不能再重新进入该任务,app其他任务alive
2. usb 引发 hardware fault
3. usb 发送后没有发现正确的返回,但所有任务alive
}
---------------------------------------------------------------------------------------
static const unsigned char *ME909str_AT = "AT\r\n"; //AT查询模块是否正常工作 //xx NG
//static unsigned char *ME909str_AT = "AT\r\n"; //AT查询模块是否正常工作 //xx NG
void send_atcmd_sycle(void)
{
static unsigned char buf[256]={0};
static unsigned char* pbuf = buf;
static unsigned char s_data[] = {31, 32, 33, 34, 35, 0};
static int wait_time = 10;
#define CNT 10
static int cmdid = 0;
if(cmdid == 0) {
wait_time = 2000;
//pbuf = ME909str_AT; //1. 使用pbuf指向一个已有的全局const/non-const buffer,从usb没有收到Mc509模块的"OK"返回字符。跟踪usb的发送函数,看起来都是发出去了的。 原因未知。
strcpy(pbuf, s_data); // 使用strcpy靠摆到buf,再发送就没什么问题了。
cur_at_cmd_id = ME909_CMDI_AT;
}else if (cmdid == 8) {
wait_time = 2000;
//pbuf = s_data; //2. 使用pbuf指向静态buffer s_data,这个任务将不会再进来,推测是卡在usb发送了。 原因未知。
/*如果s_data申明为局部非静态,跟踪usb发送函数,完成发送后,会出现hardware fault。原因未知,一个说法是usb发送函数在底层另开了一个线程,所以传局部数组不行。
* 然而,buf申明为局部非静态却没有发现这个问题,解释是可能刚好这个内存没被其他线程用到,暂时未被占用因此可用。
*/
strcpy(pbuf, s_data); //使用strcpy靠摆到buf,再发送就没什么问题了。
cur_at_cmd_id = ME909_CMDI_IPSENDEX_DATA;
}
mc509_send_at_cmd(pbuf, strlen(pbuf)); //usb发送函数,正常情况下,这里发了AT指令到Mc509,在我的另一个task中usb会读到会有"OK"返回字符。
cmdid = (cmdid+1) % CNT;
msleep(wait_time);
}