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
48#ifndef VSF_USER_ENTRY
49# if VSF_KERNEL_CFG_ENTRY_IS_MAIN == ENABLED
50# define VSF_USER_ENTRY user_main
51# else
52# define VSF_USER_ENTRY main
53# endif
54#endif
55
56#if VSF_OS_CFG_PRIORITY_NUM > 1
57
64# define VSF_SCHED_SAFE_CODE_REGION VSF_FORCED_SCHED_SAFE_CODE_REGION
65
78# define __vsf_sched_safe(...) __vsf_forced_sched_safe(__VA_ARGS__)
79
90# define vsf_sched_lock() vsf_forced_sched_lock()
91
102# define vsf_sched_unlock(__level) vsf_forced_sched_unlock((vsf_sched_lock_status_t)(__level))
103
114# define vsf_sched_safe() vsf_forced_sched_safe()
115
126# define vsf_sched_safe_exit() vsf_forced_sched_safe_exit()
127
128#else
129
136# define VSF_SCHED_SAFE_CODE_REGION DEFAULT_CODE_REGION_NONE
137
144# define vsf_sched_lock() 0
145
152# define vsf_sched_unlock(__level) VSF_UNUSED_PARAM(__level)
153
160# define vsf_sched_safe() if (1)
161
162# if (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) && !defined(__cplusplus)
169# define __vsf_sched_safe(__code) __code
170# else
177# define __vsf_sched_safe(...) __VA_ARGS__
178# endif
179
186# define vsf_sched_safe_exit()
187
188#endif
189
200#define vsf_protect_scheduler() vsf_sched_lock()
201
212#define vsf_unprotect_scheduler(__state) vsf_sched_unlock((__state))
213
214
215
216#if __VSF_OS_SWI_NUM > 0
229#define __vsf_forced_sched_safe(...) \
230 { \
231 vsf_sched_lock_status_t VSF_MACRO_SAFE_NAME(status) = vsf_forced_sched_lock();\
232 __VA_ARGS__; \
233 vsf_forced_sched_unlock(VSF_MACRO_SAFE_NAME(status)); \
234 }
235
246#define vsf_forced_sched_safe() vsf_protect_region(&vsf_protect_region_sched)
247
258#define vsf_forced_sched_safe_exit() vsf_forced_sched_unlock(VSF_MACRO_SAFE_NAME(status))
259#endif
260
271#define vsf_protect_sched() (vsf_protect_t)vsf_protect_scheduler()
272
283#define vsf_unprotect_sched(__prot) vsf_unprotect_scheduler(__prot)
284
285// kernel wrapper for host_request and host_thread
286#if VSF_KERNEL_THREAD_USE_HOST == ENABLED
287# ifdef VSF_ARCH_IRQ_REQUEST_SUPPORT_MANUAL_RESET
298# define __vsf_kernel_host_request_init(__req) __vsf_arch_irq_request_init((__req), true)
299# else
310# define __vsf_kernel_host_request_init(__req) __vsf_arch_irq_request_init(__req)
311# endif
312
323# define __vsf_kernel_host_request_fini(__req) __vsf_arch_irq_request_fini(__req)
324
335# define __vsf_kernel_host_request_send(__req) __vsf_arch_irq_request_send(__req)
336
347# define __vsf_kernel_host_request_pend(__req) __vsf_arch_irq_request_pend(__req)
348
349# ifdef VSF_ARCH_IRQ_SUPPORT_STACK
370# define __vsf_kernel_host_thread_init(__thread, __name, __entry, __prio, __stack, __stacksize)\
371 __vsf_arch_irq_init(__thread, __name, __entry, __prio, __stack, __stacksize)
372# else
393# define __vsf_kernel_host_thread_init(__thread, __name, __entry, __prio, __stack, __stacksize)\
394 __vsf_arch_irq_init(__thread, __name, __entry, __prio)
395# endif
396
411# define __vsf_kernel_host_thread_restart(__thread, __request_pending) \
412 __vsf_arch_irq_restart((__thread), (__request_pending))
413
424# define __vsf_kernel_host_thread_exit(__thread) __vsf_arch_irq_exit(__thread)
425#endif
426
427/*============================ MACROFIED FUNCTIONS ===========================*/
428
429// prototype: void vsf_sleep(int level = 0);
440#define vsf_sleep(...) __vsf_sleep((0, ##__VA_ARGS__))
441
442/*============================ TYPES =========================================*/
443
454
455#ifdef __VSF_OS_CFG_EVTQ_LIST
456dcl_vsf_pool(vsf_evt_node_pool)
457def_vsf_pool(vsf_evt_node_pool, vsf_evt_node_t)
458#endif
459
460#if __VSF_KERNEL_CFG_EDA_FRAME_POOL == ENABLED
465dcl_vsf_pool(vsf_eda_frame_pool)
466def_vsf_pool(vsf_eda_frame_pool, __vsf_eda_frame_buffer_t)
467#endif
468
469typedef struct vsf_kernel_resource_t {
470 struct {
471 #if __VSF_OS_SWI_NUM > 0
472 const vsf_arch_prio_t *os_swi_priorities_ptr;
473 uint16_t swi_priority_cnt;
474 struct {
475 vsf_prio_t begin;
477 } sched_prio;
478 #else
479 struct {
482 #endif
484
485
486#if __VSF_KERNEL_CFG_EVTQ_EN == ENABLED
487 struct {
489# if defined(__VSF_OS_CFG_EVTQ_ARRAY)
490 vsf_evt_node_t **nodes;
491 uint8_t node_bit_sz;
492#endif
493# if defined(__VSF_OS_CFG_EVTQ_LIST)
494 vsf_pool_item(vsf_evt_node_pool) *nodes_buf_ptr;
496# endif
497
500
501#endif
502#if __VSF_KERNEL_CFG_EDA_FRAME_POOL == ENABLED
503 struct {
504 vsf_pool_item(vsf_eda_frame_pool) *frame_buf_ptr;
507#endif
509
510/*============================ GLOBAL VARIABLES ==============================*/
511
512#if __VSF_OS_SWI_NUM > 0
513extern const code_region_t VSF_FORCED_SCHED_SAFE_CODE_REGION;
515#else
516# define vsf_protect_region_sched vsf_protect_region_none
517#endif
518
519/*============================ PROTOTYPES ====================================*/
520
522
530extern void __vsf_kernel_os_start(void);
531
542extern void __vsf_kernel_os_run_priority(vsf_prio_t priority);
543#ifndef WEAK_VSF_KERNEL_ERR_REPORT
554extern void vsf_kernel_err_report(enum vsf_kernel_error_t err);
555#endif
556
557#if VSF_KERNEL_CFG_CPU_USAGE == ENABLED
569
580extern void vsf_cpu_usage_stop(void);
581#endif
582
583#if __VSF_OS_SWI_NUM > 0
594extern vsf_sched_lock_status_t vsf_forced_sched_lock(void);
595
606extern void vsf_forced_sched_unlock(vsf_sched_lock_status_t origlevel);
607#endif
608
609// vsf_sleep can only be called in vsf_plug_in_on_kernel_idle
620extern void __vsf_sleep(int level);
621
622#ifdef __cplusplus
623}
624#endif
625
626#endif
627#endif
Definition vsf_eda.h:1784
vsf_arch_prio_t
Definition cortex_a_generic.h:85
unsigned short uint16_t
Definition stdint.h:7
unsigned char uint8_t
Definition stdint.h:5
Definition vsf_os.h:461
uint8_t extra[VSF_OS_CFG_EDA_FRAME_POOL_EXTRA_SIZE]
Definition vsf_os.h:463
__vsf_eda_frame_t frame
Definition vsf_os.h:462
Definition code_region.h:268
Context for per-task CPU usage sampling; the user provides the ctx storage and must keep it valid unt...
Definition vsf_eda.h:1624
Definition vsf_evtq.h:59
Definition vsf_evtq.h:51
Definition vsf_os.h:469
vsf_evtq_t * queue_array
Definition vsf_os.h:488
struct vsf_kernel_resource_t::@903 frame_stack
struct vsf_kernel_resource_t::@901 arch
uint16_t node_cnt
Definition vsf_os.h:495
struct vsf_kernel_resource_t::@901::@904 sched_prio
struct vsf_kernel_resource_t::@902 evt_queue
uint16_t queue_cnt
Definition vsf_os.h:498
uint16_t frame_cnt
Definition vsf_os.h:505
vsf_prio_t highest
Definition vsf_os.h:480
Definition vsf_arch_abstraction.h:61
vsf_kernel_error_t
Kernel error codes reported to vsf_kernel_err_report()
Definition vsf_eda.h:2355
vsf_prio_t
Kernel priority enumeration.
Definition vsf_kernel_common.h:55
void vsf_cpu_usage_start(vsf_cpu_usage_ctx_t *ctx)
Start CPU usage measurement.
Definition vsf_os.c:529
void __vsf_kernel_os_start(void)
__vsf_kernel_os_start and __vsf_kernel_os_run_priority are ONLY used when embedded weak vsf_main_entr...
Definition vsf_os.c:599
#define vsf_protect_region_sched
Definition vsf_os.h:516
__vsf_eda_frame_buffer_t struct vsf_kernel_resource_t vsf_kernel_resource_t
vsf_arch_prio_t vsf_sched_lock_status_t
Scheduler lock status, returned by vsf_sched_lock() / vsf_forced_sched_lock() and passed back to vsf_...
Definition vsf_os.h:453
void vsf_cpu_usage_stop(void)
Stop CPU usage measurement.
Definition vsf_os.c:539
void __vsf_sleep(int level)
Implementation of vsf_sleep(), put the CPU into sleep (low-power) mode.
Definition vsf_os.c:484
vsf_evt_node_t struct __vsf_eda_frame_buffer_t __vsf_eda_frame_buffer_t
void __vsf_kernel_os_run_priority(vsf_prio_t priority)
Run the event queue of the given priority (dispatch pending events)
Definition vsf_os.c:592
void vsf_kernel_err_report(enum vsf_kernel_error_t err)
Report a kernel error.
Definition vsf_eda.c:409
#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
Generated from commit: vsfteam/vsf@a5104db