裸机离奇事件:Freescale usb
ucosiiFreescale\KSDK_1.2.0\examples\twrk65f180m\demo_apps\usb\host\cdc\cdc_serial{ 1. usb 发送函数卡死,不能再重新进入该任务,app其他任务alive2. 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 NGvoid 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); }