This is file "port.c.diff". It contains the differences between the file "FreeRTOS\Source\portable\MPLAB\PIC18F\port.c" (versions 5.2.0 and v5.3.0) and my modifications that solve the problem with saving/restoring the sections "MATH_DATA" and ".tmpdata".
This patch file may be applied using TortoiseMerge, which comes with TortoiseSVN.
--- port.c sex mai 29 15:28:15 2009
+++ port.c sex mai 29 15:27:57 2009
@@ -142,6 +142,13 @@
*/
static void prvLowInterrupt( void );
+extern unsigned char ram * GetMATHDATAStrt ( void );
+extern unsigned char GetMATHDATALen ( void );
+extern unsigned char ram * GetTMPDATAStrt ( void );
+extern unsigned char GetTMPDATALen ( void );
+extern void SaveTMP_MATH ( void );
+extern void RestoreTMP_MATH ( void );
+
/*
* Macro that pushes all the registers that make up the context of a task onto
* the stack, then saves the new top of stack into the TCB.
@@ -198,31 +205,7 @@
MOVFF PRODL, PREINC1 \
MOVFF PCLATU, PREINC1 \
MOVFF PCLATH, PREINC1 \
- /* Store the .tempdata and MATH_DATA areas as described above. */ \
- CLRF FSR0L, 0 \
- CLRF FSR0H, 0 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF POSTINC0, PREINC1 \
- MOVFF INDF0, PREINC1 \
- MOVFF FSR0L, PREINC1 \
- MOVFF FSR0H, PREINC1 \
+ \
/* Store the hardware stack pointer in a temp register before we \
modify it. */ \
MOVFF STKPTR, FSR0L \
@@ -243,6 +226,9 @@
/* Store the number of addresses on the hardware stack (from the \
temporary register). */ \
MOVFF FSR0L, PREINC1 \
+ \
+ call SaveTMP_MATH,0 \
+ \
MOVF PREINC1, 1, 0 \
_endasm \
\
@@ -275,6 +261,9 @@
/* How many return addresses are there on the hardware stack? Discard \
the first byte as we are pointing to the next free space. */ \
MOVFF POSTDEC1, FSR0L \
+ \
+ call RestoreTMP_MATH,0 \
+ \
MOVFF POSTDEC1, FSR0L \
_endasm \
\
@@ -295,29 +284,6 @@
} \
\
_asm \
- /* Restore the .tmpdata and MATH_DATA memory. */ \
- MOVFF POSTDEC1, FSR0H \
- MOVFF POSTDEC1, FSR0L \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, POSTDEC0 \
- MOVFF POSTDEC1, INDF0 \
/* Restore the other registers forming the tasks context. */ \
MOVFF POSTDEC1, PCLATH \
MOVFF POSTDEC1, PCLATU \
@@ -363,6 +329,11 @@
}
/*-----------------------------------------------------------*/
+void FinishTask( void )
+ {
+ vTaskDelete( NULL );
+ }
+
/*
* See header file for description.
*/
@@ -370,18 +341,8 @@
{
unsigned portLONG ulAddress;
unsigned portCHAR ucBlock;
+portSTACK_TYPE ram *p;
- /* Place a few bytes of known values on the bottom of the stack.
- This is just useful for debugging. */
-
- *pxTopOfStack = 0x11;
- pxTopOfStack++;
- *pxTopOfStack = 0x22;
- pxTopOfStack++;
- *pxTopOfStack = 0x33;
- pxTopOfStack++;
-
-
/* Simulate how the stack would look after a call to vPortYield() generated
by the compiler.
@@ -453,24 +414,29 @@
*pxTopOfStack = ( portSTACK_TYPE ) 0x00; /* PCLATH. */
pxTopOfStack++;
- /* Next the .tmpdata and MATH_DATA sections. */
- for( ucBlock = 0; ucBlock <= portCOMPILER_MANAGED_MEMORY_SIZE; ucBlock++ )
- {
- *pxTopOfStack = ( portSTACK_TYPE ) ucBlock;
- *pxTopOfStack++;
- }
+ /* The only function return address so far is the address of the
+ task. */
+ ulAddress = ( unsigned portLONG ) pxCode;
- /* Store the top of the global data section. */
- *pxTopOfStack = ( portSTACK_TYPE ) portCOMPILER_MANAGED_MEMORY_SIZE; /* Low. */
+ /* TOS low. */
+ *pxTopOfStack = ( portSTACK_TYPE ) ( ulAddress & ( unsigned portLONG ) 0x00ff );
pxTopOfStack++;
+ ulAddress >>= 8;
- *pxTopOfStack = ( portSTACK_TYPE ) 0x00; /* High. */
+ /* TOS high. */
+ *pxTopOfStack = ( portSTACK_TYPE ) ( ulAddress & ( unsigned portLONG ) 0x00ff );
pxTopOfStack++;
+ ulAddress >>= 8;
- /* The only function return address so far is the address of the
- task. */
- ulAddress = ( unsigned portLONG ) pxCode;
+ /* TOS even higher. */
+ *pxTopOfStack = ( portSTACK_TYPE ) ( ulAddress & ( unsigned portLONG ) 0x00ff );
+ pxTopOfStack++;
+#if 0
+ //--------------------------------------------------------------------------
+ /* . */
+ ulAddress = ( unsigned portLONG ) FinishTask;
+
/* TOS low. */
*pxTopOfStack = ( portSTACK_TYPE ) ( ulAddress & ( unsigned portLONG ) 0x00ff );
pxTopOfStack++;
@@ -484,12 +450,24 @@
/* TOS even higher. */
*pxTopOfStack = ( portSTACK_TYPE ) ( ulAddress & ( unsigned portLONG ) 0x00ff );
pxTopOfStack++;
+ //--------------------------------------------------------------------------
/* Store the number of return addresses on the hardware stack - so far only
the address of the task entry point. */
+ *pxTopOfStack = ( portSTACK_TYPE ) 2;
+#else // 0
*pxTopOfStack = ( portSTACK_TYPE ) 1;
+#endif // 0
pxTopOfStack++;
+ /* Next the .tmpdata section. */
+ for( ucBlock = GetTMPDATALen(), p = GetTMPDATAStrt(); ucBlock; ucBlock--, pxTopOfStack++, p++ )
+ *pxTopOfStack = *p;
+
+ /* Next the MATH_DATA section. */
+ for( ucBlock = GetMATHDATALen(), p = GetMATHDATAStrt(); ucBlock; ucBlock--, pxTopOfStack++, p++ )
+ *pxTopOfStack = *p;
+
return pxTopOfStack;
}
/*-----------------------------------------------------------*/