裸机离奇事件:Freescale usb 有关fault

裸机离奇事件:Freescale usb
ucosii
FreescaleKSDK_1.2.0examples wrk65f180mdemo_appsusbhostcdccdc_serial

{
1. usb 发送函数卡死,不能再重新进入该任务,app其他任务alive
2. usb 引发 hardware fault
3. usb 发送后没有发现正确的返回,但所有任务alive
}
---------------------------------------------------------------------------------------

static const unsigned char *ME909str_AT = "AT "; //AT查询模块是否正常工作 //xx NG
//static unsigned char *ME909str_AT = "AT "; //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);
    
}

原文地址:https://www.cnblogs.com/mylinux/p/5893407.html