VSF Documented
vsf_os.h
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#ifndef __VSF_OS_H__
19#define __VSF_OS_H__
20
21/*============================ INCLUDES ======================================*/
23
24#if VSF_USE_KERNEL == ENABLED
25//#include "./vsf_kernel_common.h"
26#include "./vsf_evtq.h"
27#include "./task/vsf_task.h"
28
29// for VSF_USER_ENTRY macro if exists in arch
30#include "hal/arch/vsf_arch.h"
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36/*============================ MACROS ========================================*/
37
38#ifndef VSF_USER_ENTRY
39# if VSF_KERNEL_CFG_ENTRY_IS_MAIN == ENABLED
40# define VSF_USER_ENTRY user_main
41# else
42# define VSF_USER_ENTRY main
43# endif
44#endif
45
46#if VSF_OS_CFG_PRIORITY_NUM > 1
47
48# define VSF_SCHED_SAFE_CODE_REGION VSF_FORCED_SCHED_SAFE_CODE_REGION
49# define __vsf_sched_safe(...) __vsf_forced_sched_safe(__VA_ARGS__)
50
51# define vsf_sched_lock() vsf_forced_sched_lock()
52# define vsf_sched_unlock(__level) vsf_forced_sched_unlock((vsf_sched_lock_status_t)(__level))
53# define vsf_sched_safe() vsf_forced_sched_safe()
54# define vsf_sched_safe_exit() vsf_forced_sched_safe_exit()
55
56#else
57
58# define VSF_SCHED_SAFE_CODE_REGION DEFAULT_CODE_REGION_NONE
59# define vsf_sched_lock() 0
60# define vsf_sched_unlock(__level) VSF_UNUSED_PARAM(__level)
61# define vsf_sched_safe() if (1)
62# if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
63# define __vsf_sched_safe(__code) __code
64# else
65# define __vsf_sched_safe(...) __VA_ARGS__
66# endif
67# define vsf_sched_safe_exit()
68
69#endif
70
71#define vsf_protect_scheduler() vsf_sched_lock()
72#define vsf_unprotect_scheduler(__state) vsf_sched_unlock((__state))
73
74
75
76#if __VSF_OS_SWI_NUM > 0
77#define __vsf_forced_sched_safe(...) \
78 { \
79 vsf_sched_lock_status_t VSF_MACRO_SAFE_NAME(status) = vsf_forced_sched_lock();\
80 __VA_ARGS__; \
81 vsf_forced_sched_unlock(VSF_MACRO_SAFE_NAME(status)); \
82 }
83
84#define vsf_forced_sched_safe() vsf_protect_region(&vsf_protect_region_sched)
85#define vsf_forced_sched_safe_exit() vsf_forced_sched_unlock(VSF_MACRO_SAFE_NAME(status))
86#endif
87
88#define vsf_protect_sched() (vsf_protect_t)vsf_protect_scheduler()
89#define vsf_unprotect_sched(__prot) vsf_unprotect_scheduler(__prot)
90
91// kernel wrapper for host_request and host_thread
92#if VSF_KERNEL_THREAD_USE_HOST == ENABLED
93# ifdef VSF_ARCH_IRQ_REQUEST_SUPPORT_MANUAL_RESET
94# define __vsf_kernel_host_request_init(__req) __vsf_arch_irq_request_init((__req), true)
95# else
96# define __vsf_kernel_host_request_init(__req) __vsf_arch_irq_request_init(__req)
97# endif
98# define __vsf_kernel_host_request_fini(__req) __vsf_arch_irq_request_fini(__req)
99# define __vsf_kernel_host_request_send(__req) __vsf_arch_irq_request_send(__req)
100# define __vsf_kernel_host_request_pend(__req) __vsf_arch_irq_request_pend(__req)
101
102# ifdef VSF_ARCH_IRQ_SUPPORT_STACK
103# define __vsf_kernel_host_thread_init(__thread, __name, __entry, __prio, __stack, __stacksize)\
104 __vsf_arch_irq_init(__thread, __name, __entry, __prio, __stack, __stacksize)
105# else
106# define __vsf_kernel_host_thread_init(__thread, __name, __entry, __prio, __stack, __stacksize)\
107 __vsf_arch_irq_init(__thread, __name, __entry, __prio)
108# endif
109
110# define __vsf_kernel_host_thread_restart(__thread, __request_pending) \
111 __vsf_arch_irq_restart((__thread), (__request_pending))
112# define __vsf_kernel_host_thread_exit(__thread) __vsf_arch_irq_exit(__thread)
113#endif
114
115/*============================ MACROFIED FUNCTIONS ===========================*/
116
117// prototype: void vsf_sleep(int level = 0);
118#define vsf_sleep(...) __vsf_sleep((0, ##__VA_ARGS__))
119
120/*============================ TYPES =========================================*/
121
123
124#ifdef __VSF_OS_CFG_EVTQ_LIST
125dcl_vsf_pool(vsf_evt_node_pool)
126def_vsf_pool(vsf_evt_node_pool, vsf_evt_node_t)
127#endif
128
129#if __VSF_KERNEL_CFG_EDA_FRAME_POOL == ENABLED
132 uint8_t extra[VSF_OS_CFG_EDA_FRAME_POOL_EXTRA_SIZE];
134dcl_vsf_pool(vsf_eda_frame_pool)
135def_vsf_pool(vsf_eda_frame_pool, __vsf_eda_frame_buffer_t)
136#endif
137
138typedef struct vsf_kernel_resource_t {
139 struct {
140 #if __VSF_OS_SWI_NUM > 0
141 const vsf_arch_prio_t *os_swi_priorities_ptr;
142 uint16_t swi_priority_cnt;
143 struct {
144 vsf_prio_t begin;
146 } sched_prio;
147 #else
148 struct {
151 #endif
153
154
155#if __VSF_KERNEL_CFG_EVTQ_EN == ENABLED
156 struct {
158# if defined(__VSF_OS_CFG_EVTQ_ARRAY)
159 vsf_evt_node_t **nodes;
160 uint8_t node_bit_sz;
161#endif
162# if defined(__VSF_OS_CFG_EVTQ_LIST)
163 vsf_pool_item(vsf_evt_node_pool) *nodes_buf_ptr;
165# endif
166
169
170#endif
171#if __VSF_KERNEL_CFG_EDA_FRAME_POOL == ENABLED
172 struct {
173 vsf_pool_item(vsf_eda_frame_pool) *frame_buf_ptr;
176#endif
178
179/*============================ GLOBAL VARIABLES ==============================*/
180
181#if __VSF_OS_SWI_NUM > 0
182extern const code_region_t VSF_FORCED_SCHED_SAFE_CODE_REGION;
184#else
185# define vsf_protect_region_sched vsf_protect_region_none
186#endif
187
188/*============================ PROTOTYPES ====================================*/
189
191extern void __vsf_kernel_os_start(void);
192extern void __vsf_kernel_os_run_priority(vsf_prio_t priority);
193#ifndef WEAK_VSF_KERNEL_ERR_REPORT
194extern void vsf_kernel_err_report(enum vsf_kernel_error_t err);
195#endif
196
197#if VSF_KERNEL_CFG_CPU_USAGE == ENABLED
199extern void vsf_cpu_usage_stop(void);
200#endif
201
202#if __VSF_OS_SWI_NUM > 0
203extern vsf_sched_lock_status_t vsf_forced_sched_lock(void);
204extern void vsf_forced_sched_unlock(vsf_sched_lock_status_t origlevel);
205#endif
206
207// vsf_sleep can only be called in vsf_plug_in_on_kernel_idle
208extern void __vsf_sleep(int level);
209
210#ifdef __cplusplus
211}
212#endif
213
214#endif
215#endif
Definition vsf_eda.h:742
vsf_arch_prio_t
Definition cortex_a_generic.h:88
unsigned short uint16_t
Definition stdint.h:7
unsigned char uint8_t
Definition stdint.h:5
Definition vsf_os.h:130
uint8_t extra[VSF_OS_CFG_EDA_FRAME_POOL_EXTRA_SIZE]
Definition vsf_os.h:132
__vsf_eda_frame_t frame
Definition vsf_os.h:131
Definition code_region.h:268
Definition vsf_eda.h:633
Definition vsf_evtq.h:59
Definition vsf_evtq.h:51
Definition vsf_os.h:138
vsf_evtq_t * queue_array
Definition vsf_os.h:157
struct vsf_kernel_resource_t::@718 frame_stack
uint16_t node_cnt
Definition vsf_os.h:164
struct vsf_kernel_resource_t::@715::@720 sched_prio
struct vsf_kernel_resource_t::@716 evt_queue
uint16_t queue_cnt
Definition vsf_os.h:167
uint16_t frame_cnt
Definition vsf_os.h:174
struct vsf_kernel_resource_t::@715 arch
vsf_prio_t highest
Definition vsf_os.h:149
Definition vsf_arch_abstraction.h:54
vsf_kernel_error_t
Definition vsf_eda.h:1083
vsf_prio_t
Definition vsf_kernel_common.h:37
void vsf_cpu_usage_start(vsf_cpu_usage_ctx_t *ctx)
Definition vsf_os.c:531
void __vsf_kernel_os_start(void)
__vsf_kernel_os_start and __vsf_kernel_os_run_priority are ONLY used when __vsf_main_entry is not use...
Definition vsf_os.c:611
#define vsf_protect_region_sched
Definition vsf_os.h:185
vsf_arch_prio_t vsf_sched_lock_status_t
Definition vsf_os.h:122
void vsf_cpu_usage_stop(void)
Definition vsf_os.c:541
void __vsf_sleep(int level)
Definition vsf_os.c:486
void __vsf_kernel_os_run_priority(vsf_prio_t priority)
Definition vsf_os.c:594
void vsf_kernel_err_report(enum vsf_kernel_error_t err)
Definition vsf_eda.c:403
#define vsf_pool_item(__name)
Definition vsf_pool.h:259
#define dcl_vsf_pool(__name)
Definition vsf_pool.h:264
#define def_vsf_pool(__name, __type)
Definition vsf_pool.h:271