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