YB_Platform/public/ape_spu/osp/src/osp_timer.s.c
lishuang.xie 8ef0c57f2b fix bug#1953 from dev_ck_v2.1_bug#1953# to dev_ck_v2.1
1. add new shell command: reg_ape to print the timer task info;
2. update the function of osp_timer_sync;
3. add new testcase of case1 to test the timer(t_offset < 10)
4. Test:
   4.1 spu_case0_arm_case0:  Pass;
   4.2 spu_case1_arm_case20: Pass;
   4.3 spu_case14_arm_case20:Pass;
   4.4 spu_case20_arm_case20:Pass;
   4.5 spu_case24_arm_case24:Pass;
   4.6 spu_case34_arm_case5: Pass;
   4.7 spu_case44_arm_case5: Pass;
2024-05-18 15:25:31 +08:00

339 lines
9.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "osp_timer.h"
#include "err_num.h"
#include "osp_msg.h"
#include "osp_sw_queue.h"
#include "osp_task.h"
#include "osp_sem.h"
#include "ucp_printf.h"
#include "ucp_tick.h"
osp_id_timer_t g_task_off_tbl[10][100] = {0}; /* 根据定时点任务分解成时隙偏移任务ID */
osp_timer_desc g_osp_timer_desc[OSP_TIMER_TASK_MAX] ={0}; /* 定时点任务与定时点信息汇总 */
int g_osp_timer_desc_idx = 0;
extern int find_lsb(uint32_t u32_val);
extern void ape_mtimer_sync(int nScsId);
extern void ape_mtimer_unsync(int nScsId);
uint8_t gu8_register_task_group[10][OSP_TIMER_TASK_MAX] = {0}; /* 100 -> OSP_TIMER_TASK_MAX一个时隙最多20个定时点任务 */
uint16_t g_reg_task_index = 0;
stStcTimerPoint g_stcTimerPoint[OSP_TMR_POINT_MAX] = {0};
void osp_timer_clear_stctimer()
{
uint16_t u16_loop = 0;
memset(g_stcTimerPoint, 0, sizeof(g_stcTimerPoint));
for (u16_loop = 0; u16_loop < 10; u16_loop++)
{
g_stcTimerPoint[u16_loop*OSP_TIMER_TASK_MAX].pointVal = 0;
g_stcTimerPoint[u16_loop*OSP_TIMER_TASK_MAX].lastFlag = 1;
}
stc_timer_set_tmrpoint(g_stcTimerPoint);
}
/* 删除所有定时点任务 */
void osp_timer_clear_task()
{
uint16_t u16_loop = 0;
for (u16_loop = 0; u16_loop < g_osp_timer_desc_idx; u16_loop++)
{
if ((g_osp_timer_desc[u16_loop].task_id) > 0)
{
osp_del_timer_task(g_osp_timer_desc[u16_loop].task_id);
}
}
}
/* OSP侧定时点任务初始化 */
void osp_timer_init()
{
g_osp_timer_desc_idx = 0;
g_reg_task_index = 0;
memset(g_osp_timer_desc, 0, sizeof(g_osp_timer_desc));
memset(gu8_register_task_group, 0, sizeof(gu8_register_task_group));
memset(g_task_off_tbl, 0, sizeof(g_task_off_tbl));
memset(g_stcTimerPoint, 0, sizeof(g_stcTimerPoint));
return ;
}
/* 静态定时点注册 */
uint32_t osp_task_timer_cfg(osp_timer_cfg_inf *timer_tbl, int apeid)
{
while(timer_tbl->apeid_bitmap != 0xffff)
{
if(timer_tbl->apeid_bitmap & (1<<apeid))
{
if(g_osp_timer_desc_idx >= OSP_TIMER_COUNTS)
{
UCP_PRINT_ERROR("timer cfg is overflow\n\r");
return -OSP_PAR_ILL;
}
g_osp_timer_desc[g_osp_timer_desc_idx].t_offset = timer_tbl->t_offset;
g_osp_timer_desc[g_osp_timer_desc_idx].slot_bitmap = timer_tbl->slot_bitmap;
g_osp_timer_desc[g_osp_timer_desc_idx].task_id = timer_tbl->task_id;
g_osp_timer_desc_idx++;
}
timer_tbl++;
}
return OSP_OK;
}
/* 使能任务定时点 */
/*
函数参数tti时间周期的长度1000us/500us/250us/125us等
*/
short lastOffset = 0;
void osp_timer_sync(int scsId)
{
#ifdef UCP_TICK_ENABLE
uint32_t clockBegin,clockEnd;
int32_t clockCnt;
rdmcycle(&clockBegin);
#endif
int i = 0;
int j = 0;
int stc_timer_index = 0;
ape_mtimer_sync(scsId); // scs id
int tmp_bitmap = 0;
int tbl_index = 0;
int slot_id = 0;
int tmp_cnt = 0;
osp_timer_desc *ptr = g_osp_timer_desc;
for(i = 0; i < g_osp_timer_desc_idx; i++)
{
tmp_bitmap = ptr->slot_bitmap;
tbl_index = ptr->t_offset/10;
if (tbl_index > 99) /* g_task_off_tbl[10][100] */
{
UCP_PRINT_ERROR("t_offset[%d] overflow", ptr->t_offset);
return ;
}
while(tmp_bitmap != 0)
{
slot_id = find_lsb(tmp_bitmap);
tmp_bitmap &= ~(1 << slot_id);
g_task_off_tbl[slot_id][tbl_index].task_id = ptr->task_id;
g_task_off_tbl[slot_id][tbl_index].t_offset = ptr->t_offset;
//UCP_PRINT_ERROR("i=%d,j=%d,taskid=%d,offset=%d", slot_id,tbl_index, ptr->task_id, ptr->t_offset);
}
tmp_cnt++;
ptr++;
}
if (tmp_cnt > 0)
{
for(i = 0; i < 10; i++)
{
stc_timer_index = 0;
for(j = 0; j < 100; j++)
{
if (OSP_TIMER_TASK_MAX <= stc_timer_index)
{
UCP_PRINT_ERROR("one slot timer tasks overflow\n\r");
return ;
}
if (0 == j)
{
g_stcTimerPoint[i*OSP_TIMER_TASK_MAX + stc_timer_index].pointVal = 0;
g_stcTimerPoint[i*OSP_TIMER_TASK_MAX + stc_timer_index].lastFlag = 0;
stc_timer_index++;
lastOffset = 0;
if (0 == g_task_off_tbl[i][j].task_id)
{
/* 第一个点无task id 或偏移非0需要加一个假的 */
gu8_register_task_group[i][stc_timer_index-1] = 0;
g_reg_task_index++;
}
else
{
if (0 == g_task_off_tbl[i][j].t_offset)
{
/* 第一个点有真实数据,用真实数据 */
gu8_register_task_group[i][stc_timer_index-1] = (uint8_t)(g_task_off_tbl[i][j].task_id);
g_reg_task_index++;
}
else
{
/* 第一个点无task id 或偏移非0需要加一个假的 */
gu8_register_task_group[i][stc_timer_index-1] = 0;
g_reg_task_index++;
g_stcTimerPoint[i*OSP_TIMER_TASK_MAX + stc_timer_index].pointVal = g_task_off_tbl[i][j].t_offset - lastOffset; //g_stcTimerPoint[i*50 + stc_timer_index-1].pointVal;
g_stcTimerPoint[i*OSP_TIMER_TASK_MAX + stc_timer_index].lastFlag = 0;
lastOffset = g_task_off_tbl[i][j].t_offset;
stc_timer_index++;
gu8_register_task_group[i][stc_timer_index-1] = (uint8_t)(g_task_off_tbl[i][j].task_id);
g_reg_task_index++;
}
}
}
else
{
if(g_task_off_tbl[i][j].task_id != 0)
{
g_stcTimerPoint[i*OSP_TIMER_TASK_MAX + stc_timer_index].pointVal = g_task_off_tbl[i][j].t_offset - lastOffset; //g_stcTimerPoint[i*50 + stc_timer_index-1].pointVal;
g_stcTimerPoint[i*OSP_TIMER_TASK_MAX + stc_timer_index].lastFlag = 0;
lastOffset = g_task_off_tbl[i][j].t_offset;
stc_timer_index++;
gu8_register_task_group[i][stc_timer_index-1] = (uint8_t)(g_task_off_tbl[i][j].task_id);
g_reg_task_index++;
}
}
}
/* 补最后一个的状态 */
g_stcTimerPoint[i*OSP_TIMER_TASK_MAX + stc_timer_index -1].lastFlag = 1;
}
stc_timer_set_tmrpoint(g_stcTimerPoint);
#ifdef OSP_DEBUG_TEST
debug_write(OSP_DEBUG_POT(g_ape_id, 90), g_reg_task_index);
#endif
}
#ifdef UCP_TICK_ENABLE
rdmcycle(&clockEnd);
clockCnt = clockEnd - clockBegin;
debug_write(OSP_DEBUG_POT(g_ape_id, 205), clockCnt);
#endif
return ;
}
void osp_register_task_group_show(void)
{
for(int i=0;i<10 ;i++)
{
for(int j=0;j<20;j++)
{
UCP_PRINT_ERROR("taskid:%d[%d,%d]",gu8_register_task_group[i][j],i,j);
}
}
}
void osp_timer_unsync(int scsId)
{
ape_mtimer_unsync(scsId); // scs id
/* 删除所有定时点配置 */
osp_timer_clear_stctimer();
/* 删除所有定时点任务 */
osp_timer_clear_task();
/* 定时点模块初始化 */
osp_timer_init();
}
void osp_timer_unsync_notask(int scs_id)
{
ape_mtimer_unsync(scs_id); // scs id
/* 删除所有定时点配置 */
osp_timer_clear_stctimer();
/* 定时点模块初始化 */
osp_timer_init();
return ;
}
#ifdef UCP_OSP_DBG_ENABLE
uint32_t g_timer_num = 0;
uint32_t g_timer_task = 0;
uint32_t g_timer_notask = 0;
uint32_t g_u16_osp_timer_call_loop = 0;
#endif
#if 0
int get_register_task_id(int index)
{
return (int)g_register_task_buf[index];
}
void osp_timer_call_task()
{
int task_id = 0;
#ifdef UCP_OSP_DBG_ENABLE
g_timer_num++;
debug_write(OSP_DEBUG_POT(g_ape_id, 94), g_timer_num);
uint32_t clockTick = 0;
rdmcycle(&clockTick);
debug_write(OSP2_DEBUG_POT(g_ape_id, g_u16_osp_timer_call_loop), clockTick);
g_u16_osp_timer_call_loop = (g_u16_osp_timer_call_loop+1)&0x1FF; /* 512个计数循环覆盖 */
#endif
if (g_mtimer_loop >= g_mtimer_cnt)
{
g_mtimer_loop = 0;
}
task_id = get_register_task_id(g_mtimer_loop);
if(task_id > 0)
{
#ifdef UCP_OSP_DBG_ENABLE
g_timer_task++;
debug_write(OSP_DEBUG_POT(g_ape_id, 95), g_timer_task);
debug_write(OSP_DEBUG_POT(g_ape_id, 92), task_id);
#endif
osp_post_timer_event_sem(task_id);
}
else
{
#ifdef UCP_OSP_DBG_ENABLE
g_timer_notask++;
debug_write(OSP_DEBUG_POT(g_ape_id, 96), g_timer_notask);
#endif
}
g_mtimer_loop++;
return ;
}
void osp_timer_restart(void)
{
g_mtimer_loop = 0;
return ;
}
#endif
void osp_timer_call_task_spe(uint8_t u8slot, uint8_t u8taskidx)
{
int task_id = gu8_register_task_group[u8slot][u8taskidx];
if(task_id > 0)
{
#ifdef UCP_OSP_DBG_ENABLE
g_timer_task++;
debug_write(OSP_DEBUG_POT(g_ape_id, 95), g_timer_task);
debug_write(OSP_DEBUG_POT(g_ape_id, 92), task_id);//ape1 0xb7e02530
#endif
osp_post_timer_event_sem(task_id);
}
else
{
#ifdef UCP_OSP_DBG_ENABLE
g_timer_notask++;
debug_write(OSP_DEBUG_POT(g_ape_id, 97), task_id);
debug_write(OSP_DEBUG_POT(g_ape_id, 98), u8taskidx);
debug_write(OSP_DEBUG_POT(g_ape_id, 96), g_timer_notask);
#endif
}
return ;
}