Встроенный C с отладкой RTOS на SD-карте застрял
Я использую RX62N R5F562N8BDFP (если я читаю маленький чип хорошо).
Также я использую Micrium RTOS на чипе.
Таким образом, код, который я использовал, читает SystemSettings и отлаживает, если SystemSettings доступны или нет.
Если SystemSettings отсутствует на карте micro-SD, он запишет их сам.
Странно то, что когда я комментирую часть "Отладка", она всегда работает. Этим утром я не прокомментировал это, и это сработало. один раз. После этого он просто больше не работает, он только записывает часть файла отладки.:/
Это код, который я использую, надеюсь, у кого-то есть идея, что может вызвать этот нестабильный код.
Это может быть частично неполным, но это то, что он делает. Другая задача (код не опубликован) отправляет сообщение в стек сообщений для этой задачи.
Эта задача читает его, расшифровывает и выполняет действие.
Это довольно много кода, и, надеюсь, все ясно..
//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, хотя он все еще не работает: / Вот обновленный код, так что у вас есть лучшая идея. Кстати, я объявил переменные, используемые в init_LOG() глобально в классе log.c (где находятся 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");
}
}