嵌入式C与RTOS调试到SD卡卡住了

时间:2012-05-01 09:15:34

标签: c embedded rtos micrium

我正在使用RX62N R5F562N8BDFP(如果我很好地读取小芯片)。

我也在芯片上使用Micrium RTOS。

所以我使用的代码是读取SystemSettings,如果SystemSettings可用则调试。

如果micro-SD卡上没有SystemSettings,它会自行写入。

奇怪的是,当我评论调试部分时,它始终有效。今天早上我没有评论它并且它有效。一旦。之后,它只是不起作用,它只写一个调试文件的一部分。 :/

这是我正在使用的代码,希望有人知道可能导致这种不稳定代码的原因。

可能部分不完整,但这就是它的作用。另一项任务(代码未发布)在消息堆栈上为此任务发布消息。

此任务读取并解密并执行操作。

这是很多代码,希望一切都很清楚..

//This creates the task.    
    OSTaskCreate((OS_TCB     *) SpreaderSDTCB,    
                 (CPU_CHAR   *)"SpreaderSD",    
                 (OS_TASK_PTR ) SpreaderSD,    
                 (void       *) spreadersd,    
                 (OS_PRIO     ) 1u,    
                 (CPU_STK    *) SpreaderSDStk,    
                 (CPU_STK_SIZE) 300u / 10u,    
                 (CPU_STK_SIZE) 300u,
                 (OS_MSG_QTY  ) 10u,    
                 (OS_TICK     ) 0u,    
                 (void       *) 0,    
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),    
                 (OS_ERR     *)&err);    

//Task    
void  SpreaderSD (void *p_arg) {    
    OS_ERR      err;    
    OS_MSG_SIZE        msg_size;     
    CPU_INT32U temp;    

    //LL * list = DEF_NULL;    

    struct SpreaderSD *spreadersd = p_arg;       
    struct MessageHeader *message;    
    struct PatternMessage pMessage;    
    struct SystemSettingsMessage ssMessage;     


    if(App_FS_Init() == DEF_OK)    
    {                  
        Debug_LOG("Spreader %d: SD init successful", spreadersd->SpreaderNumber);        
    }    
    else    
    {    
        BSP_GraphLCD_ClrLine(4);   
        BSP_GraphLCD_StringPos(4, 0, "FS Init gaat mis");      
    }

    while(DEF_ON)    
    {    
        message = OSTaskQPend(0, OS_OPT_PEND_BLOCKING, &msg_size, 0, &err);       
        switch(message->message)    
        {    
            case SPREADERSD_CMD_GET_SYSTEM_SETTINGS:    
                ReadSettingsFile(&(spreadersd->SystemSettings), spreadersd->SpreaderNumber);      
                ssMessage.FROM = spreadersd->ID;    
                ssMessage.TO = message->FROM;    
                ssMessage.MessageType = SPREADERSD_SYSTEMSETTINGSMESSAGE;    
                ssMessage.message = SPREADERSD_REQ_GET_SYSTEM_SETTINGS;    
                ssMessage.SystemSettings = spreadersd->SystemSettings;    
                sendMessage(&ssMessage, sizeof(struct SystemSettingsMessage));    
                //Debug_LOG("Send SystemSettings from SpreaderSD ID %d to ID %d", spreadersd->SpreaderNumber, message->FROM);    
                break;               

            case SPREADERSD_CMD_READ_SYSTEM_SETTINGS:    
                //ReadSettingsFile(&(spreadersd->SystemSettings), spreadersd->SpreaderNumber);  
                break;

            case SPREADERSD_CMD_WRITE_SYSTEM_SETTINGS:    
            {    
                struct SystemSettingsMessage *ssMsg;    
                ssMsg = (struct SystemSettingsMessage*)message;    
                spreadersd->SystemSettings = ssMsg->SystemSettings;    
                WriteSettingsFile(&(spreadersd->SystemSettings), spreadersd->SpreaderNumber);
            }    
                break;

            case SPREADERSD_CMD_GET_PATTERN:   
                break;

            case SPREADERSD_CMD_WRITE_PATTERN:  
                break;

            default:    
                break;    
        }       
    }     
}

//Reading the SystemSettings    
CPU_INT08U ReadSettingsFile(SETTINGS *SystemSettings, CPU_INT16U ID)    
{    
    FS_FILE *file;    
    CPU_INT08U read;    
    OS_ERR err;    

    file = fs_fopen("\\settings.bin", "r");

    if(file != DEF_NULL) //If file exists
    {    
        read = fs_fread(SystemSettings, sizeof(CPU_INT16U), (sizeof(SETTINGS) / sizeof(CPU_INT16U)), file);    
        fs_fclose(file);  
        if(read == (sizeof(SETTINGS) / sizeof(CPU_INT16U))) //number of items read, should be 9. 18 bytes in total    
            Debug_LOG("Spreader %d: Read SystemSettings successful", ID);    
        else    
            Error_LOG("Spreader %d: Opened system settings, but reading failed", ID);           
    }    
    else    
    { 
        Debug_LOG("Spreader %d: Cant open settings.bin, will use standard settings", ID);

        SystemSettings->AlphaOffset             = 0;    
        SystemSettings->BetaOffset                 = 0;    
        SystemSettings->CANRXCommandAddress     = (0x0010 + 20);    
        SystemSettings->CANTXCommandAddress     = (0x0060 + 20);    
        SystemSettings->CANRXDataAddress         = (0x0110 + 20);    
        SystemSettings->CANTXDataAddress         = (0x0160 + 20);    
        SystemSettings->InitSide                 = 0;    
        SystemSettings->AlphaMicrostepfactor     = 32;
        SystemSettings->BetaMicrostepfactor     = 32;

        WriteSettingsFile(SystemSettings, ID);   
    }   
}

//Write SystemSettings to settings.bin    
CPU_INT08U WriteSettingsFile(SETTINGS *SystemSettings, CPU_INT16U ID)    
{       
    FS_FILE *file;    
    CPU_INT08U write;     

    file = fs_fopen("\\settings.bin", "w"); //write / create mode    
    if(file != DEF_NULL)    
    {    
        write = fs_fwrite(SystemSettings, sizeof(CPU_INT16U), (sizeof(SETTINGS) / sizeof(CPU_INT16U)), file);    
        fs_fclose(file);    
        if(write == (sizeof(SETTINGS) / sizeof(CPU_INT16U))){    
            Debug_LOG("Spreader %d: settings.bin written successful", ID);      
        }     
        else{    
             Error_LOG("Spreader %d: Opened settings.bin but writing failed", ID);    
        }    
    }    
    else    
        Error_LOG("Cant write settings.bin");      
} 

/////////LOGGING methods (not in a task)

//Debug to SD card, works like printf()    
void Debug_LOG(const char* text, ...)    
{
    FS_FILE *file;    
    fs_size_t filesWritten = 0;    
    CPU_CHAR *timedate;    
    CPU_CHAR *temp;       
    va_list args;

    file = fs_fopen("\\debug.txt", "a"); //append mode

    if(file != DEF_NULL) //check if file pointer not is null    
    {       
        va_start( args, text );    
        vsprintf( temp, text, args );    
        va_end( args );  

        timedate = malloc((26 + strlen(text) + strlen("\r\n")) * sizeof(CPU_CHAR));

        //timedate = malloc((24) * sizeof(CPU_CHAR));

        if(timedate != DEF_NULL){ //If enough memory available    
            RTC_ReadTime(timedate); 
            strcat(timedate, temp); //append text to timedate    
            strcat(timedate, "\r\n"); //append a newline to timedate+text    
            //memcpy(timedate, temp, sizeof(temp));    
            //memcpy(timedate, "\r\n", sizeof("\r\n");
            filesWritten = fs_fwrite(timedate, sizeof(CPU_CHAR), strlen(timedate), file); //debug write length     
            if(filesWritten != (sizeof(CPU_CHAR) * strlen(timedate))) //check if writen files in fs_fwrite is equal to how many octets should have been written
                Error_LOG("Debugging of %s failed", timedate);

            free(timedate);

        }   
        else{    
            BSP_GraphLCD_ClrLine(6);     
            BSP_GraphLCD_StringPos(6, 0, "Pointer == null");      
        }    
        fs_fclose(file);    
    }    
    else    
    {
        BSP_GraphLCD_ClrLine(6);     
        BSP_GraphLCD_StringPos(6, 0, "File == null");    
    }       
}

//Error log to SD card, works like printf()    
void Error_LOG(const char* text, ...)    
{           
    FS_FILE *file;    
    fs_size_t filesWritten = 0;    
    CPU_CHAR *timedate;    
    CPU_CHAR *temp;       
    va_list args;

    file = fs_fopen("\\error.txt", "a");

    if(file != DEF_NULL) //check if file pointer not is null    
    {           
        va_start( args, text );    
        vsprintf( temp, text, args );    
        va_end( args );        

        timedate = malloc((26 + strlen(text) + strlen("\r\n")) * sizeof(CPU_CHAR));

        //timedate = malloc((24) * sizeof(CPU_CHAR));

        if(timedate != DEF_NULL){ //If enough memory available    
            RTC_ReadTime(timedate);     
            strcat(timedate, temp); //append text to timedate    
            strcat(timedate, "\r\n"); //append a newline to timedate+text
            filesWritten = fs_fwrite(timedate, sizeof(CPU_CHAR), strlen(timedate), file); //debug write length     
            if(filesWritten != (sizeof(CPU_CHAR) * strlen(timedate))) //check if writen files in fs_fwrite is equal to how many octets should have been written
                Error_LOG("Error log of %s failed", timedate);

            free(timedate);    
        }     
        else{    
            BSP_GraphLCD_ClrLine(6);    
            BSP_GraphLCD_StringPos(6, 0, "Pointer == null");    
        }    
        fs_fclose(file);     
    }    
    else    
    {    
        BSP_GraphLCD_ClrLine(6);    
        BSP_GraphLCD_StringPos(6, 0, "File == null");     
    }       
}

编辑(wildplasser评论): 我已经更改了一些遵循wildplassers指令的代码,尽管它仍然不起作用:/ 这是更新的代码,因此您有更好的主意。顺便说一下,我在log.c类中全局声明了init_LOG()中使用的变量(其中Debug_LOG和Error_LOG是)。

void  SpreaderSD (void *p_arg) {
    OS_ERR      err;
    OS_MSG_SIZE     msg_size;   

    CPU_INT32U temp;

    //LL * list = DEF_NULL;

    struct SpreaderSD *spreadersd = p_arg;  

    struct MessageHeader *message;
    struct PatternMessage pMessage;
    struct SystemSettingsMessage ssMessage;

    //LOG_MutexCreate();

    /*message = allocateMemory(sizeof(struct MessageHeader));
    if(message == DEF_NULL){
        BSP_GraphLCD_ClrLine(5);
        BSP_GraphLCD_StringPos(5, 0, "Message null pointer");
    }*/

    if(init_LOG()){
        BSP_GraphLCD_ClrLine(4);        
        BSP_GraphLCD_StringPos(4, 0, "LOG init ok");
    }

    if(App_FS_Init() == DEF_OK)
    {
        //Delete();
        Debug_LOG("Spreader %d: SD init successful", spreadersd->SpreaderNumber);       
    }
    else
    {
        BSP_GraphLCD_ClrLine(4);        
        BSP_GraphLCD_StringPos(4, 0, "FS Init gaat mis");   
    }
    /*
    CPU_INT32U i;
    for(i=0;i<10;i++)
    {
        addLL(&list, i, i);
    }
    */
    //RTC_SetTime(0x00, 0x56, 0x09, 0x01, 0x23, 0x04, 0x2012);

    //ReadSettingsFile(&(spreadersd->SystemSettings), spreadersd->SpreaderNumber);
    //WriteSettingsFile(&(spreadersd->SystemSettings));


    while(DEF_ON)
    {           
        message = OSTaskQPend(0, OS_OPT_PEND_BLOCKING, &msg_size, 0, &err); 
        switch(message->message)
        {
            case SPREADERSD_CMD_GET_SYSTEM_SETTINGS:    
                ReadSettingsFile(&(spreadersd->SystemSettings), spreadersd->SpreaderNumber);        
                ssMessage.FROM = spreadersd->ID;
                ssMessage.TO = message->FROM;
                ssMessage.MessageType = SPREADERSD_SYSTEMSETTINGSMESSAGE;
                ssMessage.message = SPREADERSD_REQ_GET_SYSTEM_SETTINGS;
                ssMessage.SystemSettings = spreadersd->SystemSettings;
                sendMessage(&ssMessage, sizeof(struct SystemSettingsMessage));
                //Debug_LOG("Send SystemSettings from SpreaderSD ID %d to ID %d", spreadersd->SpreaderNumber, message->FROM);
                break;              
            case SPREADERSD_CMD_READ_SYSTEM_SETTINGS:
                //ReadSettingsFile(&(spreadersd->SystemSettings), spreadersd->SpreaderNumber);              
                break;
            case SPREADERSD_CMD_WRITE_SYSTEM_SETTINGS:
            {
                struct SystemSettingsMessage *ssMsg;
                ssMsg = (struct SystemSettingsMessage*)message;
                spreadersd->SystemSettings = ssMsg->SystemSettings;         
                WriteSettingsFile(&(spreadersd->SystemSettings), spreadersd->SpreaderNumber);
            }
                break;
            case SPREADERSD_CMD_GET_PATTERN:                
                break;
            case SPREADERSD_CMD_WRITE_PATTERN:
                break;
            default:
                break;
        }   
    }   
}

CPU_BOOLEAN init_LOG()
{
Dtimedate = malloc(100 * sizeof(CPU_CHAR));
if(Dtimedate == DEF_NULL)
    return DEF_FALSE;

Dtemp = malloc(100 * sizeof(CPU_CHAR));
if(Dtemp == DEF_NULL)
    return DEF_FALSE;

Etimedate = malloc(100 * sizeof(CPU_CHAR));
if(Etimedate == DEF_NULL)
    return DEF_FALSE;

Etemp = malloc(100 * sizeof(CPU_CHAR));
if(Etemp == DEF_NULL)
    return DEF_FALSE;

return DEF_TRUE;
}


//Debug to SD card, works like printf()
//Aanpassen..
void Debug_LOG(const char* text, ...)
{

    FS_FILE *file;
    fs_size_t filesWritten = 0;
    va_list args;
    CPU_INT16U print = 0;  

    file = fs_fopen("\\debug.txt", "a"); //append mode

    if(file != DEF_NULL) //check if file pointer not is null        
    {   
        va_start( args, text );
        print = vsnprintf( Dtemp, (strlen(text) + 1), text, args );
        va_end( args );     

        if(print == (strlen(text) + 1)){
            BSP_GraphLCD_ClrLine(5);        
            BSP_GraphLCD_StringPos(5, 0, "vsnprintf OK");
        }

            RTC_ReadTime(Dtimedate);        

            strcat(Dtimedate, text); //append text to timedate
            strcat(Dtimedate, "\r\n"); //append a newline to timedate+text

            filesWritten = fs_fwrite(Dtimedate, sizeof(CPU_CHAR), strlen(Dtimedate), file); //debug write length                
            if(filesWritten != (sizeof(CPU_CHAR) * strlen(Dtimedate))) //check if writen files in fs_fwrite is equal to how many octets should have been written
                Error_LOG("Debugging of %s failed", Dtimedate);

        fs_fclose(file);
    }
    else
    {
        BSP_GraphLCD_ClrLine(6);        
        BSP_GraphLCD_StringPos(6, 0, "File == null");           
    }       

}

0 个答案:

没有答案