bs_bcu_app/bsp/bsp_task.c

164 lines
3.9 KiB
C

#include "drv_wdog.h"
#include "bsp_task.h"
#include "kit_time.h"
#include "kit_debug.h"
#include "bsp_malloc.h"
#include "os.h"
#define TASK_RUNNING_TIME_CHECK true
typedef struct
{
UintArgCall reset_call;
TaskArray *task_array[OS_MAX_TASKS];
uint16_t max_wdog_tick[OS_MAX_TASKS];
}TaskItem;
TaskItem task_item;
static void task_template(void *item)
{
TaskArray *_item;
uint32_t start_tick = 0;
KIT_ASSERT_PARAM(item != NULL);
if(item != NULL)
{
_item = item;
if(_item->init != NULL)
{
_item->init();
}
for (;;)
{
#if (TASK_RUNNING_TIME_CHECK == true)
KIT_DEBUG_PRINTF("task:%d period:%d\r\n", _item->task_id, kit_time_get_tick() - start_tick);
#endif
start_tick = kit_time_get_tick();
//清除看门狗时间
_item->wdog_tick = 0;
_item->task(_item->task_period);
kit_time_dly_by_fix_period(start_tick, _item->task_period);
}
}
}
void bsp_task_beat_wdog(void)
{
uint32_t i;
TaskArray *cur_task;
bool is_timeout = false;
static uint32_t wdog_tick;
for(i = 0; i < OS_MAX_TASKS; i++ )
{
cur_task = task_item.task_array[i];
if(cur_task != NULL)
{
if ((cur_task->wdog_tick++ > cur_task->wdog_timeout))
{
if((cur_task->is_time_out == false) && (task_item.reset_call != NULL))
{
task_item.reset_call(i);
cur_task->is_time_out = true;
KIT_DEBUG_PRINTF("wdog timeout task id %d \r\n", cur_task->task_id);
}
is_timeout = true;
}
if(task_item.max_wdog_tick[cur_task->task_id] < cur_task->wdog_tick)
{
task_item.max_wdog_tick[cur_task->task_id] = cur_task->wdog_tick;
}
}
}
if(is_timeout == false)
{
wdog_tick = 0;
drv_wdog_feed();
}
else if(wdog_tick++ >= 2000)
{
//bms_soft_reset_save(kSoftReset_Wdog, NULL, 0);
//drv_misc_reset_mcu();
}
}
KitResult bsp_task_creat(TaskArray* task, uint8_t * name)
{
uint8_t res;
KIT_ASSERT_PARAM(task != NULL);
if((task != NULL) && (task->task_id < OS_MAX_TASKS))
{
OS_ERR err;
//CPU_STK *Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, task->stk_size * sizeof(CPU_STK));
OSTaskCreate((OS_TCB *)task->task_tcb,
(CPU_CHAR *)name,
(OS_TASK_PTR )task_template,
(void *)task,
(OS_PRIO )task->task_prio,
(CPU_STK *)task->stk_array,
(CPU_STK_SIZE )task->stk_size/10,
(CPU_STK_SIZE )task->stk_size,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
task_item.task_array[task->task_id] = task;
}
return (KitResult)res;
}
void bsp_task_feed_wdog(uint32_t tick)
{
TaskArray *cur_task;
if(OSPrioCur < OS_MAX_TASKS)
{
cur_task = task_item.task_array[OSPrioCur];
if(cur_task != NULL)
{
cur_task->wdog_tick = (cur_task->wdog_tick > tick) ? (cur_task->wdog_tick - tick) : 0;
}
}
}
uint32_t bsp_task_delay_ms(uint32_t dly)
{
OS_ERR err;
bsp_task_feed_wdog(dly);
OSTimeDly(dly, OS_OPT_TIME_DLY, &err);
return dly;
}
void bsp_task_set_timeout_call(UintArgCall call)
{
if(call != NULL)
{
task_item.reset_call = call;
}
}
uint16_t bsp_task_get_max_wdog_tick(uint8_t task_id)
{
uint16_t tmp = 0;
if(task_id < OS_MAX_TASKS)
{
tmp = task_item.max_wdog_tick[task_id];
}
return tmp;
}