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