FreeRTOS scheduler from 100 Hz to 200 Hz. All units data is now protected with a semaphore.

Tue, 08 Oct 2019 21:09:36 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Tue, 08 Oct 2019 21:09:36 +0200
changeset 4
2a57c466bf45
parent 3
cd760fd45271
child 5
4b1c65e4d863

FreeRTOS scheduler from 100 Hz to 200 Hz. All units data is now protected with a semaphore.

main/co2meter.c file | annotate | diff | comparison | revisions
main/config.c file | annotate | diff | comparison | revisions
main/task_mqtt.c file | annotate | diff | comparison | revisions
sdkconfig file | annotate | diff | comparison | revisions
--- a/main/co2meter.c	Tue Oct 08 16:51:30 2019 +0200
+++ b/main/co2meter.c	Tue Oct 08 21:09:36 2019 +0200
@@ -30,9 +30,10 @@
 static TaskHandle_t			xTaskWifi = NULL;
 static TaskHandle_t			xTaskMQTT = NULL;
 const esp_app_desc_t			*app_desc = NULL;
-unit_t					units[3];			///< Pressure test units
 
 
+extern unit_t				units[3];			///< Pressure test units
+extern SemaphoreHandle_t		xSemaphoreUnits;		///< Units lock semaphore
 extern DS18B20_State            	*ds18b20_state;         	///< DS18B20 state
 extern SemaphoreHandle_t        	xSemaphoreDS18B20;      	///< DS18B20 lock semaphore
 extern ADC_State                	*adc_state;             	///< ADC state
@@ -203,6 +204,7 @@
 
     xSemaphoreDS18B20 = xSemaphoreCreateMutex();
     xSemaphoreADC = xSemaphoreCreateMutex();
+    xSemaphoreUnits = xSemaphoreCreateMutex();
 
     xTaskCreate(&task_ds18b20, "task_ds18b20",  2560, NULL, 8, &xTaskDS18B20);
     xTaskCreate(&task_adc,     "task_adc",      2560, NULL, 8, &xTaskADC);
@@ -291,28 +293,31 @@
     			}
 
 			/* Copy measured data and calculate results */
-			for (int i = 0; i < 3; i++) {
-			    units[i].temperature = temp;
-			    units[i].temperature_state = state;
-			    strncpy(units[i].temperature_rom_code, rom_code, strlen(rom_code));
-			    if (xSemaphoreTake(xSemaphoreADC, 10) == pdTRUE) {
-				units[i].pressure_state = adc_state->Pressure[i].error;
-				units[i].pressure_channel = adc_state->Pressure[i].channel;
-				units[i].pressure_voltage = adc_state->Pressure[i].voltage;
-				units[i].pressure_zero = 110;
-				int P = (units[i].pressure_voltage / (adc_state->Batt_voltage / 1000) - units[i].pressure_zero) * 14; // in bar
-				if (P < 0)
-				    P = 0;
-				units[i].pressure = P;
+			if (xSemaphoreTake(xSemaphoreUnits, 25) == pdTRUE) {
+			    for (int i = 0; i < 3; i++) {
+			    	units[i].temperature = temp;
+			    	units[i].temperature_state = state;
+			    	strncpy(units[i].temperature_rom_code, rom_code, 17);
+			    	if (xSemaphoreTake(xSemaphoreADC, 10) == pdTRUE) {
+				    units[i].pressure_state = adc_state->Pressure[i].error;
+				    units[i].pressure_channel = adc_state->Pressure[i].channel;
+				    units[i].pressure_voltage = adc_state->Pressure[i].voltage;
+				    units[i].pressure_zero = 110;
+				    int P = (units[i].pressure_voltage / (adc_state->Batt_voltage / 1000) - units[i].pressure_zero) * 14; // in bar
+				    if (P < 0)
+				    	P = 0;
+				    units[i].pressure = P;
 printf("%d volt: %d batt: %d scale: %d  bar: %d\n", i, units[i].pressure_voltage, adc_state->Batt_voltage, 
 		units[i].pressure_voltage / (adc_state->Batt_voltage / 1000) - units[i].pressure_zero, P);
 // Moet die echt op 5 volt?
 // Verbruik 10 mA
 // Setup tijd max 2 mS
-				xSemaphoreGive(xSemaphoreADC);
+				    xSemaphoreGive(xSemaphoreADC);
+			    	}
 			    }
+			    write_units();
+			    xSemaphoreGive(xSemaphoreUnits);
 			}
-			write_units();
 		    }
 		    break;
 
--- a/main/config.c	Tue Oct 08 16:51:30 2019 +0200
+++ b/main/config.c	Tue Oct 08 21:09:36 2019 +0200
@@ -7,7 +7,9 @@
 
 static const char *TAG = "config";
 
-extern unit_t		units[3];
+unit_t				units[3];                       ///< Pressure test units
+SemaphoreHandle_t		xSemaphoreUnits = NULL;		///< Semaphore Units records
+
 
 
 void write_config() {
--- a/main/task_mqtt.c	Tue Oct 08 16:51:30 2019 +0200
+++ b/main/task_mqtt.c	Tue Oct 08 21:09:36 2019 +0200
@@ -30,6 +30,8 @@
 extern SemaphoreHandle_t	xSemaphoreWiFi;		///< WiFi lock semaphore
 
 extern unit_t			units[3];
+extern SemaphoreHandle_t	xSemaphoreUnits;
+
 extern const esp_app_desc_t	*app_desc;
 
 
@@ -99,38 +101,41 @@
     char	*payload = NULL;
     char        buf[128];
 
-    payload = xstrcpy((char *)"{\"uuid\":\"");
-    payload = xstrcat(payload, units[i].uuid);
-    payload = xstrcat(payload, (char *)"\",\"alias\":\"");
-    payload = xstrcat(payload, units[i].alias);
+    if (xSemaphoreTake(xSemaphoreUnits, 25) == pdTRUE) {
+    	payload = xstrcpy((char *)"{\"uuid\":\"");
+    	payload = xstrcat(payload, units[i].uuid);
+    	payload = xstrcat(payload, (char *)"\",\"alias\":\"");
+    	payload = xstrcat(payload, units[i].alias);
 
-    // temperature_state temperature_address temperature
-    payload = xstrcat(payload, (char *)"\",\"temperature\":{\"state\":\"");
-    payload = xstrcat(payload, (char *)sensState[units[i].temperature_state]);
-    payload = xstrcat(payload, (char *)"\",\"address\":\"");
-    payload = xstrcat(payload, (char *)units[i].temperature_rom_code);
-    payload = xstrcat(payload, (char *)"\",\"temperature\":");
-    sprintf(buf, "%.3f", units[i].temperature / 1000.0);
-    payload = xstrcat(payload, buf);
+    	// temperature_state temperature_address temperature
+    	payload = xstrcat(payload, (char *)"\",\"temperature\":{\"state\":\"");
+    	payload = xstrcat(payload, (char *)sensState[units[i].temperature_state]);
+    	payload = xstrcat(payload, (char *)"\",\"address\":\"");
+    	payload = xstrcat(payload, (char *)units[i].temperature_rom_code);
+    	payload = xstrcat(payload, (char *)"\",\"temperature\":");
+    	sprintf(buf, "%.3f", units[i].temperature / 1000.0);
+    	payload = xstrcat(payload, buf);
 
-    // pressure_state pressure_channel pressure_voltage pressure_zero pressure
-    payload = xstrcat(payload, (char *)"},\"pressure\":{\"state\":\"");
-    payload = xstrcat(payload, (char *)sensState[units[i].pressure_state]);
-    payload = xstrcat(payload, (char *)"\",\"channel\":");
-    sprintf(buf, "%d", units[i].pressure_channel);
-    payload = xstrcat(payload, buf);
-    payload = xstrcat(payload, (char *)",\"voltage\":");
-    sprintf(buf, "%.3f", units[i].pressure_voltage / 1000.0);
-    payload = xstrcat(payload, buf);
-    payload = xstrcat(payload, (char *)",\"zero\":");
-    sprintf(buf, "%.3f", units[i].pressure_zero / 1000.0);
-    payload = xstrcat(payload, buf);
-    payload = xstrcat(payload, (char *)",\"bar\":");
-    sprintf(buf, "%.2f", units[i].pressure / 1000.0);
-    payload = xstrcat(payload, buf);
-    payload = xstrcat(payload, (char *)"},\"mode\":\"");
-    payload = xstrcat(payload, (char *)unitMode[units[i].mode]);
-    payload = xstrcat(payload, (char *)"\"}");
+    	// pressure_state pressure_channel pressure_voltage pressure_zero pressure
+    	payload = xstrcat(payload, (char *)"},\"pressure\":{\"state\":\"");
+    	payload = xstrcat(payload, (char *)sensState[units[i].pressure_state]);
+    	payload = xstrcat(payload, (char *)"\",\"channel\":");
+    	sprintf(buf, "%d", units[i].pressure_channel);
+    	payload = xstrcat(payload, buf);
+    	payload = xstrcat(payload, (char *)",\"voltage\":");
+    	sprintf(buf, "%.3f", units[i].pressure_voltage / 1000.0);
+    	payload = xstrcat(payload, buf);
+    	payload = xstrcat(payload, (char *)",\"zero\":");
+    	sprintf(buf, "%.3f", units[i].pressure_zero / 1000.0);
+    	payload = xstrcat(payload, buf);
+    	payload = xstrcat(payload, (char *)",\"bar\":");
+    	sprintf(buf, "%.2f", units[i].pressure / 1000.0);
+    	payload = xstrcat(payload, buf);
+    	payload = xstrcat(payload, (char *)"},\"mode\":\"");
+	payload = xstrcat(payload, (char *)unitMode[units[i].mode]);
+    	payload = xstrcat(payload, (char *)"\"}");
+	xSemaphoreGive(xSemaphoreUnits);
+    }
     return payload;
 }
 
--- a/sdkconfig	Tue Oct 08 16:51:30 2019 +0200
+++ b/sdkconfig	Tue Oct 08 21:09:36 2019 +0200
@@ -320,7 +320,7 @@
 CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF
 CONFIG_FREERTOS_CORETIMER_0=y
 # CONFIG_FREERTOS_CORETIMER_1 is not set
-CONFIG_FREERTOS_HZ=100
+CONFIG_FREERTOS_HZ=200
 CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y
 # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set
 # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set

mercurial