121 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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_ */
 | |
| 
 | 
