#ifndef _BMS_TASK_H_
#define _BMS_TASK_H_

#ifdef __cplusplus
extern "C" {
#endif 

#include "kit_macro.h"

#include "os.h"

#define OS_MAX_TASKS 100

typedef struct _TaskArray
{
		uint16_t    task_id;
    OS_TCB      *task_tcb;
    OS_PRIO     task_prio;//优先级
    uint16_t    task_period;//执行时间
    uint16_t    wdog_timeout;
    uint16_t    wdog_tick;
    uint16_t    stk_size;
    
    NoArgCall   init;
    UintArgCall task;
    CPU_INT32U   *stk_array;
    struct _TaskArray *next_task;
    bool        is_time_out;
}TaskArray;
    
#define TASK_STATIC_INIT(_name,_idx, _prio,_period, _timeout,_init_call, _task_call, stack_size)  \
    OS_STK stack_##_name[stack_size]; \
		OS_TCB tcb_##_name[1];\
    TaskArray _name =    \
    {   \
				(_idx),    \
				tcb_##_name,    \
				(_prio),    \
        (_period),      \
        (_timeout), \
        0,  \
        stack_size, \
        _init_call, \
        _task_call, \
        stack_##_name,  \
        NULL,   \
        false,  \
    }\
    
#define TASK_STATIC_INIT_CCM(_name,_idx, _prio,_period, _timeout,_init_call, _task_call, stack_size)  \
		CPU_STK stack_##_name[stack_size] __attribute__((section (".CCM_RAM"))); \
		OS_TCB tcb_##_name[1] __attribute__((section (".CCM_RAM")));;\
    TaskArray _name =    \
    {   \
				(_idx),    \
				tcb_##_name,    \
				(_prio),    \
        (_period),      \
        (_timeout), \
        0,  \
        stack_size, \
        _init_call, \
        _task_call, \
        stack_##_name,  \
        NULL,   \
        false,  \
    }\

void bsp_task_beat_wdog(void);
void bsp_task_feed_wdog(uint32_t tick);
uint32_t bsp_task_delay_ms(uint32_t dly);
void bsp_task_set_timeout_call(UintArgCall call);
KitResult bsp_task_creat(TaskArray* task, uint8_t * name);
uint16_t bsp_task_get_max_wdog_tick(uint8_t task_id);
    
#ifdef __cplusplus
}
#endif

#endif