nt9856x/code/vos/include/kwrap/task.h
2023-03-28 15:07:53 +08:00

121 lines
6.4 KiB
C
Executable File

#ifndef _VOS_TASK_H_
#define _VOS_TASK_H_
#include <kwrap/nvt_type.h>
#define VOS_RES_TYPE_INVALID 0
#define VOS_RES_TYPE_FLAG 1
#define VOS_RES_TYPE_SEM 2
#define VOS_DEF_STACK_SIZE (8*1024)
// Note:
// FreeRTOS priorities, Highest: (configMAX_PRIORITIES(32)-1) ~ Lowest: (tskIDLE_PRIORITY(0) + 1)
// Linux kernel-space priorities, Highest: SCHED_RR(98) ~ SCHED_RR(1) ~ Lowest: Non-SCHED_RR(0)
// Linux user-space priorities, Highest: nice(-20) ~ nice(0) ~ Lowest: nice(+19)
// VOS priorities, Highest(1) ~ Lowest (30)
// VK_TASK_HIGHEST_PRIORITY is 1 to reserve 0 for debugging
// VK_TASK_LOWEST_PRIORITY is 30 to make sure FreeRTOS lowest priority > tskIDLE_PRIORITY(0)
#define VK_TASK_HIGHEST_PRIORITY 1
#define VK_TASK_LOWEST_PRIORITY 30
#if defined(__FREERTOS)
typedef void* VK_TASK_HANDLE;
#elif defined(__LINUX) && defined(__KERNEL__)
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/kernel.h>
typedef struct task_struct * VK_TASK_HANDLE;
#else //Linux user-space
typedef unsigned long int VK_TASK_HANDLE;
#endif
extern void rtos_task_init(unsigned long max_task_num);
extern void rtos_task_exit(void);
extern VK_TASK_HANDLE vos_task_create(void *fp, void *parm, const char name[], int priority, int stksize);
extern void vos_task_destroy(VK_TASK_HANDLE task_hdl);
extern void vos_task_enter(void);
extern int vos_task_return(int rtn_val);
extern void vos_task_update_info(int wait_res, VK_TASK_HANDLE task_hdl, ID wairesid, FLGPTN waiptn, UINT wfmode);
extern void vos_task_dump(int (*dump)(const char *fmt, ...));
extern int vos_task_hdl2id(VK_TASK_HANDLE task_hdl);
extern VK_TASK_HANDLE vos_task_id2hdl(int task_id);
extern void vos_task_dump_by_tskhdl(int (*dump)(const char *fmt, ...), VK_TASK_HANDLE task_hdl);
extern BOOL vos_task_chk_hdl_valid(VK_TASK_HANDLE task_hdl);
extern int vos_task_get_tid(void);
extern void vos_task_set_priority(VK_TASK_HANDLE task_hdl, int priority); //Range from VK_TASK_LOWEST_PRIORITY to VK_TASK_HIGHEST_PRIORITY
extern VK_TASK_HANDLE vos_task_get_handle(void);
extern int vos_task_resume(VK_TASK_HANDLE task_hdl);
extern int vos_task_get_name(VK_TASK_HANDLE task_hdl, char *name, unsigned int len);
extern void vos_dump_stack_backtrace(UINT32 *info, UINT32 h_stack_base, INT32 h_stack_size, UINT32 level);
extern void vos_dump_stack_content(UINT32 h_stack_pointer, UINT32 h_stack_base, INT32 h_stack_size, UINT32 level);
extern void vos_dump_stack(void);
extern void vos_show_stack(VK_TASK_HANDLE takhdl, UINT32 level);
//===== obsolete API, please use vos_util_delay_xxx API =====
extern void vos_task_delay_ms(int ms); //VK_TASK_WAIT_INFINITELY to wait infinitely (Only supported by FreeRTOS)
extern void vos_task_delay_us(int us);
extern void vos_task_delay_us_polling(int us);
//===========================================================
#if defined(__FREERTOS)
// Note:
// 1. Do NOT call vTaskDelete directly. Use THREAD_RETURN() instead.
// 2. A FreeRTOS task should call THREAD_RETURN(0) or vTaskDelete(NULL) before exit,
// otherwise an error message will be shown, e.g. vAssertCalled port.c, 328
extern void vTaskDelete(void *xTaskToDelete); //used by FreeRTOS THREAD_RETURN()
#endif
#if defined(__FREERTOS)
#define THREAD_HANDLE VK_TASK_HANDLE
#define THREAD_RETTYPE void
#define THREAD_DECLARE(name, arglist) THREAD_RETTYPE name(void *arglist) //the same as FreeRTOS TaskFunction_t
#define THREAD_CREATE(handle, fp, parm, name) handle = vos_task_create(fp, (void *)parm, name, 10, VOS_DEF_STACK_SIZE)
#define THREAD_RESUME(handle) vos_task_resume(handle)
#define THREAD_ENTRY() vos_task_enter()
#define THREAD_SHOULD_STOP 0
#define THREAD_DESTROY(handle) vos_task_destroy(handle)
#define THREAD_RETURN(value) vos_task_return(value); vTaskDelete(NULL); return
#define THREAD_SELF(handle) handle = vos_task_get_handle()
#define THREAD_TID(thread_tid) thread_tid = vos_task_get_tid()
#define THREAD_SET_PRIORITY(handle, pri) vos_task_set_priority(handle, pri)
#elif defined(__LINUX) && defined(__KERNEL__)
#define THREAD_HANDLE VK_TASK_HANDLE
#define THREAD_RETTYPE int
#define THREAD_DECLARE(name, arglist) THREAD_RETTYPE name(void *arglist)
#define THREAD_CREATE(handle, fp, parm, name) handle = vos_task_create(fp, (void *)parm, name, 0, VOS_DEF_STACK_SIZE)
#define THREAD_RESUME(handle) vos_task_resume(handle)
#define THREAD_ENTRY() vos_task_enter()
#define THREAD_SHOULD_STOP kthread_should_stop()
#define THREAD_DESTROY(handle) vos_task_destroy(handle)
#define THREAD_RETURN(value) return vos_task_return(value)
#define THREAD_SELF(handle) handle = vos_task_get_handle()
#define THREAD_TID(thread_tid) thread_tid = vos_task_get_tid()
#define THREAD_SET_PRIORITY(handle, pri) vos_task_set_priority(handle, pri)
#else
#define THREAD_HANDLE VK_TASK_HANDLE
#if VOS_LEGACY_ARCH32
#define THREAD_RETTYPE void*
#else
#define THREAD_RETTYPE int
#endif
#define THREAD_DECLARE(name, arglist) THREAD_RETTYPE name(void *arglist)
#define THREAD_CREATE(handle, fp, parm, name) handle = vos_task_create(fp, (void *)parm, name, 0, VOS_DEF_STACK_SIZE)
#define THREAD_RESUME(handle) vos_task_resume(handle)
#define THREAD_ENTRY() vos_task_enter()
#define THREAD_SHOULD_STOP 0
#define THREAD_DESTROY(handle) vos_task_destroy(handle)
#define THREAD_RETURN(value) return (THREAD_RETTYPE)vos_task_return(value)
#define THREAD_SELF(handle) handle = vos_task_get_handle()
#define THREAD_TID(thread_tid) thread_tid = vos_task_get_tid()
#define THREAD_SET_PRIORITY(handle, pri) vos_task_set_priority(handle, pri)
#endif
#endif /* _VOS_TASK_H_ */