]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lib.git/commitdiff
Trigger context switch after ADC interrupts
authorMichal Horn <hornmich@fel.cvut.cz>
Mon, 24 Aug 2015 12:51:29 +0000 (14:51 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Wed, 26 Aug 2015 20:37:18 +0000 (22:37 +0200)
The previous behavior caused the ADC update function to wait until
context switch caused by the system timer. Now the scheduler is forced
to switch tasks immediately.

[Patch and this message modified by Michal Sojka]

rpp/include/sys/ti_drv_adc.h
rpp/src/drv/adc.c
rpp/src/sys/_rm48_hdk/ti_drv_adc.c
rpp/src/sys/_tms570_hdk/ti_drv_adc.c
rpp/src/sys/_tms570_hydctr/ti_drv_adc.c
rpp/src/sys/_tms570_rpp/ti_drv_adc.c

index e5cd7be6b3a21e22c45d7ab64a8335ae2bf560d5..6f20c39b05778444df5f6242284cae4c65f9ffb3 100644 (file)
@@ -317,9 +317,10 @@ uint32_t adcMidPointCalibration(adcBASE_t *adc);
 *              - adcGROUP0: ADC event group
 *              - adcGROUP1: ADC group 1
 *              - adcGROUP2: ADC group 2
+*   @param[out] Flag signalling that context switch is required
 *
 *   @note This function has to be provide by the user.
 */
-void adcNotification(adcBASE_t *adc, uint32_t group);
+void adcNotification(adcBASE_t *adc, uint32_t group, portBASE_TYPE* xHigherPriorityTaskWoken);
 
 #endif
index 7089cfa56144662b232e707e29eac12a0f1e965b..e2ecd3bb77f9c54bc4409e557b115e733829ede8 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "drv/drv.h"
 #include "drv/port.h"
+#include "os/portmacro.h"
 
 // Binary semaphores for finish notifications
 static xSemaphoreHandle sem[2][2];
@@ -56,13 +57,12 @@ void drv_adc_init()
  *              - adcGROUP1: ADC group 1
  *              - adcGROUP2: ADC group 2
  */
-void adcNotification(adcBASE_t *adc, uint32_t group)
+void adcNotification(adcBASE_t *adc, uint32_t group, portBASE_TYPE* xHigherPriorityTaskWoken)
 {
        if (adcIsConversionComplete(adc, group) == ADC_CONVERSION_IS_FINISHED) {
-               signed portBASE_TYPE dummy;
                int adc_idx = (adc == adcREG1) ? 0 : 1;
                int grp_idx = (group == adcGROUP1) ? 0 : 1;
-               xSemaphoreGiveFromISR(sem[adc_idx][grp_idx], &dummy);
+               xSemaphoreGiveFromISR(sem[adc_idx][grp_idx], xHigherPriorityTaskWoken);
        }
 }
 
index 09300e073bf8bc49ed0c04199fa83e74885aa34b..03a4d2ef6bb1d63f4920f2ef954255cd4a9b2d53 100644 (file)
@@ -12,6 +12,8 @@
 
 /* Include Files */
 #include "sys/ti_drv_adc.h"
+#include "os/os.h"
+#include "os/portmacro.h"
 
 
 /** @fn void adcInit(void)
@@ -792,8 +794,10 @@ void adcDisableNotification(adcBASE_t *adc, uint32_t group)
 #pragma INTERRUPT(adc1Group0Interrupt, IRQ)
 void adc1Group0Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP0);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP0, &xHigherPriorityTaskWoken);
     adcREG1->GxINTFLG[0U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -803,9 +807,11 @@ void adc1Group0Interrupt(void)
 #pragma INTERRUPT(adc1Group1Interrupt, IRQ)
 void adc1Group1Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP1);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP1, &xHigherPriorityTaskWoken);
     // For ADC1 Group1 see tms570_trm.pdf p. 791 (783)
     adcREG1->GxINTFLG[1U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -815,8 +821,10 @@ void adc1Group1Interrupt(void)
 #pragma INTERRUPT(adc1Group2Interrupt, IRQ)
 void adc1Group2Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP2);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP2, &xHigherPriorityTaskWoken);
     adcREG1->GxINTFLG[2U] = _BV(3) | _BV(0);;
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -826,8 +834,10 @@ void adc1Group2Interrupt(void)
 #pragma INTERRUPT(adc2Group0Interrupt, IRQ)
 void adc2Group0Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP0);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP0, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[0U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -837,8 +847,10 @@ void adc2Group0Interrupt(void)
 #pragma INTERRUPT(adc2Group1Interrupt, IRQ)
 void adc2Group1Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP1);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP1, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[1U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -848,7 +860,9 @@ void adc2Group1Interrupt(void)
 #pragma INTERRUPT(adc2Group2Interrupt, IRQ)
 void adc2Group2Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP2);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP2, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[2U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
index 0620182f479de8cef6193124d3630c6964df0938..2f777689329825dddd664126dd990a4aa5ebec07 100644 (file)
@@ -792,8 +792,10 @@ void adcDisableNotification(adcBASE_t *adc, uint32_t group)
 #pragma INTERRUPT(adc1Group0Interrupt, IRQ)
 void adc1Group0Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP0);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP0, &xHigherPriorityTaskWoken);
     adcREG1->GxINTFLG[0U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -803,9 +805,11 @@ void adc1Group0Interrupt(void)
 #pragma INTERRUPT(adc1Group1Interrupt, IRQ)
 void adc1Group1Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP1);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP1, &xHigherPriorityTaskWoken);
     // For ADC1 Group1 see tms570_trm.pdf p. 791 (783)
     adcREG1->GxINTFLG[1U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -815,8 +819,10 @@ void adc1Group1Interrupt(void)
 #pragma INTERRUPT(adc1Group2Interrupt, IRQ)
 void adc1Group2Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP2);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP2, &xHigherPriorityTaskWoken);
     adcREG1->GxINTFLG[2U] = _BV(3) | _BV(0);;
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -826,8 +832,10 @@ void adc1Group2Interrupt(void)
 #pragma INTERRUPT(adc2Group0Interrupt, IRQ)
 void adc2Group0Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP0);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP0, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[0U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -837,8 +845,10 @@ void adc2Group0Interrupt(void)
 #pragma INTERRUPT(adc2Group1Interrupt, IRQ)
 void adc2Group1Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP1);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP1, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[1U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -848,7 +858,9 @@ void adc2Group1Interrupt(void)
 #pragma INTERRUPT(adc2Group2Interrupt, IRQ)
 void adc2Group2Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP2);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP2, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[2U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
index 0620182f479de8cef6193124d3630c6964df0938..2f777689329825dddd664126dd990a4aa5ebec07 100644 (file)
@@ -792,8 +792,10 @@ void adcDisableNotification(adcBASE_t *adc, uint32_t group)
 #pragma INTERRUPT(adc1Group0Interrupt, IRQ)
 void adc1Group0Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP0);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP0, &xHigherPriorityTaskWoken);
     adcREG1->GxINTFLG[0U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -803,9 +805,11 @@ void adc1Group0Interrupt(void)
 #pragma INTERRUPT(adc1Group1Interrupt, IRQ)
 void adc1Group1Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP1);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP1, &xHigherPriorityTaskWoken);
     // For ADC1 Group1 see tms570_trm.pdf p. 791 (783)
     adcREG1->GxINTFLG[1U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -815,8 +819,10 @@ void adc1Group1Interrupt(void)
 #pragma INTERRUPT(adc1Group2Interrupt, IRQ)
 void adc1Group2Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP2);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP2, &xHigherPriorityTaskWoken);
     adcREG1->GxINTFLG[2U] = _BV(3) | _BV(0);;
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -826,8 +832,10 @@ void adc1Group2Interrupt(void)
 #pragma INTERRUPT(adc2Group0Interrupt, IRQ)
 void adc2Group0Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP0);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP0, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[0U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -837,8 +845,10 @@ void adc2Group0Interrupt(void)
 #pragma INTERRUPT(adc2Group1Interrupt, IRQ)
 void adc2Group1Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP1);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP1, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[1U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -848,7 +858,9 @@ void adc2Group1Interrupt(void)
 #pragma INTERRUPT(adc2Group2Interrupt, IRQ)
 void adc2Group2Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP2);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP2, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[2U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
index 6fe9de80c5ad1ffdc4b8983d80f570b333959e8c..a8cabf3d8d21cefd44542606ec0284adc7a9c563 100644 (file)
@@ -793,8 +793,10 @@ void adcDisableNotification(adcBASE_t *adc, uint32_t group)
 #pragma INTERRUPT(adc1Group0Interrupt, IRQ)
 void adc1Group0Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP0);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP0, &xHigherPriorityTaskWoken);
     adcREG1->GxINTFLG[0U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -804,9 +806,11 @@ void adc1Group0Interrupt(void)
 #pragma INTERRUPT(adc1Group1Interrupt, IRQ)
 void adc1Group1Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP1);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP1, &xHigherPriorityTaskWoken);
     // For ADC1 Group1 see tms570_trm.pdf p. 791 (783)
     adcREG1->GxINTFLG[1U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -816,8 +820,10 @@ void adc1Group1Interrupt(void)
 #pragma INTERRUPT(adc1Group2Interrupt, IRQ)
 void adc1Group2Interrupt(void)
 {
-    adcNotification(adcREG1, adcGROUP2);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG1, adcGROUP2, &xHigherPriorityTaskWoken);
     adcREG1->GxINTFLG[2U] = _BV(3) | _BV(0);;
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -827,8 +833,10 @@ void adc1Group2Interrupt(void)
 #pragma INTERRUPT(adc2Group0Interrupt, IRQ)
 void adc2Group0Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP0);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP0, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[0U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -838,8 +846,10 @@ void adc2Group0Interrupt(void)
 #pragma INTERRUPT(adc2Group1Interrupt, IRQ)
 void adc2Group1Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP1);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP1, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[1U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }
 
 
@@ -849,7 +859,9 @@ void adc2Group1Interrupt(void)
 #pragma INTERRUPT(adc2Group2Interrupt, IRQ)
 void adc2Group2Interrupt(void)
 {
-    adcNotification(adcREG2, adcGROUP2);
+    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+    adcNotification(adcREG2, adcGROUP2, &xHigherPriorityTaskWoken);
     adcREG2->GxINTFLG[2U] = _BV(3) | _BV(0);
+    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
 }