VSF Documented
vsf_arch_without_thread_suspend_template.inc
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifdef __VSF_ARCH_WITHOUT_THREAD_SUSPEND_TEMPLATE__
19#undef __VSF_ARCH_WITHOUT_THREAD_SUSPEND_TEMPLATE__
20
21/*============================ INCLUDES ======================================*/
22/*============================ MACROS ========================================*/
23/*============================ MACROFIED FUNCTIONS ===========================*/
24/*============================ TYPES =========================================*/
25
26typedef struct vsf_arch_common_t {
27 vsf_arch_irq_thread_t *cur_thread;
28 vsf_arch_irq_thread_t por_thread; // power on reset
29 vsf_arch_irq_request_t wakeup_request;
30
31 vsf_arch_crit_t lock;
32 vsf_arch_crit_t irq_lock;
33
34 uint32_t irq_ready_cnt;
35 vsf_gint_state_t gint_state;
36 bool irq_end_from_por;
37} vsf_arch_common_t;
38
39#if VSF_ARCH_BG_TRACE_EN == ENABLED
40typedef struct vsf_arch_bg_trace_event_t {
41 uint32_t idx;
42 enum {
44 VSF_ARCH_TRACE_IRQ_START,
45 VSF_ARCH_TRACE_IRQ_ENTER,
46 VSF_ARCH_TRACE_IRQ_END,
47 VSF_ARCH_TRACE_GINT,
48 } event;
50 int info;
51} vsf_arch_bg_trace_event_t;
52
53typedef struct vsf_arch_bg_trace_t {
54 vsf_arch_bg_trace_event_t events[1024];
55 uint32_t pos;
56 uint32_t idx;
57} vsf_arch_bg_trace_t;
58#endif
59
60typedef struct vsf_arch_t vsf_arch_t;
61
62/*============================ GLOBAL VARIABLES ==============================*/
63/*============================ LOCAL VARIABLES ===============================*/
64
65#if VSF_ARCH_BG_TRACE_EN == ENABLED
66static vsf_arch_bg_trace_t __vsf_arch_bg_trace;
67#endif
68
69static vsf_arch_common_t __vsf_arch_common;
70
71/*============================ PROTOTYPES ====================================*/
72/*============================ IMPLEMENTATION ================================*/
73
74#if VSF_ARCH_BG_TRACE_EN == ENABLED
75static vsf_arch_bg_trace_event_t * __vsf_arch_bg_trace_get_event(void)
76{
77 vsf_arch_bg_trace_event_t *event = &__vsf_arch_bg_trace.events[__vsf_arch_bg_trace.pos++];
78 if (__vsf_arch_bg_trace.pos >= dimof(__vsf_arch_bg_trace.events)) {
79 __vsf_arch_bg_trace.pos = 0;
80 }
81 event->idx = __vsf_arch_bg_trace.idx++;
82 return event;
83}
84
85static void __vsf_arch_bg_trace_event(int event, vsf_arch_irq_thread_t *irq_thread, int info)
86{
87 vsf_arch_bg_trace_event_t *trace_event = __vsf_arch_bg_trace_get_event();
88 trace_event->event = event;
89 trace_event->thread = irq_thread;
90 trace_event->info = info;
91}
92#endif
93
94static bool __vsf_arch_low_level_init(void)
95{
96 __vsf_arch_crit_init(__vsf_arch_common.lock);
97 __vsf_arch_crit_init(__vsf_arch_common.irq_lock);
98 __vsf_arch_common.gint_state = true;
99 __vsf_arch_irq_request_init(&__vsf_arch_common.wakeup_request);
100 __vsf_arch_irq_start(&__vsf_arch_common.por_thread);
101 return true;
102}
103
105{
106 __vsf_arch_crit_enter(__vsf_arch_common.lock);
107#if VSF_ARCH_BG_TRACE_EN == ENABLED
108 __vsf_arch_bg_trace_event(VSF_ARCH_TRACE_IRQ_START, irq_thread, __vsf_arch_common.irq_ready_cnt);
109#endif
110 __vsf_arch_common.irq_ready_cnt++;
111 __vsf_arch_crit_leave(__vsf_arch_common.lock);
112
113 __vsf_arch_crit_enter(__vsf_arch_common.irq_lock);
114#if VSF_ARCH_BG_TRACE_EN == ENABLED
115 __vsf_arch_crit_enter(__vsf_arch_common.lock);
116 __vsf_arch_bg_trace_event(VSF_ARCH_TRACE_IRQ_ENTER, irq_thread, __vsf_arch_common.irq_ready_cnt);
117 __vsf_arch_crit_leave(__vsf_arch_common.lock);
118#endif
119 __vsf_arch_common.cur_thread = irq_thread;
120}
121
122void __vsf_arch_irq_end(vsf_arch_irq_thread_t *irq_thread, bool is_terminate)
123{
124 bool is_to_wakeup;
125
126 __vsf_arch_crit_enter(__vsf_arch_common.lock);
127 VSF_HAL_ASSERT(__vsf_arch_common.irq_ready_cnt > 0);
128#if VSF_ARCH_BG_TRACE_EN == ENABLED
129 __vsf_arch_bg_trace_event(VSF_ARCH_TRACE_IRQ_END, irq_thread, __vsf_arch_common.irq_ready_cnt);
130#endif
131 is_to_wakeup = (0 == --__vsf_arch_common.irq_ready_cnt) && !__vsf_arch_common.irq_end_from_por;
132 __vsf_arch_common.irq_end_from_por = false;
133 __vsf_arch_crit_leave(__vsf_arch_common.lock);
134
135 if (is_to_wakeup) {
136 __vsf_arch_common.cur_thread = &__vsf_arch_common.por_thread;
137 __vsf_arch_crit_leave(__vsf_arch_common.irq_lock);
138 __vsf_arch_irq_request_send(&__vsf_arch_common.wakeup_request);
139 } else {
140 __vsf_arch_common.cur_thread = NULL;
141 __vsf_arch_crit_leave(__vsf_arch_common.irq_lock);
142 }
143}
144
146{
147
148}
149
150void __vsf_arch_irq_init(vsf_arch_irq_thread_t *irq_thread, char *name,
152{
153 VSF_HAL_ASSERT(strlen(name) < sizeof(irq_thread->name) - 1);
154 strcpy((char *)irq_thread->name, name);
155
156 if (VSF_ERR_NONE != __vsf_arch_create_irq_thread(irq_thread, entry)) {
157 VSF_HAL_ASSERT(false);
158 }
159}
160
162{
163}
164
165
166/*----------------------------------------------------------------------------*
167 * priority and interrupt *
168 *----------------------------------------------------------------------------*/
169
171{
172 return vsf_arch_prio_0;
173}
174
175
177{
178 return __vsf_arch_common.gint_state;
179}
180
182{
183 vsf_gint_state_t orig = __vsf_arch_common.gint_state;
184 if (orig != level) {
185 __vsf_arch_common.gint_state = level;
186#if VSF_ARCH_BG_TRACE_EN == ENABLED
187 __vsf_arch_crit_enter(__vsf_arch_common.lock);
188 __vsf_arch_bg_trace_event(VSF_ARCH_TRACE_GINT, __vsf_arch_common.cur_thread, __vsf_arch_common.gint_state);
189 __vsf_arch_crit_leave(__vsf_arch_common.lock);
190#endif
191 }
192 return orig;
193}
194
196{
197 vsf_gint_state_t orig = __vsf_arch_common.gint_state;
198 if (orig != false) {
199 __vsf_arch_common.gint_state = false;
200#if VSF_ARCH_BG_TRACE_EN == ENABLED
201 __vsf_arch_crit_enter(__vsf_arch_common.lock);
202 __vsf_arch_bg_trace_event(VSF_ARCH_TRACE_GINT, __vsf_arch_common.cur_thread, __vsf_arch_common.gint_state);
203 __vsf_arch_crit_leave(__vsf_arch_common.lock);
204#endif
205 }
206 return orig;
207}
208
210{
211 return vsf_set_interrupt(true);
212}
213
214/*----------------------------------------------------------------------------*
215 * Others: sleep, reset and etc. *
216 *----------------------------------------------------------------------------*/
217
219{
220 // vsf_arch_sleep can be called with interrupt disabled
221// VSF_HAL_ASSERT(__vsf_arch_common.gint_state);
222 __vsf_arch_common.irq_end_from_por = true;
223 __vsf_arch_irq_end(&__vsf_arch_common.por_thread, false);
224 __vsf_arch_irq_request_pend(&__vsf_arch_common.wakeup_request);
225 __vsf_arch_irq_start(&__vsf_arch_common.por_thread);
226}
227
228#endif
229/* EOF */
#define dimof(__arr)
Definition __type.h:155
@ VSF_ERR_NONE
none error
Definition __type.h:44
vsf_gint_state_t vsf_disable_interrupt(void)
Definition arm9_generic.c:176
vsf_gint_state_t vsf_get_interrupt(void)
Definition arm9_generic.c:164
void vsf_arch_sleep(uint32_t mode)
Definition arm9_generic.c:193
vsf_gint_state_t vsf_enable_interrupt(void)
Definition arm9_generic.c:181
vsf_gint_state_t vsf_set_interrupt(vsf_gint_state_t level)
Definition arm9_generic.c:169
bool
Definition type.h:60
Definition linux_generic.h:104
Definition linux_generic.h:122
const char * name
Definition freertos_generic.h:83
vsf_arch_prio_t
Definition cortex_a_generic.h:88
vsf_arch_prio_t vsf_set_base_priority(vsf_arch_prio_t priority)
Definition cortex_m_generic.c:267
#define NULL
Definition stddef.h:52
#define __vsf_arch_crit_enter(__crit)
Definition linux_generic.c:92
#define __vsf_arch_crit_init(__crit)
Definition linux_generic.c:91
void __vsf_arch_irq_request_pend(vsf_arch_irq_request_t *request)
Definition linux_generic.c:205
void __vsf_arch_irq_request_send(vsf_arch_irq_request_t *request)
Definition linux_generic.c:228
void __vsf_arch_irq_request_init(vsf_arch_irq_request_t *request)
Definition linux_generic.c:167
#define __vsf_arch_crit_leave(__crit)
Definition linux_generic.c:93
void __vsf_arch_irq_set_background(vsf_arch_irq_thread_t *irq_thread)
Definition win_generic.c:724
void __vsf_arch_irq_init(vsf_arch_irq_thread_t *irq_thread, char *name, vsf_arch_irq_entry_t entry, vsf_arch_prio_t priority)
Definition win_generic.c:691
void __vsf_arch_irq_end(vsf_arch_irq_thread_t *irq_thread, bool is_terminate)
Definition win_generic.c:669
void __vsf_arch_irq_fini(vsf_arch_irq_thread_t *irq_thread)
Definition win_generic.c:679
void(* vsf_arch_irq_entry_t)(void *)
Definition linux_generic.h:102
void __vsf_arch_irq_start(vsf_arch_irq_thread_t *irq_thread)
Definition win_generic.c:659
unsigned uint32_t
Definition stdint.h:9
unsigned int uint_fast32_t
Definition stdint.h:27
size_t strlen(const char *str)
char * strcpy(char *dest, const char *src)
Definition pthread.h:158
Definition linux_generic.c:134
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
struct event_t events[32]
Definition vsf_xboot.c:36
@ VSF_ARCH_TRACE_LOCK
Definition win_generic.c:195