我正在使用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");
}
}