]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/port.c
Update version number ready for next release.
[freertos] / FreeRTOS / Source / portable / CodeWarrior / ColdFire_V2 / port.c
1 /*\r
2  * FreeRTOS Kernel V10.2.1\r
3  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21  *\r
22  * http://www.FreeRTOS.org\r
23  * http://aws.amazon.com/freertos\r
24  *\r
25  * 1 tab == 4 spaces!\r
26  */\r
27 \r
28 /* Kernel includes. */\r
29 #include "FreeRTOS.h"\r
30 #include "task.h"\r
31 \r
32 \r
33 #define portINITIAL_FORMAT_VECTOR               ( ( StackType_t ) 0x4000 )\r
34 \r
35 /* Supervisor mode set. */\r
36 #define portINITIAL_STATUS_REGISTER             ( ( StackType_t ) 0x2000)\r
37 \r
38 /* Used to keep track of the number of nested calls to taskENTER_CRITICAL().  This\r
39 will be set to 0 prior to the first task being started. */\r
40 static uint32_t ulCriticalNesting = 0x9999UL;\r
41 \r
42 \r
43 #define portSAVE_CONTEXT()                              \\r
44         lea.l           (-60, %sp), %sp;                \\r
45         movem.l         %d0-%fp, (%sp);                 \\r
46         move.l          pxCurrentTCB, %a0;              \\r
47         move.l          %sp, (%a0);\r
48 \r
49 #define portRESTORE_CONTEXT()                   \\r
50         move.l          pxCurrentTCB, %a0;              \\r
51         move.l          (%a0), %sp;                             \\r
52         movem.l         (%sp), %d0-%fp;                 \\r
53         lea.l           %sp@(60), %sp;                  \\r
54         rte\r
55 \r
56 \r
57 \r
58 /*-----------------------------------------------------------*/\r
59 \r
60 StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )\r
61 {\r
62         *pxTopOfStack = ( StackType_t ) pvParameters;\r
63         pxTopOfStack--;\r
64 \r
65         *pxTopOfStack = (StackType_t) 0xDEADBEEF;\r
66         pxTopOfStack--;\r
67 \r
68         /* Exception stack frame starts with the return address. */\r
69         *pxTopOfStack = ( StackType_t ) pxCode;\r
70         pxTopOfStack--;\r
71 \r
72         *pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER );\r
73         pxTopOfStack--;\r
74 \r
75         *pxTopOfStack = ( StackType_t ) 0x0; /*FP*/\r
76         pxTopOfStack -= 14; /* A5 to D0. */\r
77 \r
78     return pxTopOfStack;\r
79 }\r
80 /*-----------------------------------------------------------*/\r
81 \r
82 BaseType_t xPortStartScheduler( void )\r
83 {\r
84 extern void vPortStartFirstTask( void );\r
85 \r
86         ulCriticalNesting = 0UL;\r
87 \r
88         /* Configure the interrupts used by this port. */\r
89         vApplicationSetupInterrupts();\r
90 \r
91         /* Start the first task executing. */\r
92         vPortStartFirstTask();\r
93 \r
94         return pdFALSE;\r
95 }\r
96 /*-----------------------------------------------------------*/\r
97 \r
98 void vPortEndScheduler( void )\r
99 {\r
100         /* Not implemented as there is nothing to return to. */\r
101 }\r
102 /*-----------------------------------------------------------*/\r
103 \r
104 void vPortEnterCritical( void )\r
105 {\r
106         if( ulCriticalNesting == 0UL )\r
107         {\r
108                 /* Guard against context switches being pended simultaneously with a\r
109                 critical section being entered. */\r
110                 do\r
111                 {\r
112                         portDISABLE_INTERRUPTS();\r
113                         if( MCF_INTC0_INTFRCH == 0UL )\r
114                         {\r
115                                 break;\r
116                         }\r
117 \r
118                         portENABLE_INTERRUPTS();\r
119 \r
120                 } while( 1 );\r
121         }\r
122         ulCriticalNesting++;\r
123 }\r
124 /*-----------------------------------------------------------*/\r
125 \r
126 void vPortExitCritical( void )\r
127 {\r
128         ulCriticalNesting--;\r
129         if( ulCriticalNesting == 0 )\r
130         {\r
131                 portENABLE_INTERRUPTS();\r
132         }\r
133 }\r
134 /*-----------------------------------------------------------*/\r
135 \r
136 void vPortYieldHandler( void )\r
137 {\r
138 uint32_t ulSavedInterruptMask;\r
139 \r
140         ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR();\r
141                 /* Note this will clear all forced interrupts - this is done for speed. */\r
142                 MCF_INTC0_INTFRCL = 0;\r
143                 vTaskSwitchContext();\r
144         portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask );\r
145 }\r
146 /*-----------------------------------------------------------*/\r
147 \r