1 /**
2 ******************************************************************************
3 * @file stm_list.c
4 * @author MCD Application Team
5 * @brief TCircular Linked List Implementation.
6 ******************************************************************************
7 * @attention
8 *
9 * <h2><center>© Copyright (c) 2019 STMicroelectronics.
10 * All rights reserved.</center></h2>
11 *
12 * This software component is licensed by ST under BSD 3-Clause license,
13 * the "License"; You may not use this file except in compliance with the
14 * License. You may obtain a copy of the License at:
15 * opensource.org/licenses/BSD-3-Clause
16 *
17 ******************************************************************************
18 */
19
20
21 /******************************************************************************
22 * Include Files
23 ******************************************************************************/
24 #include "utilities_common.h"
25
26 #include "stm_list.h"
27
28 /******************************************************************************
29 * Function Definitions
30 ******************************************************************************/
LST_init_head(tListNode * listHead)31 void LST_init_head (tListNode * listHead)
32 {
33 listHead->next = listHead;
34 listHead->prev = listHead;
35 }
36
LST_is_empty(tListNode * listHead)37 uint8_t LST_is_empty (tListNode * listHead)
38 {
39 uint32_t primask_bit;
40 uint8_t return_value;
41
42 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
43 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
44 if(listHead->next == listHead)
45 {
46 return_value = TRUE;
47 }
48 else
49 {
50 return_value = FALSE;
51 }
52 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
53
54 return return_value;
55 }
56
LST_insert_head(tListNode * listHead,tListNode * node)57 void LST_insert_head (tListNode * listHead, tListNode * node)
58 {
59 uint32_t primask_bit;
60
61 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
62 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
63
64 node->next = listHead->next;
65 node->prev = listHead;
66 listHead->next = node;
67 (node->next)->prev = node;
68
69 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
70 }
71
72
LST_insert_tail(tListNode * listHead,tListNode * node)73 void LST_insert_tail (tListNode * listHead, tListNode * node)
74 {
75 uint32_t primask_bit;
76
77 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
78 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
79
80 node->next = listHead;
81 node->prev = listHead->prev;
82 listHead->prev = node;
83 (node->prev)->next = node;
84
85 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
86 }
87
88
LST_remove_node(tListNode * node)89 void LST_remove_node (tListNode * node)
90 {
91 uint32_t primask_bit;
92
93 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
94 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
95
96 (node->prev)->next = node->next;
97 (node->next)->prev = node->prev;
98
99 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
100 }
101
102
LST_remove_head(tListNode * listHead,tListNode ** node)103 void LST_remove_head (tListNode * listHead, tListNode ** node )
104 {
105 uint32_t primask_bit;
106
107 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
108 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
109
110 *node = listHead->next;
111 LST_remove_node (listHead->next);
112
113 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
114 }
115
116
LST_remove_tail(tListNode * listHead,tListNode ** node)117 void LST_remove_tail (tListNode * listHead, tListNode ** node )
118 {
119 uint32_t primask_bit;
120
121 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
122 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
123
124 *node = listHead->prev;
125 LST_remove_node (listHead->prev);
126
127 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
128 }
129
130
LST_insert_node_after(tListNode * node,tListNode * ref_node)131 void LST_insert_node_after (tListNode * node, tListNode * ref_node)
132 {
133 uint32_t primask_bit;
134
135 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
136 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
137
138 node->next = ref_node->next;
139 node->prev = ref_node;
140 ref_node->next = node;
141 (node->next)->prev = node;
142
143 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
144 }
145
146
LST_insert_node_before(tListNode * node,tListNode * ref_node)147 void LST_insert_node_before (tListNode * node, tListNode * ref_node)
148 {
149 uint32_t primask_bit;
150
151 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
152 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
153
154 node->next = ref_node;
155 node->prev = ref_node->prev;
156 ref_node->prev = node;
157 (node->prev)->next = node;
158
159 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
160 }
161
162
LST_get_size(tListNode * listHead)163 int LST_get_size (tListNode * listHead)
164 {
165 int size = 0;
166 tListNode * temp;
167 uint32_t primask_bit;
168
169 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
170 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
171
172 temp = listHead->next;
173 while (temp != listHead)
174 {
175 size++;
176 temp = temp->next;
177 }
178
179 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
180
181 return (size);
182 }
183
LST_get_next_node(tListNode * ref_node,tListNode ** node)184 void LST_get_next_node (tListNode * ref_node, tListNode ** node)
185 {
186 uint32_t primask_bit;
187
188 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
189 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
190
191 *node = ref_node->next;
192
193 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
194 }
195
196
LST_get_prev_node(tListNode * ref_node,tListNode ** node)197 void LST_get_prev_node (tListNode * ref_node, tListNode ** node)
198 {
199 uint32_t primask_bit;
200
201 primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
202 __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
203
204 *node = ref_node->prev;
205
206 __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
207 }
208
209