Hi everybody. I’m experiencing a really extrange behavior (for which I have a workround) but I will like to understand it because I must be missing somthing.
I have a cJSON struct called Config to store all my config parms. I declare, and initialize it in my main.c file. I’ve read that to use safely in a multitask enviroment I have to use a Semaphore so I also declare an initialize it in main.
The I use the mqqt_example.c file. In that file I declare Config an ConfigMutex as extern.
extern cJSON *Config;
extern SemaphoreHandle_t ConfigMutex;
I’ve created a “safe_get” function to handle the semaphore
char *safe_get(char *nombre)
{
xSemaphoreTake(ConfigMutex, portMAX_DELAY);
cJSON *caItem = cJSON_GetObjectItem(Config, nombre);if (caItem) {
printf(“Getting %s \n”,nombre);
if (DEBUG)
printf(“DEBUG: %s: .%s. \n”, nombre, caItem->valuestring);
}
else
{
printf(“%s: Not found\n”, nombre);
xSemaphoreGive(ConfigMutex);
return NULL;
}
return caItem->valuestring;
xSemaphoreGive(ConfigMutex);
}
well, here comes the extrange thing . If I use this:
connectData.username.cstring = safe_get(“MQTT_USER”);
All my debug printf are correct, but user sent to MQTT server is incorrect.
but, if I do this instead:
char user_name[30];
char *tmptxt=safe_get(MQTT_USER);
sprintf(user_name,%s,tmptxt);|
connectData.username.cstring = user_name;
It works
can someone explain whats the difference??
Thx!!!