1. fix UCP4008-SL feature #1640;

2. add csu config file for cpri csu 2period;
3. add test case22(SCS15K).
This commit is contained in:
xinxin.li 2024-01-29 14:57:56 +08:00
parent 0456ba42e4
commit 43e55934c3
14 changed files with 5533 additions and 0 deletions

View File

@ -0,0 +1,85 @@
#ifndef _CPRI_CSU_NR_2PERIOD_H_
#define _CPRI_CSU_NR_2PERIOD_H_
#include "typedef.h"
#include "cpri_csu_api.h"
#define CPRI_NR2PERIOD_ID_NUM 6
//#define CPRI_LINK_START_ADDR 0x721E800
#define CPRI_NR2PERIOD_TX_DUMMY1_COMPRESS_LEN 0x1348
#define CPRI_NR2PERIOD_TX_DUMMY1_AXCDATA_LEN 0x26900
#define CPRI_NR2PERIOD_TX_DUMMY1_COMPRESS_ADDR 0xB4200000 // 0x1348
#define CPRI_NR2PERIOD_TX_DUMMY1_AXC1DATA_ADDR (CPRI_NR2PERIOD_TX_DUMMY1_COMPRESS_ADDR+CPRI_NR2PERIOD_TX_DUMMY1_COMPRESS_LEN)//0xB4201348 // 0x26900
#define CPRI_NR2PERIOD_TX_DUMMY1_AXC2DATA_ADDR (CPRI_NR2PERIOD_TX_DUMMY1_AXC1DATA_ADDR+CPRI_NR2PERIOD_TX_DUMMY1_AXCDATA_LEN) //0xB4227C48 // 0x26900
#define CPRI_NR2PERIOD_TX_DUMMY1_AXC3DATA_ADDR (CPRI_NR2PERIOD_TX_DUMMY1_AXC2DATA_ADDR+CPRI_NR2PERIOD_TX_DUMMY1_AXCDATA_LEN) //0xB424E548 // 0x26900
#define CPRI_NR2PERIOD_TX_DUMMY1_AXC4DATA_ADDR (CPRI_NR2PERIOD_TX_DUMMY1_AXC3DATA_ADDR+CPRI_NR2PERIOD_TX_DUMMY1_AXCDATA_LEN) //0xB4274E48 // 0x26900
#define CPRI_NR2PERIOD_TX_DUMMY1_AGC_ADDR (CPRI_NR2PERIOD_TX_DUMMY1_AXC4DATA_ADDR+CPRI_NR2PERIOD_TX_DUMMY1_AXCDATA_LEN) //0xB429B748 // 0x1348
#define CPRI_NR2PERIOD_TX_DUMMY2_COMPRESS_LEN 0x2248
#define CPRI_NR2PERIOD_TX_DUMMY2_AXCDATA_LEN 0x44900
#define CPRI_NR2PERIOD_TX_DUMMY2_COMPRESS_ADDR 0xB429CA90 // 0x2248
#define CPRI_NR2PERIOD_TX_DUMMY2_AXC1DATA_ADDR (CPRI_NR2PERIOD_TX_DUMMY2_COMPRESS_ADDR+CPRI_NR2PERIOD_TX_DUMMY2_COMPRESS_LEN)//0xB429ECD8 // 0x44900
#define CPRI_NR2PERIOD_TX_DUMMY2_AXC2DATA_ADDR (CPRI_NR2PERIOD_TX_DUMMY2_AXC1DATA_ADDR+CPRI_NR2PERIOD_TX_DUMMY2_AXCDATA_LEN) //0xB42E35D8 // 0x44900
#define CPRI_NR2PERIOD_TX_DUMMY2_AXC3DATA_ADDR (CPRI_NR2PERIOD_TX_DUMMY2_AXC2DATA_ADDR+CPRI_NR2PERIOD_TX_DUMMY2_AXCDATA_LEN) //0xB4327ED8 // 0x44900
#define CPRI_NR2PERIOD_TX_DUMMY2_AXC4DATA_ADDR (CPRI_NR2PERIOD_TX_DUMMY2_AXC3DATA_ADDR+CPRI_NR2PERIOD_TX_DUMMY2_AXCDATA_LEN) //0xB436C7D8 // 0x44900
#define CPRI_NR2PERIOD_TX_DUMMY2_AGC_ADDR (CPRI_NR2PERIOD_TX_DUMMY2_AXC4DATA_ADDR+CPRI_NR2PERIOD_TX_DUMMY2_AXCDATA_LEN) //0xB43B10D8 // 0x2248
#define CPRI_NR2PERIOD_RX_DUMMY1_COMPRESS_LEN 0x39DC
#define CPRI_NR2PERIOD_RX_DUMMY1_AXCDATA_LEN 0x73B80
#define CPRI_NR2PERIOD_RX_DUMMY1_COMPRESS_ADDR 0xB43B3320 // 0x39DC
#define CPRI_NR2PERIOD_RX_DUMMY1_AXC1DATA_ADDR (CPRI_NR2PERIOD_RX_DUMMY1_COMPRESS_ADDR+CPRI_NR2PERIOD_RX_DUMMY1_COMPRESS_LEN)//0xB43B6CFC // 0x73B80
#define CPRI_NR2PERIOD_RX_DUMMY1_AXC2DATA_ADDR (CPRI_NR2PERIOD_RX_DUMMY1_AXC1DATA_ADDR+CPRI_NR2PERIOD_RX_DUMMY1_AXCDATA_LEN) //0xB442A87C // // 0x73B80
#define CPRI_NR2PERIOD_RX_DUMMY1_AXC3DATA_ADDR (CPRI_NR2PERIOD_RX_DUMMY1_AXC2DATA_ADDR+CPRI_NR2PERIOD_RX_DUMMY1_AXCDATA_LEN) //0xB449E3FC // 0x73B80
#define CPRI_NR2PERIOD_RX_DUMMY1_AXC4DATA_ADDR (CPRI_NR2PERIOD_RX_DUMMY1_AXC3DATA_ADDR+CPRI_NR2PERIOD_RX_DUMMY1_AXCDATA_LEN) //0xB4511F7C // 0x73B80
#define CPRI_NR2PERIOD_RX_DUMMY1_AGC_ADDR (CPRI_NR2PERIOD_RX_DUMMY1_AXC4DATA_ADDR+CPRI_NR2PERIOD_RX_DUMMY1_AXCDATA_LEN) //0xB4585AFC // 0x39DC
#define CPRI_NR2PERIOD_RX_DUMMY2_COMPRESS_LEN 0x2ADC
#define CPRI_NR2PERIOD_RX_DUMMY2_AXCDATA_LEN 0x55B80
#define CPRI_NR2PERIOD_RX_DUMMY2_COMPRESS_ADDR 0xB45894D8 // 0x73B8
#define CPRI_NR2PERIOD_RX_DUMMY2_AXC1DATA_ADDR (CPRI_NR2PERIOD_RX_DUMMY2_COMPRESS_ADDR+CPRI_NR2PERIOD_RX_DUMMY2_COMPRESS_LEN)//0xB458BFB4 // 0x55B80
#define CPRI_NR2PERIOD_RX_DUMMY2_AXC2DATA_ADDR (CPRI_NR2PERIOD_RX_DUMMY2_AXC1DATA_ADDR+CPRI_NR2PERIOD_RX_DUMMY2_AXCDATA_LEN) //0xB45E1B34 // 0x55B80
#define CPRI_NR2PERIOD_RX_DUMMY2_AXC3DATA_ADDR (CPRI_NR2PERIOD_RX_DUMMY2_AXC2DATA_ADDR+CPRI_NR2PERIOD_RX_DUMMY2_AXCDATA_LEN) //0xB46376B4 // 0x55B80
#define CPRI_NR2PERIOD_RX_DUMMY2_AXC4DATA_ADDR (CPRI_NR2PERIOD_RX_DUMMY2_AXC3DATA_ADDR+CPRI_NR2PERIOD_RX_DUMMY2_AXCDATA_LEN) //0xB468D234 // 0x55B80
#define CPRI_NR2PERIOD_RX_DUMMY2_AGC_ADDR (CPRI_NR2PERIOD_RX_DUMMY2_AXC4DATA_ADDR+CPRI_NR2PERIOD_RX_DUMMY2_AXCDATA_LEN) //0xB46E2DB4 // 0x2ADC
#if 0
#define CPRI_NR7DS2U_TX_SLOT_EVEN_F7SYMBOL_ADDR 0x9F00000 // SM2
#define CPRI_NR7DS2U_TX_SLOT_ODD_F7SYMBOL_ADDR 0x9FF0400 // SM2
#define CPRI_NR7DS2U_TX_SLOT_EVEN_B7SYMBOL_ADDR 0xA380000 // SM5
#define CPRI_NR7DS2U_TX_SLOT_ODD_B7SYMBOL_ADDR 0xA290400 // SM4
#define CPRI_NR7DS2U_TX_SLOT_EVEN_COMPRESS_ADDR 0x9F3C100
#define CPRI_NR7DS2U_TX_SLOT_ODD_COMPRESS_ADDR 0xA02C500
#else
#define CPRI_NR2PERIOD_TX_SLOT_EVEN_F7SYMBOL_ADDR 0x60F00000
#define CPRI_NR2PERIOD_TX_SLOT_EVEN_B7SYMBOL_ADDR 0x61380000
#define CPRI_NR2PERIOD_TX_SLOT_ODD_F7SYMBOL_ADDR 0x60FF0400
#define CPRI_NR2PERIOD_TX_SLOT_ODD_B7SYMBOL_ADDR 0x61290400
#define CPRI_NR2PERIOD_TX_SLOT_EVEN_COMPRESS_ADDR 0x60F3C100
#define CPRI_NR2PERIOD_TX_SLOT_ODD_COMPRESS_ADDR 0x6102C500
#endif
#define CPRI_NR2PERIOD_TX_SLOT_EVEN_AGC_ADDR 0xB533D800
#define CPRI_NR2PERIOD_TX_SLOT_ODD_AGC_ADDR 0xB533E700
#define CPRI_NR2PERIOD_RX_SLOTS_COMPRESS_ADDR 0x6BC00000 // 0x448
#define CPRI_NR2PERIOD_RX_SLOTS_AXCDATA_ADDR 0x6BC00448 // 0x22400
#define CPRI_NR2PERIOD_RX_SLOT_EVEN_COMPRESS_ADDR 0x6BC22848 // 0xF00
#define CPRI_NR2PERIOD_RX_SLOT_EVEN_AXCDATA_ADDR 0x6BC23748 // 0x78000
#define CPRI_NR2PERIOD_RX_SLOT_ODD_COMPRESS_ADDR 0x6BC9B748 // 0xF00
#define CPRI_NR2PERIOD_RX_SLOT_ODD_AXCDATA_ADDR 0x6BC9C648 // 0x78000
#define CPRI_NR2PERIOD_RX_SLOTS_AGC_ADDR 0xB533F600
#define CPRI_NR2PERIOD_RX_SLOT_EVEN_AGC_ADDR 0xB533FA48
#define CPRI_NR2PERIOD_RX_SLOT_ODD_AGC_ADDR 0xB5340948
void cpri_csu_axc_init_nr_2period(uint32_t nDummyFlag, stCpriCsuCmdFifoInfo* pTxCmdFifo, stCpriCsuCmdFifoInfo* pRxCmdFifo);
void cpri_csu_axc_latch_init_nr_2period(void);
void cpri_csu_axc_link_init_nr_2period(int32_t testMode);
void cpri_csu_axc_paramreg_init_nr_2period();
void cpri_csu_axc_cmd_gen_2period(stCpriCsuCmdFifoInfo* pTxCmdFifo, stCpriCsuCmdFifoInfo* pRxCmdFifo);
void cpri_csu_start_nr_2period(stCpriCsuCmdFifoInfo tx_cmdfifo, stCpriCsuCmdFifoInfo rx_cmdfifo);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,60 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : ape_test_case1.s.c
// Author :
// Created On : 2022-10-26
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "typedef.h"
#include "ucp_printf.h"
#include "phy_para.h"
#include "rfm1_drv.h"
/************************************************************************/
extern void cpri_init(uint32_t option,uint32_t MappingMode);
extern void jesd_init();
extern void ecpri_init(uint8_t nOption);
int32_t fh_data_init(void)
{
return 0;
}
int32_t fh_drv_init()
{
stFrontHaulDrvPara fhDrvPara;
memset_ucp(&fhDrvPara, 0, sizeof(stFrontHaulDrvPara));
fhDrvPara.protocolSel = PROTOCOL_CPRI;
fhDrvPara.rateOption = CPRI_OPTION_8;
fhDrvPara.mapOption = OTIC_MAP_FIGURE12;
fronthaul_drv_cfg(&fhDrvPara);
return 0;
}
int32_t fh_csu_test_init(void)
{
return 0;
}
void fh_test_case()
{
return;
}
void fh_data_check(uint32_t times)
{
return;
}

View File

@ -0,0 +1,139 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : ape_test_case1.s.c
// Author :
// Created On : 2022-10-26
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "typedef.h"
#include "osp_task.h"
#include "osp_timer.h"
#include "ucp_printf.h"
/************************************************************************/
void ape0_event_task(uint32_t addr, uint32_t size);
void ape0_event_task_del(uint32_t addr, uint32_t size);
void ape0_test_task_reg(void)
{
osp_task_info_ex ape0_event_task_info = {50, (int8_t*)"ape0_event_task", 50, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape0_event_task};
osp_task_info_ex ape0_event_task_info_del = {51, (int8_t*)"ape0_event_task_del", 51, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape0_event_task_del};
osp_task_create(&ape0_event_task_info);
osp_task_create(&ape0_event_task_info_del);
return ;
}
/************************************************************************/
void ape1_event_task(uint32_t addr, uint32_t size);
void ape1_event_task_del(uint32_t addr, uint32_t size);
void ape1_test_task_reg(void)
{
osp_task_info_ex ape1_event_task_info = {50, (int8_t*)"ape1_event_task", 50, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape1_event_task};
osp_task_info_ex ape1_event_task_info_del = {51, (int8_t*)"ape1_event_task_del", 51, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape1_event_task_del};
osp_task_create(&ape1_event_task_info);
osp_task_create(&ape1_event_task_info_del);
return ;
}
/************************************************************************/
void ape2_event_task(uint32_t addr, uint32_t size);
void ape2_event_task_del(uint32_t addr, uint32_t size);
void ape2_test_task_reg(void)
{
osp_task_info_ex ape2_event_task_info = {50, (int8_t*)"ape2_event_task", 50, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape2_event_task};
osp_task_info_ex ape2_event_task_info_del = {51, (int8_t*)"ape2_event_task_del", 51, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape2_event_task_del};
osp_task_create(&ape2_event_task_info);
osp_task_create(&ape2_event_task_info_del);
return ;
}
/************************************************************************/
void ape3_event_task(uint32_t addr, uint32_t size);
void ape3_event_task_del(uint32_t addr, uint32_t size);
void ape3_test_task_reg(void)
{
osp_task_info_ex ape3_event_task_info = {50, (int8_t*)"ape3_event_task", 50, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape3_event_task};
osp_task_info_ex ape3_event_task_info_del = {51, (int8_t*)"ape3_event_task_del", 51, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape3_event_task_del};
osp_task_create(&ape3_event_task_info);
osp_task_create(&ape3_event_task_info_del);
return ;
}
/************************************************************************/
void ape4_event_task(uint32_t addr, uint32_t size);
void ape4_event_task_del(uint32_t addr, uint32_t size);
void ape4_test_task_reg(void)
{
osp_task_info_ex ape4_event_task_info = {50, (int8_t*)"ape4_event_task", 50, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape4_event_task};
osp_task_info_ex ape4_event_task_info_del = {51, (int8_t*)"ape4_event_task_del", 51, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape4_event_task_del};
osp_task_create(&ape4_event_task_info);
osp_task_create(&ape4_event_task_info_del);
return ;
}
/************************************************************************/
void ape5_event_task(uint32_t addr, uint32_t size);
void ape5_event_task_del(uint32_t addr, uint32_t size);
void ape5_test_task_reg(void)
{
osp_task_info_ex ape5_event_task_info = {50, (int8_t*)"ape5_event_task", 50, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape5_event_task};
osp_task_info_ex ape5_event_task_info_del = {51, (int8_t*)"ape5_event_task_del", 51, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape5_event_task_del};
osp_task_create(&ape5_event_task_info);
osp_task_create(&ape5_event_task_info_del);
return ;
}
/************************************************************************/
void ape6_event_task(uint32_t addr, uint32_t size);
void ape6_event_task_del(uint32_t addr, uint32_t size);
void ape6_test_task_reg(void)
{
osp_task_info_ex ape6_event_task_info = {50, (int8_t*)"ape6_event_task", 50, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape6_event_task};
osp_task_info_ex ape6_event_task_info_del = {51, (int8_t*)"ape6_event_task_del", 51, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape6_event_task_del};
osp_task_create(&ape6_event_task_info);
osp_task_create(&ape6_event_task_info_del);
return ;
}
/************************************************************************/
void ape7_event_task(uint32_t addr, uint32_t size);
void ape7_event_task_del(uint32_t addr, uint32_t size);
void ape7_test_task_reg(void)
{
osp_task_info_ex ape7_event_task_info = {50, (int8_t*)"ape7_event_task", 50, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape7_event_task};
osp_task_info_ex ape7_event_task_info_del = {51, (int8_t*)"ape7_event_task_del", 51, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape7_event_task_del};
osp_task_create(&ape7_event_task_info);
osp_task_create(&ape7_event_task_info_del);
return ;
}

View File

@ -0,0 +1,475 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : case21_ape0_task.s.c
// Author :
// Created On : 2023-01-05
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "ucp_utility.h"
#include "ucp_tick.h"
#include "ucp_printf.h"
#include "phy_para.h"
#include "osp_msg.h"
#include "ucp_testcase.h"
#include "msg_transfer_layer.h"
#include "ucp_port.h"
#include "ape_mtimer.h"
#include "osp_task.h"
#include "osp_timer.h"
/***************************************************************/
/* 事件任务相关打点 */
static uint32_t g_u32_case22_ape0_event1_rev_num = 0; // 30 0xB7E00078
static uint32_t g_u32_case22_ape0_event1_rev_ok = 0; // 31 0xB7E0007C
static uint32_t g_u32_case22_ape0_event1_addr_err = 0; // 32 0xB7E00080
static uint32_t g_u32_case22_ape0_event1_tick = 0;
static uint32_t g_u32_case22_ape0_event1_tick_err = 0; // 33 0xB7E00084
static uint32_t g_u32_case22_ape0_event1_sfn_slot_err = 0; // 35 0xB7E0008C
static uint32_t g_u32_case22_ape0_event1_alloc1_err = 0; // 40 0xB7E000A0
static uint32_t g_u32_case22_ape0_event1_send1_err = 0; // 41 0xB7E000A4
static uint32_t g_u32_case22_ape0_event1_alloc2_err = 0; // 42 0xB7E000A8
static uint32_t g_u32_case22_ape0_event1_send2_err = 0; // 43 0xB7E000AC
static uint32_t g_u32_case22_ape0_event1_send_ok = 0; // 44 0xB7E000B0
static uint32_t g_u32_case22_ape0_event2_num = 0; // 45 0xB7E000B4
static uint32_t g_u32_case22_ape0_event3_num = 0; // 46 0xB7E000B8
/* 收到ARM侧发来的消息通过RFM转发 */
void ape0_event1_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
uint32_t msg_addr = 0;
uint32_t que_num = 0;
uint32_t value = 0;
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = 0;
uint16_t slot = 0;
uint16_t sfn_l = 0;
uint16_t slot_l = 0;
uint32_t u32_clock_offset = 0;
uint32_t u32_clock_tick = 0;
char *paddr = NULL;
int ret = 0;
g_u32_case22_ape0_event1_rev_num++;
if (0 == addr)
{
g_u32_case22_ape0_event1_addr_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 32), g_u32_case22_ape0_event1_addr_err);
return ;
}
msg_addr = do_read(addr);
que_num = do_read(addr+4);
value = *(uint32_t*)msg_addr;
sfn = value >> 16;
slot = value & 0xffff;
//msg_transfer_free_msg(TEST_QUE_PORT_ID, que_num, 0, (char*)msg_addr);
g_u32_case22_ape0_event1_rev_ok++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 30), g_u32_case22_ape0_event1_rev_num);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 31), g_u32_case22_ape0_event1_rev_ok);
rdmcycle(&u32_clock_tick);
if (0 == g_u32_case22_ape0_event1_tick)
{
g_u32_case22_ape0_event1_tick = u32_clock_tick;
}
else
{
if (u32_clock_tick > g_u32_case22_ape0_event1_tick)
{
u32_clock_offset = u32_clock_tick - g_u32_case22_ape0_event1_tick;
if ((u32_clock_offset > TIMER_OFFSET_MAX_15K) || (u32_clock_offset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape0_event1_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 33), g_u32_case22_ape0_event1_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 34), u32_clock_offset);
}
}
g_u32_case22_ape0_event1_tick = u32_clock_tick;
}
sfn_l = get_tx_nr_sfn(scs);
slot_l = get_tx_nr_slot(scs);
if ((sfn != sfn_l) || (slot != slot_l))
{
g_u32_case22_ape0_event1_sfn_slot_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 35), g_u32_case22_ape0_event1_sfn_slot_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 36), sfn);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 37), sfn_l);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 38), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 39), slot_l);
}
/* 给本核event3发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape0_event1_alloc1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 40), g_u32_case22_ape0_event1_alloc1_err);
return ;
}
do_write(paddr, g_u32_case22_ape0_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INNER,
ape_id, // src que id
ape_id, // dst que id
40, // src task id
42); // dst task id
if (0 != ret)
{
g_u32_case22_ape0_event1_send1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 41), g_u32_case22_ape0_event1_send1_err);
//return ;
}
/* 给其核event2发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape0_event1_alloc2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case22_ape0_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape0_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
ape_id+1, // dst que id
40, // src task id
41); // dst task id
if (0 != ret)
{
g_u32_case22_ape0_event1_send2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case22_ape0_event1_send2_err);
return ;
}
/* 给ape2 event1发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
//g_u32_case21_ape0_event1_alloc2_err++;
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case21_ape0_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape0_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
2, // ape2
40, // src task id
40); // dst task id
if (0 != ret)
{
//g_u32_case21_ape0_event1_send2_err++;
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case21_ape0_event1_send2_err);
return ;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 44), ++g_u32_case22_ape0_event1_send_ok);
return ;
}
/* 收到他核event1发来的消息 */
void ape0_event2_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape0_event2_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 45), g_u32_case22_ape0_event2_num);
return ;
}
/* 收到本核event1发来的消息 */
void ape0_event3_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape0_event3_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 46), g_u32_case22_ape0_event3_num);
return ;
}
/***************************************************************/
/* 定时时任务相关打点 */
static uint32_t g_u32_case22_ape0_timer1_slot_no_continuous = 0; // 50 0xB7E000C8
static uint32_t g_u32_case22_ape0_timer1_sfn_no_continuous = 0; // 51 0xB7E000CC
static uint32_t g_u32_case22_ape0_timer1_slot_indication = 0; // 52 0xB7E000D0
static uint32_t g_u32_case22_ape0_timer1_update_sfn_slot = 0; // 53 0xB7E000D4
static uint32_t g_u32_case22_ape0_timer1_process_cnt = 0; // 54 0xB7E000D8
static uint32_t g_u32_case22_ape0_timer1_process_tick = 0; // 55 0xB7E000DC
static uint32_t g_u32_case22_ape0_timer1_process_tick_err = 0; // 56 0xB7E000E0
static uint32_t g_u32_case22_ape0_timer2_process_cnt = 0; // 57 0xB7E000E4
static uint32_t g_u32_case22_ape0_timer2_process_tick = 0; // 58 0xB7E000E8
static uint32_t g_u32_case22_ape0_timer2_process_tick_err = 0; // 59 0xB7E000EC
static uint32_t g_u32_case22_ape0_timer2_tx_slot_max = 0; // 64 0xB7E00100
static uint32_t g_u32_case22_ape0_timer2_tx_slot_min = 0x32000;//65 0xB7E00104
static uint32_t g_u32_case22_ape0_timer2_tx_slot_cur = 0; // 66 0xB7E00108
static uint32_t g_u32_case22_ape0_timer2_rx_slot_max = 0; // 67 0xB7E0010C
static uint32_t g_u32_case22_ape0_timer2_rx_slot_min = 0x32000; // 68 0xB7E00110
static uint32_t g_u32_case22_ape0_timer2_rx_slot_cur = 0; // 69 0xB7E00114
static uint16_t gPreviousSlot = 0;
static uint16_t gCurrentSlot = 0;
static uint8_t gSlotFlagInit = 1;
static uint8_t gSfnFlagInit = 1;
static uint16_t gPreviousSfn = 0;
static uint16_t gCurrentSfn = 0;
static inline void check_continuous_slot(uint16_t slot)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSlotFlagInit == 1)
{
gSlotFlagInit = 0;
gCurrentSlot = slot;
}
else
{
gPreviousSlot = gCurrentSlot;
gCurrentSlot = slot;
delta = (SFN_SLOT_NUM_15K + gCurrentSlot - gPreviousSlot) % SFN_SLOT_NUM_15K;
if (delta != 1)
{
debug_write(DBG_DDR_COMMON_IDX(ape_id, 50), ++g_u32_case22_ape0_timer1_slot_no_continuous);
}
}
return;
}
static inline void check_continuous_sfn(uint16_t sfn)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSfnFlagInit == 1)
{
gSfnFlagInit = 0;
gCurrentSfn = sfn;
}
else
{
gPreviousSfn = gCurrentSfn;
gCurrentSfn = sfn;
delta = (1024 + gCurrentSfn - gPreviousSfn) % 1024;
if (delta != 1) {
debug_write(DBG_DDR_COMMON_IDX(ape_id, 51), ++g_u32_case22_ape0_timer1_sfn_no_continuous);
}
}
return;
}
uint32_t gu32_ape0_send_cnt = 0;
static inline void send_slot_indication(void)
{
uint16_t scs = LTE_SCS_ID;
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t value = (sfn << 16) + slot;
uint32_t ape_id = get_core_id();
uint32_t size = 8;
char* buf;
uint32_t availableSize,offset;
uint16_t cu_flag = U_PLANE;//C_PLANE;
HandleId_t handler;
handler.port_id = get_ucp_port_id();
handler.inst_id = 0;
handler.type_id = CU_SPLIT;
int32_t ret = msg_transfer_send_start(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 60), handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 61), ++gu32_ape0_send_cnt);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 62), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 63), 0xffff);
ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset);
if (SUCCESS != ret)
{
UCP_PRINT_ERROR("send_slot_indication C_PLANE ret[0x%08x]", ret);
return;
}
uint32_t clockBegin;
rdmcycle(&clockBegin);
do_write(buf, value);
do_write(buf+4, clockBegin);
ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size);
ret = msg_transfer_send_end(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 52), ++g_u32_case22_ape0_timer1_slot_indication);
return;
}
static inline void update_sfn_slot(void)
{
uint32_t clockBegin;
rdmcycle(&clockBegin);
uint16_t scs = LTE_SCS_ID;//30KHz
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 53), ++g_u32_case22_ape0_timer1_update_sfn_slot);
UCP_PRINT_ERROR("ape[0x%x]:enter[%d], sfn[%d], slot[%d].", ape_id, g_u32_case22_ape0_timer1_update_sfn_slot, sfn, slot);
check_continuous_slot(slot);
if (slot == 0) {
check_continuous_sfn(sfn);
}
return;
}
/* 定时点任务 */
void ape0_timer1_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 54), ++g_u32_case22_ape0_timer1_process_cnt);
update_sfn_slot();
send_slot_indication();
if (0 == g_u32_case22_ape0_timer1_process_tick)
{
g_u32_case22_ape0_timer1_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape0_timer1_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape0_timer1_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape0_timer1_process_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), clockOffset);
}
}
g_u32_case22_ape0_timer1_process_tick = clockTick;
}
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), g_u32_case20_ape0_timer1_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 56), g_u32_case22_ape0_timer1_process_tick_err);
return;
}
void ape0_timer2_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
g_u32_case22_ape0_timer2_tx_slot_cur = get_tx_nr_slot_cycle();
g_u32_case22_ape0_timer2_rx_slot_cur = get_rx_nr_slot_cycle();
g_u32_case22_ape0_timer2_tx_slot_max = get_max(g_u32_case22_ape0_timer2_tx_slot_cur, g_u32_case22_ape0_timer2_tx_slot_max);
g_u32_case22_ape0_timer2_tx_slot_min = get_min(g_u32_case22_ape0_timer2_tx_slot_cur, g_u32_case22_ape0_timer2_tx_slot_min);
g_u32_case22_ape0_timer2_rx_slot_max = get_max(g_u32_case22_ape0_timer2_rx_slot_cur, g_u32_case22_ape0_timer2_rx_slot_max);
g_u32_case22_ape0_timer2_rx_slot_min = get_min(g_u32_case22_ape0_timer2_rx_slot_cur, g_u32_case22_ape0_timer2_rx_slot_min);
g_u32_case22_ape0_timer2_process_cnt++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 57), g_u32_case22_ape0_timer2_process_cnt);
if (0 == g_u32_case22_ape0_timer2_process_tick)
{
g_u32_case22_ape0_timer2_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape0_timer2_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape0_timer2_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape0_timer2_process_tick_err++;
}
}
g_u32_case22_ape0_timer2_process_tick = clockTick;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 58), g_u32_case22_ape0_timer2_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 59), g_u32_case22_ape0_timer2_process_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 64), g_u32_case22_ape0_timer2_tx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 65), g_u32_case22_ape0_timer2_tx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 66), g_u32_case22_ape0_timer2_tx_slot_cur);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 67), g_u32_case22_ape0_timer2_rx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 68), g_u32_case22_ape0_timer2_rx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 69), g_u32_case22_ape0_timer2_rx_slot_cur);
return ;
}
/*************************************************************************/
/* 收到消息后创建任务 */
void ape0_event_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x01010101);
osp_task_info_ex ape0_task_event1 = {40, (int8_t*)"ape0_task_event1", 40, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape0_event1_task};
osp_task_info_ex ape0_task_event2 = {41, (int8_t*)"ape0_task_event2", 41, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape0_event2_task};
osp_task_info_ex ape0_task_event3 = {42, (int8_t*)"ape0_task_event3", 42, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape0_event3_task};
osp_task_info_ex ape0_task_timer1 = {43, (int8_t*)"ape0_task_timer1", 43, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 0, NULL, (OSP_TASKENTRY_FUNC)ape0_timer1_task};
osp_task_info_ex ape0_task_timer2 = {44, (int8_t*)"ape0_task_timer2", 44, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 200, NULL, (OSP_TASKENTRY_FUNC)ape0_timer2_task};
osp_task_create(&ape0_task_event1);
osp_task_create(&ape0_task_event2);
osp_task_create(&ape0_task_event3);
osp_task_create(&ape0_task_timer1);
osp_task_create(&ape0_task_timer2);
osp_timer_sync(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x03030303);
return;
}
/* 收到消息后删除任务 */
void ape0_event_task_del(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x05050505);
//osp_del_task_all(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x06060606);
return;
}

View File

@ -0,0 +1,502 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : case20_ape1_task.s.c
// Author :
// Created On : 2023-01-05
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "ucp_utility.h"
#include "ucp_tick.h"
#include "ucp_printf.h"
#include "phy_para.h"
#include "osp_msg.h"
#include "ucp_testcase.h"
#include "msg_transfer_layer.h"
#include "ucp_port.h"
#include "ape_mtimer.h"
#include "osp_task.h"
#include "osp_timer.h"
/***************************************************************/
/* 事件任务相关打点 */
static uint32_t g_u32_case22_ape1_event1_rev_num = 0; // 30 0xB7E00278
static uint32_t g_u32_case22_ape1_event1_rev_ok = 0; // 31 0xB7E0027C
static uint32_t g_u32_case22_ape1_event1_addr_err = 0; // 32 0xB7E00280
static uint32_t g_u32_case22_ape1_event1_tick = 0;
static uint32_t g_u32_case22_ape1_event1_tick_err = 0; // 33 0xB7E00284
static uint32_t g_u32_case22_ape1_event1_sfn_slot_err = 0; // 35 0xB7E0028C
static uint32_t g_u32_case22_ape1_event1_alloc1_err = 0; // 40 0xB7E002A0
static uint32_t g_u32_case22_ape1_event1_send1_err = 0; // 41 0xB7E002A4
static uint32_t g_u32_case22_ape1_event1_alloc2_err = 0; // 42 0xB7E002A8
static uint32_t g_u32_case22_ape1_event1_send2_err = 0; // 43 0xB7E002AC
static uint32_t g_u32_case22_ape1_event1_send_ok = 0; // 44 0xB7E002B0
static uint32_t g_u32_case22_ape1_recv_msg_tick_err = 0; // DBG_DDR_MSG_IDX(20) 0xB7E04050(ape0)/0xB7E04350(ape1)
static uint32_t g_u32_case22_ape1_event2_num = 0; // 45 0xB7E002B4
static uint32_t g_u32_case22_ape1_event3_num = 0; // 46 0xB7E002B8
/* 收到ARM侧发来的消息通过RFM转发 */
void ape1_event1_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
uint32_t msg_addr = 0;
uint32_t que_num = 0;
uint32_t value = 0;
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = 0;
uint16_t slot = 0;
uint16_t sfn_l = 0;
uint16_t slot_l = 0;
uint32_t u32_clock_offset = 0;
uint32_t u32_clock_tick = 0;
uint32_t tick_from_ape_tx = 0;
uint32_t tick_from_arm_rx = 0;
uint32_t tick_from_arm_tx = 0;
uint32_t tick_from_rfm_rx = 0;
uint32_t tick_from_rfm_tx = 0;
uint32_t tick_from_ape_rx = 0;
uint32_t offset_loopback = 0;
char *paddr = NULL;
int ret = 0;
g_u32_case22_ape1_event1_rev_num++;
if (0 == addr)
{
g_u32_case22_ape1_event1_addr_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 32), g_u32_case22_ape1_event1_addr_err);
return ;
}
msg_addr = do_read(addr);
que_num = do_read(addr+4);
value = *(uint32_t*)msg_addr;
sfn = value >> 16;
slot = value & 0xffff;
//msg_transfer_free_msg(TEST_QUE_PORT_ID, que_num, 0, (char*)msg_addr);
g_u32_case22_ape1_event1_rev_ok++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 30), g_u32_case22_ape1_event1_rev_num);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 31), g_u32_case22_ape1_event1_rev_ok);
rdmcycle(&u32_clock_tick);
tick_from_ape_tx = do_read(msg_addr+4);
tick_from_arm_rx = do_read(msg_addr+8);
tick_from_arm_tx = do_read(msg_addr+12);
tick_from_rfm_rx = do_read(msg_addr+16);
tick_from_rfm_tx = do_read(msg_addr+20);
offset_loopback = (tick_from_ape_rx - tick_from_ape_tx + TICK_PP1S_OFFSET)%TICK_PP1S_OFFSET;
if (offset_loopback >= LOOPBACK_APE_OFFSET)
{
if (g_u32_case22_ape1_recv_msg_tick_err < CASE0_APE0_RX_ERR_MAX_NUM)
{
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape1_recv_msg_tick_err + 21)), offset_loopback);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape1_recv_msg_tick_err + 22)), tick_from_ape_tx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape1_recv_msg_tick_err + 23)), tick_from_arm_rx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape1_recv_msg_tick_err + 24)), tick_from_arm_tx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape1_recv_msg_tick_err + 25)), tick_from_rfm_rx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape1_recv_msg_tick_err + 26)), tick_from_rfm_tx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape1_recv_msg_tick_err + 27)), tick_from_ape_rx);
}
g_u32_case22_ape1_recv_msg_tick_err++;
debug_write(DBG_DDR_MSG_IDX(que_num, 20), g_u32_case22_ape1_recv_msg_tick_err);
}
if (0 == g_u32_case22_ape1_event1_tick)
{
g_u32_case22_ape1_event1_tick = u32_clock_tick;
}
else
{
if (u32_clock_tick > g_u32_case22_ape1_event1_tick)
{
u32_clock_offset = u32_clock_tick - g_u32_case22_ape1_event1_tick;
if ((u32_clock_offset > TIMER_OFFSET_MAX_15K) || (u32_clock_offset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape1_event1_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 33), g_u32_case22_ape1_event1_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 34), u32_clock_offset);
}
}
g_u32_case22_ape1_event1_tick = u32_clock_tick;
}
sfn_l = get_tx_nr_sfn(scs);
slot_l = get_tx_nr_slot(scs);
if ((sfn != sfn_l) || (slot != slot_l))
{
g_u32_case22_ape1_event1_sfn_slot_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 35), g_u32_case22_ape1_event1_sfn_slot_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 36), sfn);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 37), sfn_l);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 38), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 39), slot_l);
}
/* 给本核event3发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape1_event1_alloc1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 40), g_u32_case22_ape1_event1_alloc1_err);
return ;
}
do_write(paddr, g_u32_case22_ape1_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INNER,
ape_id, // src que id
ape_id, // dst que id
40, // src task id
42); // dst task id
if (0 != ret)
{
g_u32_case22_ape1_event1_send1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 41), g_u32_case22_ape1_event1_send1_err);
//return ;
}
/* 给其核event2发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape1_event1_alloc2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case22_ape1_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape1_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
ape_id+1, // dst que id
40, // src task id
41); // dst task id
if (0 != ret)
{
g_u32_case22_ape1_event1_send2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case22_ape1_event1_send2_err);
return ;
}
/* 给ape3 event1发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
//g_u32_case21_ape1_event1_alloc2_err++;
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case21_ape1_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape1_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
3, // ape3
40, // src task id
40); // dst task id
if (0 != ret)
{
//g_u32_case21_ape1_event1_send2_err++;
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case21_ape1_event1_send2_err);
return ;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 44), ++g_u32_case22_ape1_event1_send_ok);
return ;
}
/* 收到他核event1发来的消息 */
void ape1_event2_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape1_event2_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 45), g_u32_case22_ape1_event2_num);
return ;
}
/* 收到本核event1发来的消息 */
void ape1_event3_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape1_event3_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 46), g_u32_case22_ape1_event3_num);
return ;
}
/***************************************************************/
/* 定时时任务相关打点 */
static uint32_t g_u32_case22_ape1_timer1_slot_no_continuous = 0; // 50 0xB7E002C8
static uint32_t g_u32_case22_ape1_timer1_sfn_no_continuous = 0; // 51 0xB7E002CC
static uint32_t g_u32_case22_ape1_timer1_slot_indication = 0; // 52 0xB7E002D0
static uint32_t g_u32_case22_ape1_timer1_update_sfn_slot = 0; // 53 0xB7E002D4
static uint32_t g_u32_case22_ape1_timer1_process_cnt = 0; // 54 0xB7E002D8
static uint32_t g_u32_case22_ape1_timer1_process_tick = 0; // 55 0xB7E002DC
static uint32_t g_u32_case22_ape1_timer1_process_tick_err = 0; // 56 0xB7E002E0
static uint32_t g_u32_case22_ape1_timer2_process_cnt = 0; // 57 0xB7E002E4
static uint32_t g_u32_case22_ape1_timer2_process_tick = 0; // 58 0xB7E002E8
static uint32_t g_u32_case22_ape1_timer2_process_tick_err = 0; // 59 0xB7E002EC
static uint32_t g_u32_case22_ape1_timer2_tx_slot_max = 0; // 64 0xB7E00300
static uint32_t g_u32_case22_ape1_timer2_tx_slot_min = 0x32000;//65 0xB7E00304
static uint32_t g_u32_case22_ape1_timer2_tx_slot_cur = 0; // 66 0xB7E00308
static uint32_t g_u32_case22_ape1_timer2_rx_slot_max = 0; // 67 0xB7E0030C
static uint32_t g_u32_case22_ape1_timer2_rx_slot_min = 0x32000; // 68 0xB7E00310
static uint32_t g_u32_case22_ape1_timer2_rx_slot_cur = 0; // 69 0xB7E00314
static uint16_t gPreviousSlot = 0;
static uint16_t gCurrentSlot = 0;
static uint8_t gSlotFlagInit = 1;
static uint8_t gSfnFlagInit = 1;
static uint16_t gPreviousSfn = 0;
static uint16_t gCurrentSfn = 0;
static inline void check_continuous_slot(uint16_t slot)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSlotFlagInit == 1)
{
gSlotFlagInit = 0;
gCurrentSlot = slot;
}
else
{
gPreviousSlot = gCurrentSlot;
gCurrentSlot = slot;
delta = (SFN_SLOT_NUM_15K + gCurrentSlot - gPreviousSlot) % SFN_SLOT_NUM_15K;
if (delta != 1)
{
debug_write(DBG_DDR_COMMON_IDX(ape_id, 50), ++g_u32_case22_ape1_timer1_slot_no_continuous);
}
}
return;
}
static inline void check_continuous_sfn(uint16_t sfn)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSfnFlagInit == 1)
{
gSfnFlagInit = 0;
gCurrentSfn = sfn;
}
else
{
gPreviousSfn = gCurrentSfn;
gCurrentSfn = sfn;
delta = (1024 + gCurrentSfn - gPreviousSfn) % 1024;
if (delta != 1) {
debug_write(DBG_DDR_COMMON_IDX(ape_id, 51), ++g_u32_case22_ape1_timer1_sfn_no_continuous);
}
}
return;
}
uint32_t gu32_ape1_send_cnt = 0; //(61) 0xb7e002f4
static inline void send_slot_indication(void)
{
uint16_t scs = LTE_SCS_ID;
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t value = (sfn << 16) + slot;
uint32_t ape_id = get_core_id();
uint32_t size = 8;
char* buf;
uint32_t availableSize,offset;
uint16_t cu_flag = C_PLANE;//U_PLANE;
HandleId_t handler;
handler.port_id = get_ucp_port_id();
handler.inst_id = 0;
handler.type_id = CU_SPLIT;
int32_t ret = msg_transfer_send_start(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 60), handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 61), ++gu32_ape1_send_cnt);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 62), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 63), 0xffff);
ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset);
if (SUCCESS != ret)
{
UCP_PRINT_ERROR("send_slot_indication C_PLANE ret[0x%08x]", ret);
return;
}
uint32_t clockBegin;
rdmcycle(&clockBegin);
do_write(buf, value);
do_write(buf+4, clockBegin);
ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size);
ret = msg_transfer_send_end(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 52), ++g_u32_case22_ape1_timer1_slot_indication);
return;
}
static inline void update_sfn_slot(void)
{
uint32_t clockBegin;
rdmcycle(&clockBegin);
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 53), ++g_u32_case22_ape1_timer1_update_sfn_slot);
UCP_PRINT_ERROR("ape[0x%x]:enter[%d], sfn[%d], slot[%d].", ape_id, g_u32_case22_ape1_timer1_update_sfn_slot, sfn, slot);
check_continuous_slot(slot);
if (slot == 0) {
check_continuous_sfn(sfn);
}
return;
}
/* 定时点任务 */
void ape1_timer1_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 54), ++g_u32_case22_ape1_timer1_process_cnt);
update_sfn_slot();
send_slot_indication();
if (0 == g_u32_case22_ape1_timer1_process_tick)
{
g_u32_case22_ape1_timer1_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape1_timer1_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape1_timer1_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape1_timer1_process_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), clockOffset);
}
}
g_u32_case22_ape1_timer1_process_tick = clockTick;
}
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), g_u32_case20_ape1_timer1_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 56), g_u32_case22_ape1_timer1_process_tick_err);
return;
}
void ape1_timer2_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
g_u32_case22_ape1_timer2_tx_slot_cur = get_tx_nr_slot_cycle();
g_u32_case22_ape1_timer2_rx_slot_cur = get_rx_nr_slot_cycle();
g_u32_case22_ape1_timer2_tx_slot_max = get_max(g_u32_case22_ape1_timer2_tx_slot_cur, g_u32_case22_ape1_timer2_tx_slot_max);
g_u32_case22_ape1_timer2_tx_slot_min = get_min(g_u32_case22_ape1_timer2_tx_slot_cur, g_u32_case22_ape1_timer2_tx_slot_min);
g_u32_case22_ape1_timer2_rx_slot_max = get_max(g_u32_case22_ape1_timer2_rx_slot_cur, g_u32_case22_ape1_timer2_rx_slot_max);
g_u32_case22_ape1_timer2_rx_slot_min = get_min(g_u32_case22_ape1_timer2_rx_slot_cur, g_u32_case22_ape1_timer2_rx_slot_min);
g_u32_case22_ape1_timer2_process_cnt++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 57), g_u32_case22_ape1_timer2_process_cnt);
if (0 == g_u32_case22_ape1_timer2_process_tick)
{
g_u32_case22_ape1_timer2_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape1_timer2_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape1_timer2_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape1_timer2_process_tick_err++;
}
}
g_u32_case22_ape1_timer2_process_tick = clockTick;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 58), g_u32_case22_ape1_timer2_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 59), g_u32_case22_ape1_timer2_process_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 64), g_u32_case22_ape1_timer2_tx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 65), g_u32_case22_ape1_timer2_tx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 66), g_u32_case22_ape1_timer2_tx_slot_cur);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 67), g_u32_case22_ape1_timer2_rx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 68), g_u32_case22_ape1_timer2_rx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 69), g_u32_case22_ape1_timer2_rx_slot_cur);
return ;
}
/*************************************************************************/
/* 收到消息后创建任务 */
void ape1_event_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x01010101);
osp_task_info_ex ape1_task_event1 = {40, (int8_t*)"ape1_task_event1", 40, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape1_event1_task};
osp_task_info_ex ape1_task_event2 = {41, (int8_t*)"ape1_task_event2", 41, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape1_event2_task};
osp_task_info_ex ape1_task_event3 = {42, (int8_t*)"ape1_task_event3", 42, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape1_event3_task};
osp_task_info_ex ape1_task_timer1 = {43, (int8_t*)"ape1_task_timer1", 43, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 0, NULL, (OSP_TASKENTRY_FUNC)ape1_timer1_task};
osp_task_info_ex ape1_task_timer2 = {44, (int8_t*)"ape1_task_timer2", 44, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 200, NULL, (OSP_TASKENTRY_FUNC)ape1_timer2_task};
osp_task_create(&ape1_task_event1);
osp_task_create(&ape1_task_event2);
osp_task_create(&ape1_task_event3);
osp_task_create(&ape1_task_timer1);
osp_task_create(&ape1_task_timer2);
osp_timer_sync(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x03030303);
return;
}
/* 收到消息后删除任务 */
void ape1_event_task_del(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x05050505);
//osp_del_task_all(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x06060606);
return;
}

View File

@ -0,0 +1,453 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : case20_ape2_task.s.c
// Author :
// Created On : 2023-01-05
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "ucp_utility.h"
#include "ucp_tick.h"
#include "ucp_printf.h"
#include "phy_para.h"
#include "osp_msg.h"
#include "ucp_testcase.h"
#include "msg_transfer_layer.h"
#include "ucp_port.h"
#include "ape_mtimer.h"
#include "osp_task.h"
#include "osp_timer.h"
/***************************************************************/
/* 事件任务相关打点 */
static uint32_t g_u32_case22_ape2_event1_rev_num = 0; // 30 0xB7E00478
static uint32_t g_u32_case22_ape2_event1_rev_ok = 0; // 31 0xB7E0047C
static uint32_t g_u32_case22_ape2_event1_addr_err = 0; // 32 0xB7E00480
//static uint32_t g_u32_case22_ape2_event1_tick = 0;
//static uint32_t g_u32_case22_ape2_event1_tick_err = 0; // 33 0xB7E00484
//static uint32_t g_u32_case22_ape2_event1_sfn_slot_err = 0; // 35 0xB7E0048C
static uint32_t g_u32_case22_ape2_event1_alloc1_err = 0; // 40 0xB7E004A0
static uint32_t g_u32_case22_ape2_event1_send1_err = 0; // 41 0xB7E004A4
static uint32_t g_u32_case22_ape2_event1_alloc2_err = 0; // 42 0xB7E004A8
static uint32_t g_u32_case22_ape2_event1_send2_err = 0; // 43 0xB7E004AC
static uint32_t g_u32_case22_ape2_event1_send_ok = 0; // 44 0xB7E004B0
static uint32_t g_u32_case22_ape2_event2_num = 0; // 45 0xB7E004B4
static uint32_t g_u32_case22_ape2_event3_num = 0; // 46 0xB7E004B8
/* 收到ARM侧发来的消息通过RFM转发 */
void ape2_event1_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
uint32_t msg_addr = 0;
uint32_t que_num = 0;
uint32_t value = 0;
//uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = 0;
uint16_t slot = 0;
//uint16_t sfn_l = 0;
//uint16_t slot_l = 0;
//uint32_t u32_clock_offset = 0;
//uint32_t u32_clock_tick = 0;
char *paddr = NULL;
int ret = 0;
g_u32_case22_ape2_event1_rev_num++;
if (0 == addr)
{
g_u32_case22_ape2_event1_addr_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 32), g_u32_case22_ape2_event1_addr_err);
return ;
}
msg_addr = do_read(addr);
que_num = do_read(addr+4);
value = *(uint32_t*)msg_addr;
sfn = value >> 16;
slot = value & 0xffff;
//msg_transfer_free_msg(TEST_QUE_PORT_ID, que_num, 0, (char*)msg_addr);
g_u32_case22_ape2_event1_rev_ok++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 30), g_u32_case22_ape2_event1_rev_num);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 31), g_u32_case22_ape2_event1_rev_ok);
#if 0
rdmcycle(&u32_clock_tick);
if (0 == g_u32_case22_ape2_event1_tick)
{
g_u32_case22_ape2_event1_tick = u32_clock_tick;
}
else
{
if (u32_clock_tick > g_u32_case22_ape2_event1_tick)
{
u32_clock_offset = u32_clock_tick - g_u32_case22_ape2_event1_tick;
if ((u32_clock_offset > TIMER_OFFSET_MAX_15K) || (u32_clock_offset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape2_event1_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 33), g_u32_case21_ape2_event1_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 34), u32_clock_offset);
}
}
g_u32_case22_ape2_event1_tick = u32_clock_tick;
}
sfn_l = get_tx_nr_sfn(scs);
slot_l = get_tx_nr_slot(scs);
if ((sfn != sfn_l) || (slot != slot_l))
{
g_u32_case21_ape2_event1_sfn_slot_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 35), g_u32_case22_ape2_event1_sfn_slot_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 36), sfn);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 37), sfn_l);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 38), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 39), slot_l);
}
#endif
/* 给本核event3发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape2_event1_alloc1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 40), g_u32_case22_ape2_event1_alloc1_err);
return ;
}
do_write(paddr, g_u32_case22_ape2_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INNER,
ape_id, // src que id
ape_id, // dst que id
40, // src task id
42); // dst task id
if (0 != ret)
{
g_u32_case22_ape2_event1_send1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 41), g_u32_case22_ape2_event1_send1_err);
//return ;
}
/* 给其核event2发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape2_event1_alloc2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case22_ape2_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape2_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
ape_id+1, // dst que id
40, // src task id
41); // dst task id
if (0 != ret)
{
g_u32_case22_ape2_event1_send2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case22_ape2_event1_send2_err);
return ;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 44), ++g_u32_case22_ape2_event1_send_ok);
return ;
}
/* 收到他核event1发来的消息 */
void ape2_event2_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape2_event2_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 45), g_u32_case22_ape2_event2_num);
return ;
}
/* 收到本核event1发来的消息 */
void ape2_event3_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape2_event3_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 46), g_u32_case22_ape2_event3_num);
return ;
}
/***************************************************************/
/* 定时时任务相关打点 */
static uint32_t g_u32_case22_ape2_timer1_slot_no_continuous = 0; // 50 0xB7E004C8
static uint32_t g_u32_case22_ape2_timer1_sfn_no_continuous = 0; // 51 0xB7E004CC
//static uint32_t g_u32_case22_ape2_timer1_slot_indication = 0; // 52 0xB7E004D0
static uint32_t g_u32_case22_ape2_timer1_update_sfn_slot = 0; // 53 0xB7E004D4
static uint32_t g_u32_case22_ape2_timer1_process_cnt = 0; // 54 0xB7E004D8
static uint32_t g_u32_case22_ape2_timer1_process_tick = 0; // 55 0xB7E004DC
static uint32_t g_u32_case22_ape2_timer1_process_tick_err = 0; // 56 0xB7E004E0
static uint32_t g_u32_case22_ape2_timer2_process_cnt = 0; // 57 0xB7E004E4
static uint32_t g_u32_case22_ape2_timer2_process_tick = 0; // 58 0xB7E004E8
static uint32_t g_u32_case22_ape2_timer2_process_tick_err = 0; // 59 0xB7E004EC
static uint32_t g_u32_case22_ape2_timer2_tx_slot_max = 0; // 64 0xB7E00500
static uint32_t g_u32_case22_ape2_timer2_tx_slot_min = 0x32000;//65 0xB7E00504
static uint32_t g_u32_case22_ape2_timer2_tx_slot_cur = 0; // 66 0xB7E00508
static uint32_t g_u32_case22_ape2_timer2_rx_slot_max = 0; // 67 0xB7E0050C
static uint32_t g_u32_case22_ape2_timer2_rx_slot_min = 0x32000; // 68 0xB7E00510
static uint32_t g_u32_case22_ape2_timer2_rx_slot_cur = 0; // 69 0xB7E00514
static uint16_t gPreviousSlot = 0;
static uint16_t gCurrentSlot = 0;
static uint8_t gSlotFlagInit = 1;
static uint8_t gSfnFlagInit = 1;
static uint16_t gPreviousSfn = 0;
static uint16_t gCurrentSfn = 0;
static inline void check_continuous_slot(uint16_t slot)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSlotFlagInit == 1)
{
gSlotFlagInit = 0;
gCurrentSlot = slot;
}
else
{
gPreviousSlot = gCurrentSlot;
gCurrentSlot = slot;
delta = (SFN_SLOT_NUM_15K + gCurrentSlot - gPreviousSlot) % SFN_SLOT_NUM_15K;
if (delta != 1)
{
debug_write(DBG_DDR_COMMON_IDX(ape_id, 50), ++g_u32_case22_ape2_timer1_slot_no_continuous);
}
}
return;
}
static inline void check_continuous_sfn(uint16_t sfn)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSfnFlagInit == 1)
{
gSfnFlagInit = 0;
gCurrentSfn = sfn;
}
else
{
gPreviousSfn = gCurrentSfn;
gCurrentSfn = sfn;
delta = (1024 + gCurrentSfn - gPreviousSfn) % 1024;
if (delta != 1) {
debug_write(DBG_DDR_COMMON_IDX(ape_id, 51), ++g_u32_case22_ape2_timer1_sfn_no_continuous);
}
}
return;
}
#if 0
uint32_t gu32_send_cnt = 0;
static inline void send_slot_indication(void)
{
uint16_t scs = LTE_SCS_ID;
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t value = (sfn << 16) + slot;
uint32_t ape_id = get_core_id();
uint32_t size = 8;
char* buf;
uint32_t availableSize,offset;
uint16_t cu_flag = C_PLANE;
HandleId_t handler;
handler.port_id = get_ucp_port_id();
handler.inst_id = 0;
handler.type_id = CU_SPLIT;
int32_t ret = msg_transfer_send_start(handler.value);
//UCP_PRINT_ERROR("value(0x%x), inst(%d)", handler.value, handler.inst_id);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 60), handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 61), ++gu32_send_cnt);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 62), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 63), 0xffff);
ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset);
if (SUCCESS != ret)
{
UCP_PRINT_ERROR("send_slot_indication C_PLANE ret[0x%08x]", ret);
return;
}
uint32_t clockBegin;
rdmcycle(&clockBegin);
do_write(buf, value);
do_write(buf+4, clockBegin);
ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size);
ret = msg_transfer_send_end(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 52), ++g_u32_case22_ape2_timer1_slot_indication);
return;
}
#endif
static inline void update_sfn_slot(void)
{
uint32_t clockBegin;
rdmcycle(&clockBegin);
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 53), ++g_u32_case22_ape2_timer1_update_sfn_slot);
UCP_PRINT_ERROR("ape[0x%x]:enter[%d], sfn[%d], slot[%d].", ape_id, g_u32_case22_ape2_timer1_update_sfn_slot, sfn, slot);
check_continuous_slot(slot);
if (slot == 0) {
check_continuous_sfn(sfn);
}
return;
}
/* 定时点任务 */
void ape2_timer1_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 54), ++g_u32_case22_ape2_timer1_process_cnt);
update_sfn_slot();
//send_slot_indication();
if (0 == g_u32_case22_ape2_timer1_process_tick)
{
g_u32_case22_ape2_timer1_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape2_timer1_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape2_timer1_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape2_timer1_process_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), clockOffset);
}
}
g_u32_case22_ape2_timer1_process_tick = clockTick;
}
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), g_u32_case22_ape2_timer1_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 56), g_u32_case22_ape2_timer1_process_tick_err);
return;
}
void ape2_timer2_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
g_u32_case22_ape2_timer2_tx_slot_cur = get_tx_nr_slot_cycle();
g_u32_case22_ape2_timer2_rx_slot_cur = get_rx_nr_slot_cycle();
g_u32_case22_ape2_timer2_tx_slot_max = get_max(g_u32_case22_ape2_timer2_tx_slot_cur, g_u32_case22_ape2_timer2_tx_slot_max);
g_u32_case22_ape2_timer2_tx_slot_min = get_min(g_u32_case22_ape2_timer2_tx_slot_cur, g_u32_case22_ape2_timer2_tx_slot_min);
g_u32_case22_ape2_timer2_rx_slot_max = get_max(g_u32_case22_ape2_timer2_rx_slot_cur, g_u32_case22_ape2_timer2_rx_slot_max);
g_u32_case22_ape2_timer2_rx_slot_min = get_min(g_u32_case22_ape2_timer2_rx_slot_cur, g_u32_case22_ape2_timer2_rx_slot_min);
g_u32_case22_ape2_timer2_process_cnt++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 57), g_u32_case22_ape2_timer2_process_cnt);
if (0 == g_u32_case22_ape2_timer2_process_tick)
{
g_u32_case22_ape2_timer2_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape2_timer2_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape2_timer2_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape2_timer2_process_tick_err++;
}
}
g_u32_case22_ape2_timer2_process_tick = clockTick;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 58), g_u32_case22_ape2_timer2_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 59), g_u32_case22_ape2_timer2_process_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 64), g_u32_case22_ape2_timer2_tx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 65), g_u32_case22_ape2_timer2_tx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 66), g_u32_case22_ape2_timer2_tx_slot_cur);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 67), g_u32_case22_ape2_timer2_rx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 68), g_u32_case22_ape2_timer2_rx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 69), g_u32_case22_ape2_timer2_rx_slot_cur);
return ;
}
/*************************************************************************/
/* 收到消息后创建任务 */
void ape2_event_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x01010101);
osp_task_info_ex ape2_task_event1 = {40, (int8_t*)"ape2_task_event1", 40, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape2_event1_task};
osp_task_info_ex ape2_task_event2 = {41, (int8_t*)"ape2_task_event2", 41, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape2_event2_task};
osp_task_info_ex ape2_task_event3 = {42, (int8_t*)"ape2_task_event3", 42, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape2_event3_task};
osp_task_info_ex ape2_task_timer1 = {43, (int8_t*)"ape2_task_timer1", 43, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 0, NULL, (OSP_TASKENTRY_FUNC)ape2_timer1_task};
osp_task_info_ex ape2_task_timer2 = {44, (int8_t*)"ape2_task_timer2", 44, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 200, NULL, (OSP_TASKENTRY_FUNC)ape2_timer2_task};
osp_task_create(&ape2_task_event1);
osp_task_create(&ape2_task_event2);
osp_task_create(&ape2_task_event3);
osp_task_create(&ape2_task_timer1);
osp_task_create(&ape2_task_timer2);
osp_timer_sync(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x03030303);
return;
}
/* 收到消息后删除任务 */
void ape2_event_task_del(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x05050505);
//osp_del_task_all(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x06060606);
return;
}

View File

@ -0,0 +1,446 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : case20_ape3_task.s.c
// Author :
// Created On : 2023-01-05
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "ucp_utility.h"
#include "ucp_tick.h"
#include "ucp_printf.h"
#include "phy_para.h"
#include "osp_msg.h"
#include "ucp_testcase.h"
#include "msg_transfer_layer.h"
#include "ucp_port.h"
#include "ape_mtimer.h"
#include "osp_task.h"
#include "osp_timer.h"
/***************************************************************/
/* 事件任务相关打点 */
static uint32_t g_u32_case22_ape3_event1_rev_num = 0; // 30 0xB7E00678
static uint32_t g_u32_case22_ape3_event1_rev_ok = 0; // 31 0xB7E0067C
static uint32_t g_u32_case22_ape3_event1_addr_err = 0; // 32 0xB7E00680
//static uint32_t g_u32_case22_ape3_event1_tick = 0;
//static uint32_t g_u32_case22_ape3_event1_tick_err = 0; // 33 0xB7E00684
//static uint32_t g_u32_case22_ape3_event1_sfn_slot_err = 0; // 35 0xB7E0068C
static uint32_t g_u32_case22_ape3_event1_alloc1_err = 0; // 40 0xB7E006A0
static uint32_t g_u32_case22_ape3_event1_send1_err = 0; // 41 0xB7E006A4
static uint32_t g_u32_case22_ape3_event1_alloc2_err = 0; // 42 0xB7E006A8
static uint32_t g_u32_case22_ape3_event1_send2_err = 0; // 43 0xB7E006AC
static uint32_t g_u32_case22_ape3_event1_send_ok = 0; // 44 0xB7E006B0
static uint32_t g_u32_case22_ape3_event2_num = 0; // 45 0xB7E006B4
static uint32_t g_u32_case22_ape3_event3_num = 0; // 46 0xB7E006B8
/* 收到ARM侧发来的消息通过RFM转发 */
void ape3_event1_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
uint32_t msg_addr = 0;
uint32_t que_num = 0;
uint32_t value = 0;
//uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = 0;
uint16_t slot = 0;
///uint16_t sfn_l = 0;
//uint16_t slot_l = 0;
//uint32_t u32_clock_offset = 0;
//uint32_t u32_clock_tick = 0;
char *paddr = NULL;
int ret = 0;
g_u32_case22_ape3_event1_rev_num++;
if (0 == addr)
{
g_u32_case22_ape3_event1_addr_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 32), g_u32_case22_ape3_event1_addr_err);
return ;
}
msg_addr = do_read(addr);
que_num = do_read(addr+4);
value = *(uint32_t*)msg_addr;
sfn = value >> 16;
slot = value & 0xffff;
//msg_transfer_free_msg(TEST_QUE_PORT_ID, que_num, 0, (char*)msg_addr);
g_u32_case22_ape3_event1_rev_ok++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 30), g_u32_case22_ape3_event1_rev_num);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 31), g_u32_case22_ape3_event1_rev_ok);
#if 0
rdmcycle(&u32_clock_tick);
if (0 == g_u32_case22_ape3_event1_tick)
{
g_u32_case22_ape3_event1_tick = u32_clock_tick;
}
else
{
if (u32_clock_tick > g_u32_case22_ape3_event1_tick)
{
u32_clock_offset = u32_clock_tick - g_u32_case22_ape3_event1_tick;
if ((u32_clock_offset > TIMER_OFFSET_MAX_15K) || (u32_clock_offset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape3_event1_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 33), g_u32_case22_ape3_event1_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 34), u32_clock_offset);
}
}
g_u32_case22_ape3_event1_tick = u32_clock_tick;
}
sfn_l = get_tx_nr_sfn(scs);
slot_l = get_tx_nr_slot(scs);
if ((sfn != sfn_l) || (slot != slot_l))
{
g_u32_case21_ape3_event1_sfn_slot_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 35), g_u32_case222_ape3_event1_sfn_slot_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 36), sfn);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 37), sfn_l);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 38), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 39), slot_l);
}
#endif
/* 给本核event3发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape3_event1_alloc1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 40), g_u32_case22_ape3_event1_alloc1_err);
return ;
}
do_write(paddr, g_u32_case22_ape3_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INNER,
ape_id, // src que id
ape_id, // dst que id
40, // src task id
42); // dst task id
if (0 != ret)
{
g_u32_case22_ape3_event1_send1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 41), g_u32_case22_ape3_event1_send1_err);
//return ;
}
/* 给其核event2发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape3_event1_alloc2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case22_ape3_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape3_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
0, // send to ape0(4 apes 1 cell)
40, // src task id
41); // dst task id
if (0 != ret)
{
g_u32_case22_ape3_event1_send2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case22_ape3_event1_send2_err);
return ;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 44), ++g_u32_case22_ape3_event1_send_ok);
return ;
}
/* 收到他核event1发来的消息 */
void ape3_event2_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape3_event2_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 45), g_u32_case22_ape3_event2_num);
return ;
}
/* 收到本核event1发来的消息 */
void ape3_event3_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape3_event3_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 46), g_u32_case22_ape3_event3_num);
return ;
}
/***************************************************************/
/* 定时时任务相关打点 */
static uint32_t g_u32_case22_ape3_timer1_slot_no_continuous = 0; // 50 0xB7E006C8
static uint32_t g_u32_case22_ape3_timer1_sfn_no_continuous = 0; // 51 0xB7E006CC
//static uint32_t g_u32_case22_ape3_timer1_slot_indication = 0; // 52 0xB7E006D0
static uint32_t g_u32_case22_ape3_timer1_update_sfn_slot = 0; // 53 0xB7E006D4
static uint32_t g_u32_case22_ape3_timer1_process_cnt = 0; // 54 0xB7E006D8
static uint32_t g_u32_case22_ape3_timer1_process_tick = 0; // 55 0xB7E006DC
static uint32_t g_u32_case22_ape3_timer1_process_tick_err = 0; // 56 0xB7E006E0
static uint32_t g_u32_case22_ape3_timer2_process_cnt = 0; // 57 0xB7E006E4
static uint32_t g_u32_case22_ape3_timer2_process_tick = 0; // 58 0xB7E006E8
static uint32_t g_u32_case22_ape3_timer2_process_tick_err = 0; // 59 0xB7E006EC
static uint32_t g_u32_case22_ape3_timer2_tx_slot_max = 0; // 64 0xB7E00700
static uint32_t g_u32_case22_ape3_timer2_tx_slot_min = 0x32000;//65 0xB7E00704
static uint32_t g_u32_case22_ape3_timer2_tx_slot_cur = 0; // 66 0xB7E00708
static uint32_t g_u32_case22_ape3_timer2_rx_slot_max = 0; // 67 0xB7E0070C
static uint32_t g_u32_case22_ape3_timer2_rx_slot_min = 0x32000; // 68 0xB7E00710
static uint32_t g_u32_case22_ape3_timer2_rx_slot_cur = 0; // 69 0xB7E00714
static uint16_t gPreviousSlot = 0;
static uint16_t gCurrentSlot = 0;
static uint8_t gSlotFlagInit = 1;
static uint8_t gSfnFlagInit = 1;
static uint16_t gPreviousSfn = 0;
static uint16_t gCurrentSfn = 0;
static inline void check_continuous_slot(uint16_t slot)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSlotFlagInit == 1)
{
gSlotFlagInit = 0;
gCurrentSlot = slot;
}
else
{
gPreviousSlot = gCurrentSlot;
gCurrentSlot = slot;
delta = (SFN_SLOT_NUM_15K + gCurrentSlot - gPreviousSlot) % SFN_SLOT_NUM_15K;
if (delta != 1)
{
debug_write(DBG_DDR_COMMON_IDX(ape_id, 50), ++g_u32_case22_ape3_timer1_slot_no_continuous);
}
}
return;
}
static inline void check_continuous_sfn(uint16_t sfn)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSfnFlagInit == 1)
{
gSfnFlagInit = 0;
gCurrentSfn = sfn;
}
else
{
gPreviousSfn = gCurrentSfn;
gCurrentSfn = sfn;
delta = (1024 + gCurrentSfn - gPreviousSfn) % 1024;
if (delta != 1) {
debug_write(DBG_DDR_COMMON_IDX(ape_id, 51), ++g_u32_case22_ape3_timer1_sfn_no_continuous);
}
}
return;
}
#if 0
static inline void send_slot_indication(void)
{
uint16_t scs = LTE_SCS_ID;
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t value = (sfn << 16) + slot;
uint32_t ape_id = get_core_id();
uint32_t size = 8;
char* buf;
uint32_t availableSize,offset;
uint16_t cu_flag = U_PLANE;
HandleId_t handler;
handler.port_id = get_ucp_port_id();
handler.inst_id = 0;
handler.type_id = CU_SPLIT;
int32_t ret = msg_transfer_send_start(handler.value);
ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset);
if (SUCCESS != ret)
{
UCP_PRINT_ERROR("send_slot_indication C_PLANE ret[0x%08x]", ret);
return;
}
uint32_t clockBegin;
rdmcycle(&clockBegin);
do_write(buf, value);
do_write(buf+4, clockBegin);
ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size);
ret = msg_transfer_send_end(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 52), ++g_u32_case21_ape3_timer1_slot_indication);
return;
}
#endif
static inline void update_sfn_slot(void)
{
uint32_t clockBegin;
rdmcycle(&clockBegin);
uint16_t scs = LTE_SCS_ID;//30KHz
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 53), ++g_u32_case22_ape3_timer1_update_sfn_slot);
UCP_PRINT_ERROR("ape[0x%x]:enter[%d], sfn[%d], slot[%d].", ape_id, g_u32_case22_ape3_timer1_update_sfn_slot, sfn, slot);
check_continuous_slot(slot);
if (slot == 0) {
check_continuous_sfn(sfn);
}
return;
}
/* 定时点任务 */
void ape3_timer1_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 54), ++g_u32_case22_ape3_timer1_process_cnt);
update_sfn_slot();
//send_slot_indication();
if (0 == g_u32_case22_ape3_timer1_process_tick)
{
g_u32_case22_ape3_timer1_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape3_timer1_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape3_timer1_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape3_timer1_process_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), clockOffset);
}
}
g_u32_case22_ape3_timer1_process_tick = clockTick;
}
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), g_u32_case20_ape3_timer1_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 56), g_u32_case22_ape3_timer1_process_tick_err);
return;
}
void ape3_timer2_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
g_u32_case22_ape3_timer2_tx_slot_cur = get_tx_nr_slot_cycle();
g_u32_case22_ape3_timer2_rx_slot_cur = get_rx_nr_slot_cycle();
g_u32_case22_ape3_timer2_tx_slot_max = get_max(g_u32_case22_ape3_timer2_tx_slot_cur, g_u32_case22_ape3_timer2_tx_slot_max);
g_u32_case22_ape3_timer2_tx_slot_min = get_min(g_u32_case22_ape3_timer2_tx_slot_cur, g_u32_case22_ape3_timer2_tx_slot_min);
g_u32_case22_ape3_timer2_rx_slot_max = get_max(g_u32_case22_ape3_timer2_rx_slot_cur, g_u32_case22_ape3_timer2_rx_slot_max);
g_u32_case22_ape3_timer2_rx_slot_min = get_min(g_u32_case22_ape3_timer2_rx_slot_cur, g_u32_case22_ape3_timer2_rx_slot_min);
g_u32_case22_ape3_timer2_process_cnt++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 57), g_u32_case22_ape3_timer2_process_cnt);
if (0 == g_u32_case22_ape3_timer2_process_tick)
{
g_u32_case22_ape3_timer2_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape3_timer2_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape3_timer2_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape3_timer2_process_tick_err++;
}
}
g_u32_case22_ape3_timer2_process_tick = clockTick;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 58), g_u32_case22_ape3_timer2_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 59), g_u32_case22_ape3_timer2_process_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 64), g_u32_case22_ape3_timer2_tx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 65), g_u32_case22_ape3_timer2_tx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 66), g_u32_case22_ape3_timer2_tx_slot_cur);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 67), g_u32_case22_ape3_timer2_rx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 68), g_u32_case22_ape3_timer2_rx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 69), g_u32_case22_ape3_timer2_rx_slot_cur);
return ;
}
/*************************************************************************/
/* 收到消息后创建任务 */
void ape3_event_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x01010101);
osp_task_info_ex ape3_task_event1 = {40, (int8_t*)"ape3_task_event1", 40, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape3_event1_task};
osp_task_info_ex ape3_task_event2 = {41, (int8_t*)"ape3_task_event2", 41, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape3_event2_task};
osp_task_info_ex ape3_task_event3 = {42, (int8_t*)"ape3_task_event3", 42, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape3_event3_task};
osp_task_info_ex ape3_task_timer1 = {43, (int8_t*)"ape3_task_timer1", 43, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 0, NULL, (OSP_TASKENTRY_FUNC)ape3_timer1_task};
osp_task_info_ex ape3_task_timer2 = {44, (int8_t*)"ape3_task_timer2", 44, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 200, NULL, (OSP_TASKENTRY_FUNC)ape3_timer2_task};
osp_task_create(&ape3_task_event1);
osp_task_create(&ape3_task_event2);
osp_task_create(&ape3_task_event3);
osp_task_create(&ape3_task_timer1);
osp_task_create(&ape3_task_timer2);
osp_timer_sync(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x03030303);
return;
}
/* 收到消息后删除任务 */
void ape3_event_task_del(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x05050505);
//osp_del_task_all(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x06060606);
return;
}

View File

@ -0,0 +1,477 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : case20_ape0_task.s.c
// Author :
// Created On : 2023-01-05
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "ucp_utility.h"
#include "ucp_tick.h"
#include "ucp_printf.h"
#include "phy_para.h"
#include "osp_msg.h"
#include "ucp_testcase.h"
#include "msg_transfer_layer.h"
#include "ucp_port.h"
#include "ape_mtimer.h"
#include "osp_heap.h"
#include "osp_task.h"
#include "osp_timer.h"
/***************************************************************/
/* 事件任务相关打点 */
static uint32_t g_u32_case22_ape4_event1_rev_num = 0; // 30 0xB7E00878
static uint32_t g_u32_case22_ape4_event1_rev_ok = 0; // 31 0xB7E0087C
static uint32_t g_u32_case22_ape4_event1_addr_err = 0; // 32 0xB7E00880
static uint32_t g_u32_case22_ape4_event1_tick = 0;
static uint32_t g_u32_case22_ape4_event1_tick_err = 0; // 33 0xB7E00884
static uint32_t g_u32_case22_ape4_event1_sfn_slot_err = 0; // 35 0xB7E0088C
static uint32_t g_u32_case22_ape4_event1_alloc1_err = 0; // 40 0xB7E008A0
static uint32_t g_u32_case22_ape4_event1_send1_err = 0; // 41 0xB7E008A4
static uint32_t g_u32_case22_ape4_event1_alloc2_err = 0; // 42 0xB7E008A8
static uint32_t g_u32_case22_ape4_event1_send2_err = 0; // 43 0xB7E008AC
static uint32_t g_u32_case22_ape4_event1_send_ok = 0; // 44 0xB7E008B0
static uint32_t g_u32_case22_ape4_event2_num = 0; // 45 0xB7E008B4
static uint32_t g_u32_case22_ape4_event3_num = 0; // 46 0xB7E008B8
/* 收到ARM侧发来的消息通过RFM转发 */
void ape4_event1_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
uint32_t msg_addr = 0;
uint32_t que_num = 0;
uint32_t value = 0;
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = 0;
uint16_t slot = 0;
uint16_t sfn_l = 0;
uint16_t slot_l = 0;
uint32_t u32_clock_offset = 0;
uint32_t u32_clock_tick = 0;
char *paddr = NULL;
int ret = 0;
g_u32_case22_ape4_event1_rev_num++;
if (0 == addr)
{
g_u32_case22_ape4_event1_addr_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 32), g_u32_case22_ape4_event1_addr_err);
return ;
}
msg_addr = do_read(addr);
que_num = do_read(addr+4);
value = *(uint32_t*)msg_addr;
sfn = value >> 16;
slot = value & 0xffff;
//msg_transfer_free_msg(TEST_QUE_PORT_ID, que_num, 0, (char*)msg_addr);
g_u32_case22_ape4_event1_rev_ok++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 30), g_u32_case22_ape4_event1_rev_num);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 31), g_u32_case22_ape4_event1_rev_ok);
rdmcycle(&u32_clock_tick);
if (0 == g_u32_case22_ape4_event1_tick)
{
g_u32_case22_ape4_event1_tick = u32_clock_tick;
}
else
{
if (u32_clock_tick > g_u32_case22_ape4_event1_tick)
{
u32_clock_offset = u32_clock_tick - g_u32_case22_ape4_event1_tick;
if ((u32_clock_offset > TIMER_OFFSET_MAX_15K) || (u32_clock_offset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape4_event1_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 33), g_u32_case22_ape4_event1_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 34), u32_clock_offset);
}
}
g_u32_case22_ape4_event1_tick = u32_clock_tick;
}
sfn_l = get_tx_nr_sfn(scs);
slot_l = get_tx_nr_slot(scs);
if ((sfn != sfn_l) || (slot != slot_l))
{
g_u32_case22_ape4_event1_sfn_slot_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 35), g_u32_case22_ape4_event1_sfn_slot_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 36), sfn);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 37), sfn_l);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 38), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 39), slot_l);
}
/* 给本核event3发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape4_event1_alloc1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 40), g_u32_case22_ape4_event1_alloc1_err);
return ;
}
do_write(paddr, g_u32_case22_ape4_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INNER,
ape_id, // src que id
ape_id, // dst que id
40, // src task id
42); // dst task id
if (0 != ret)
{
g_u32_case22_ape4_event1_send1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 41), g_u32_case22_ape4_event1_send1_err);
//return ;
}
UCP_PRINT_ERROR("send_ok_1");
/* 给其核event2发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape4_event1_alloc2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case22_ape4_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape4_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
ape_id+1, // dst que id
40, // src task id
41); // dst task id
if (0 != ret)
{
g_u32_case22_ape4_event1_send2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case22_ape4_event1_send2_err);
return ;
}
/* 给ape6 event1发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
//g_u32_case21_ape4_event1_alloc2_err++;
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case21_ape4_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape4_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
6, // ape6
40, // src task id
40); // dst task id
if (0 != ret)
{
//g_u32_case21_ape4_event1_send2_err++;
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case21_ape4_event1_send2_err);
return ;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 44), ++g_u32_case22_ape4_event1_send_ok);
return ;
}
/* 收到他核event1发来的消息 */
void ape4_event2_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape4_event2_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 45), g_u32_case22_ape4_event2_num);
return ;
}
/* 收到本核event1发来的消息 */
void ape4_event3_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape4_event3_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 46), g_u32_case22_ape4_event3_num);
return ;
}
/***************************************************************/
/* 定时时任务相关打点 */
static uint32_t g_u32_case22_ape4_timer1_slot_no_continuous = 0; // 50 0xB7E008C8
static uint32_t g_u32_case22_ape4_timer1_sfn_no_continuous = 0; // 51 0xB7E008CC
static uint32_t g_u32_case22_ape4_timer1_slot_indication = 0; // 52 0xB7E008D0
static uint32_t g_u32_case22_ape4_timer1_update_sfn_slot = 0; // 53 0xB7E008D4
static uint32_t g_u32_case22_ape4_timer1_process_cnt = 0; // 54 0xB7E008D8
static uint32_t g_u32_case22_ape4_timer1_process_tick = 0; // 55 0xB7E008DC
static uint32_t g_u32_case22_ape4_timer1_process_tick_err = 0; // 56 0xB7E008E0
static uint32_t g_u32_case22_ape4_timer2_process_cnt = 0; // 57 0xB7E008E4
static uint32_t g_u32_case22_ape4_timer2_process_tick = 0; // 58 0xB7E008E8
static uint32_t g_u32_case22_ape4_timer2_process_tick_err = 0; // 59 0xB7E008EC
static uint32_t g_u32_case22_ape4_timer2_tx_slot_max = 0; // 64 0xB7E00900
static uint32_t g_u32_case22_ape4_timer2_tx_slot_min = 0x32000;//65 0xB7E00904
static uint32_t g_u32_case22_ape4_timer2_tx_slot_cur = 0; // 66 0xB7E00908
static uint32_t g_u32_case22_ape4_timer2_rx_slot_max = 0; // 67 0xB7E0090C
static uint32_t g_u32_case22_ape4_timer2_rx_slot_min = 0x32000; // 68 0xB7E00910
static uint32_t g_u32_case22_ape4_timer2_rx_slot_cur = 0; // 69 0xB7E00914
static uint16_t gPreviousSlot = 0;
static uint16_t gCurrentSlot = 0;
static uint8_t gSlotFlagInit = 1;
static uint8_t gSfnFlagInit = 1;
static uint16_t gPreviousSfn = 0;
static uint16_t gCurrentSfn = 0;
static inline void check_continuous_slot(uint16_t slot)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSlotFlagInit == 1)
{
gSlotFlagInit = 0;
gCurrentSlot = slot;
}
else
{
gPreviousSlot = gCurrentSlot;
gCurrentSlot = slot;
delta = (SFN_SLOT_NUM_15K + gCurrentSlot - gPreviousSlot) % SFN_SLOT_NUM_15K;
if (delta != 1)
{
debug_write(DBG_DDR_COMMON_IDX(ape_id, 50), ++g_u32_case22_ape4_timer1_slot_no_continuous);
}
}
return;
}
static inline void check_continuous_sfn(uint16_t sfn)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSfnFlagInit == 1)
{
gSfnFlagInit = 0;
gCurrentSfn = sfn;
}
else
{
gPreviousSfn = gCurrentSfn;
gCurrentSfn = sfn;
delta = (1024 + gCurrentSfn - gPreviousSfn) % 1024;
if (delta != 1) {
debug_write(DBG_DDR_COMMON_IDX(ape_id, 51), ++g_u32_case22_ape4_timer1_sfn_no_continuous);
}
}
return;
}
uint32_t gu32_ape4_send_cnt = 0;
static inline void send_slot_indication(void)
{
uint16_t scs = LTE_SCS_ID;
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t value = (sfn << 16) + slot;
uint32_t ape_id = get_core_id();
uint32_t size = 8;
char* buf;
uint32_t availableSize,offset;
uint16_t cu_flag = U_PLANE;//C_PLANE;
HandleId_t handler;
handler.port_id = get_ucp_port_id();
handler.inst_id = 1;
handler.type_id = CU_SPLIT;
int32_t ret = msg_transfer_send_start(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 60), handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 61), ++gu32_ape4_send_cnt);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 62), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 63), 0xffff);
ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset);
if (SUCCESS != ret)
{
UCP_PRINT_ERROR("send_slot_indication C_PLANE ret[0x%08x]", ret);
return;
}
uint32_t clockBegin;
rdmcycle(&clockBegin);
do_write(buf, value);
do_write(buf+4, clockBegin);
ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size);
ret = msg_transfer_send_end(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 52), ++g_u32_case22_ape4_timer1_slot_indication);
return;
}
static inline void update_sfn_slot(void)
{
uint32_t clockBegin;
rdmcycle(&clockBegin);
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 53), ++g_u32_case22_ape4_timer1_update_sfn_slot);
UCP_PRINT_ERROR("ape[0x%x]:enter[%d], sfn[%d], slot[%d].", ape_id, g_u32_case22_ape4_timer1_update_sfn_slot, sfn, slot);
check_continuous_slot(slot);
if (slot == 0) {
check_continuous_sfn(sfn);
}
return;
}
/* 定时点任务 */
void ape4_timer1_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 54), ++g_u32_case22_ape4_timer1_process_cnt);
update_sfn_slot();
send_slot_indication();
if (0 == g_u32_case22_ape4_timer1_process_tick)
{
g_u32_case22_ape4_timer1_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape4_timer1_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape4_timer1_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape4_timer1_process_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), clockOffset);
}
}
g_u32_case22_ape4_timer1_process_tick = clockTick;
}
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), g_u32_case22_ape0_timer1_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 56), g_u32_case22_ape4_timer1_process_tick_err);
return;
}
void ape4_timer2_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
g_u32_case22_ape4_timer2_tx_slot_cur = get_tx_nr_slot_cycle();
g_u32_case22_ape4_timer2_rx_slot_cur = get_rx_nr_slot_cycle();
g_u32_case22_ape4_timer2_tx_slot_max = get_max(g_u32_case22_ape4_timer2_tx_slot_cur, g_u32_case22_ape4_timer2_tx_slot_max);
g_u32_case22_ape4_timer2_tx_slot_min = get_min(g_u32_case22_ape4_timer2_tx_slot_cur, g_u32_case22_ape4_timer2_tx_slot_min);
g_u32_case22_ape4_timer2_rx_slot_max = get_max(g_u32_case22_ape4_timer2_rx_slot_cur, g_u32_case22_ape4_timer2_rx_slot_max);
g_u32_case22_ape4_timer2_rx_slot_min = get_min(g_u32_case22_ape4_timer2_rx_slot_cur, g_u32_case22_ape4_timer2_rx_slot_min);
g_u32_case22_ape4_timer2_process_cnt++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 57), g_u32_case22_ape4_timer2_process_cnt);
if (0 == g_u32_case22_ape4_timer2_process_tick)
{
g_u32_case22_ape4_timer2_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape4_timer2_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape4_timer2_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape4_timer2_process_tick_err++;
}
}
g_u32_case22_ape4_timer2_process_tick = clockTick;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 58), g_u32_case22_ape4_timer2_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 59), g_u32_case22_ape4_timer2_process_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 64), g_u32_case22_ape4_timer2_tx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 65), g_u32_case22_ape4_timer2_tx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 66), g_u32_case22_ape4_timer2_tx_slot_cur);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 67), g_u32_case22_ape4_timer2_rx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 68), g_u32_case22_ape4_timer2_rx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 69), g_u32_case22_ape4_timer2_rx_slot_cur);
return ;
}
/*************************************************************************/
/* 收到消息后创建任务 */
void ape4_event_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x01010101);
osp_task_info_ex ape4_task_event1 = {40, (int8_t*)"ape4_task_event1", 40, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape4_event1_task};
osp_task_info_ex ape4_task_event2 = {41, (int8_t*)"ape4_task_event2", 41, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape4_event2_task};
osp_task_info_ex ape4_task_event3 = {42, (int8_t*)"ape4_task_event3", 42, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape4_event3_task};
osp_task_info_ex ape4_task_timer1 = {43, (int8_t*)"ape4_task_timer1", 43, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 0, NULL, (OSP_TASKENTRY_FUNC)ape4_timer1_task};
osp_task_info_ex ape4_task_timer2 = {44, (int8_t*)"ape4_task_timer2", 44, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 200, NULL, (OSP_TASKENTRY_FUNC)ape4_timer2_task};
osp_task_create(&ape4_task_event1);
osp_task_create(&ape4_task_event2);
osp_task_create(&ape4_task_event3);
osp_task_create(&ape4_task_timer1);
osp_task_create(&ape4_task_timer2);
osp_timer_sync(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x03030303);
return ;
}
/* 收到消息后删除任务 */
void ape4_event_task_del(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x05050505);
//osp_del_task_all(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x06060606);
return;
}

View File

@ -0,0 +1,502 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : case20_ape1_task.s.c
// Author :
// Created On : 2023-01-05
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "ucp_utility.h"
#include "ucp_tick.h"
#include "ucp_printf.h"
#include "phy_para.h"
#include "osp_msg.h"
#include "ucp_testcase.h"
#include "msg_transfer_layer.h"
#include "ucp_port.h"
#include "ape_mtimer.h"
#include "osp_task.h"
#include "osp_timer.h"
/***************************************************************/
/* 事件任务相关打点 */
static uint32_t g_u32_case22_ape5_event1_rev_num = 0; // 30 0xB7E00A78
static uint32_t g_u32_case22_ape5_event1_rev_ok = 0; // 31 0xB7E00A7C
static uint32_t g_u32_case22_ape5_event1_addr_err = 0; // 32 0xB7E00A80
static uint32_t g_u32_case22_ape5_event1_tick = 0;
static uint32_t g_u32_case22_ape5_event1_tick_err = 0; // 33 0xB7E00A84
static uint32_t g_u32_case22_ape5_event1_sfn_slot_err = 0; // 35 0xB7E00A8C
static uint32_t g_u32_case22_ape5_event1_alloc1_err = 0; // 40 0xB7E00AA0
static uint32_t g_u32_case22_ape5_event1_send1_err = 0; // 41 0xB7E00AA4
static uint32_t g_u32_case22_ape5_event1_alloc2_err = 0; // 42 0xB7E00AA8
static uint32_t g_u32_case22_ape5_event1_send2_err = 0; // 43 0xB7E00AAC
static uint32_t g_u32_case22_ape5_event1_send_ok = 0; // 44 0xB7E00AB0
static uint32_t g_u32_case22_ape5_recv_msg_tick_err = 0; // DBG_DDR_MSG_IDX(20) 0xB7E04050(ape0)/0xB7E04350(ape1)
static uint32_t g_u32_case22_ape5_event2_num = 0; // 45 0xB7E00AB4
static uint32_t g_u32_case22_ape5_event3_num = 0; // 46 0xB7E00AB8
/* 收到ARM侧发来的消息通过RFM转发 */
void ape5_event1_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
uint32_t msg_addr = 0;
uint32_t que_num = 0;
uint32_t value = 0;
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = 0;
uint16_t slot = 0;
uint16_t sfn_l = 0;
uint16_t slot_l = 0;
uint32_t u32_clock_offset = 0;
uint32_t u32_clock_tick = 0;
uint32_t tick_from_ape_tx = 0;
uint32_t tick_from_arm_rx = 0;
uint32_t tick_from_arm_tx = 0;
uint32_t tick_from_rfm_rx = 0;
uint32_t tick_from_rfm_tx = 0;
uint32_t tick_from_ape_rx = 0;
uint32_t offset_loopback = 0;
char *paddr = NULL;
int ret = 0;
g_u32_case22_ape5_event1_rev_num++;
if (0 == addr)
{
g_u32_case22_ape5_event1_addr_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 32), g_u32_case22_ape5_event1_addr_err);
return ;
}
msg_addr = do_read(addr);
que_num = do_read(addr+4);
value = *(uint32_t*)msg_addr;
sfn = value >> 16;
slot = value & 0xffff;
//msg_transfer_free_msg(TEST_QUE_PORT_ID, que_num, 0, (char*)msg_addr);
g_u32_case22_ape5_event1_rev_ok++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 30), g_u32_case22_ape5_event1_rev_num);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 31), g_u32_case22_ape5_event1_rev_ok);
rdmcycle(&u32_clock_tick);
tick_from_ape_tx = do_read(msg_addr+4);
tick_from_arm_rx = do_read(msg_addr+8);
tick_from_arm_tx = do_read(msg_addr+12);
tick_from_rfm_rx = do_read(msg_addr+16);
tick_from_rfm_tx = do_read(msg_addr+20);
offset_loopback = (tick_from_ape_rx - tick_from_ape_tx + TICK_PP1S_OFFSET)%TICK_PP1S_OFFSET;
if (offset_loopback >= LOOPBACK_APE_OFFSET)
{
if (g_u32_case22_ape5_recv_msg_tick_err < CASE0_APE0_RX_ERR_MAX_NUM)
{
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape5_recv_msg_tick_err + 21)), offset_loopback);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape5_recv_msg_tick_err + 22)), tick_from_ape_tx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape5_recv_msg_tick_err + 23)), tick_from_arm_rx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape5_recv_msg_tick_err + 24)), tick_from_arm_tx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape5_recv_msg_tick_err + 25)), tick_from_rfm_rx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape5_recv_msg_tick_err + 26)), tick_from_rfm_tx);
debug_write(DBG_DDR_MSG_IDX(que_num, (CASE0_APE0_RX_ERR_MAX_NUM*g_u32_case22_ape5_recv_msg_tick_err + 27)), tick_from_ape_rx);
}
g_u32_case22_ape5_recv_msg_tick_err++;
debug_write(DBG_DDR_MSG_IDX(que_num, 20), g_u32_case22_ape5_recv_msg_tick_err);
}
if (0 == g_u32_case22_ape5_event1_tick)
{
g_u32_case22_ape5_event1_tick = u32_clock_tick;
}
else
{
if (u32_clock_tick > g_u32_case22_ape5_event1_tick)
{
u32_clock_offset = u32_clock_tick - g_u32_case22_ape5_event1_tick;
if ((u32_clock_offset > TIMER_OFFSET_MAX_15K) || (u32_clock_offset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape5_event1_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 33), g_u32_case22_ape5_event1_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 34), u32_clock_offset);
}
}
g_u32_case22_ape5_event1_tick = u32_clock_tick;
}
sfn_l = get_tx_nr_sfn(scs);
slot_l = get_tx_nr_slot(scs);
if ((sfn != sfn_l) || (slot != slot_l))
{
g_u32_case22_ape5_event1_sfn_slot_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 35), g_u32_case22_ape5_event1_sfn_slot_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 36), sfn);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 37), sfn_l);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 38), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 39), slot_l);
}
/* 给本核event3发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape5_event1_alloc1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 40), g_u32_case22_ape5_event1_alloc1_err);
return ;
}
do_write(paddr, g_u32_case22_ape5_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INNER,
ape_id, // src que id
ape_id, // dst que id
40, // src task id
42); // dst task id
if (0 != ret)
{
g_u32_case22_ape5_event1_send1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 41), g_u32_case22_ape5_event1_send1_err);
//return ;
}
/* 给其核event2发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape5_event1_alloc2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case22_ape5_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape5_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
ape_id+1, // dst que id
40, // src task id
41); // dst task id
if (0 != ret)
{
g_u32_case22_ape5_event1_send2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case22_ape5_event1_send2_err);
return ;
}
/* 给ape7 event1发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
//g_u32_case21_ape5_event1_alloc2_err++;
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case21_ape5_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape5_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
7, // ape7
40, // src task id
40); // dst task id
if (0 != ret)
{
//g_u32_case21_ape5_event1_send2_err++;
///debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case21_ape5_event1_send2_err);
return ;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 44), ++g_u32_case22_ape5_event1_send_ok);
return ;
}
/* 收到他核event1发来的消息 */
void ape5_event2_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape5_event2_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 45), g_u32_case22_ape5_event2_num);
return ;
}
/* 收到本核event1发来的消息 */
void ape5_event3_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape5_event3_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 46), g_u32_case22_ape5_event3_num);
return ;
}
/***************************************************************/
/* 定时时任务相关打点 */
static uint32_t g_u32_case22_ape5_timer1_slot_no_continuous = 0; // 50 0xB7E00AC8
static uint32_t g_u32_case22_ape5_timer1_sfn_no_continuous = 0; // 51 0xB7E00ACC
static uint32_t g_u32_case22_ape5_timer1_slot_indication = 0; // 52 0xB7E00AD0
static uint32_t g_u32_case22_ape5_timer1_update_sfn_slot = 0; // 53 0xB7E00AD4
static uint32_t g_u32_case22_ape5_timer1_process_cnt = 0; // 54 0xB7E00AD8
static uint32_t g_u32_case22_ape5_timer1_process_tick = 0; // 55 0xB7E00ADC
static uint32_t g_u32_case22_ape5_timer1_process_tick_err = 0; // 56 0xB7E00AE0
static uint32_t g_u32_case22_ape5_timer2_process_cnt = 0; // 57 0xB7E00AE4
static uint32_t g_u32_case22_ape5_timer2_process_tick = 0; // 58 0xB7E00AE8
static uint32_t g_u32_case22_ape5_timer2_process_tick_err = 0; // 59 0xB7E00AEC
static uint32_t g_u32_case22_ape5_timer2_tx_slot_max = 0; // 64 0xB7E00B00
static uint32_t g_u32_case22_ape5_timer2_tx_slot_min = 0x32000;//65 0xB7E00B04
static uint32_t g_u32_case22_ape5_timer2_tx_slot_cur = 0; // 66 0xB7E00B08
static uint32_t g_u32_case22_ape5_timer2_rx_slot_max = 0; // 67 0xB7E00B0C
static uint32_t g_u32_case22_ape5_timer2_rx_slot_min = 0x32000; // 68 0xB7E00B10
static uint32_t g_u32_case22_ape5_timer2_rx_slot_cur = 0; // 69 0xB7E00B14
static uint16_t gPreviousSlot = 0;
static uint16_t gCurrentSlot = 0;
static uint8_t gSlotFlagInit = 1;
static uint8_t gSfnFlagInit = 1;
static uint16_t gPreviousSfn = 0;
static uint16_t gCurrentSfn = 0;
static inline void check_continuous_slot(uint16_t slot)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSlotFlagInit == 1)
{
gSlotFlagInit = 0;
gCurrentSlot = slot;
}
else
{
gPreviousSlot = gCurrentSlot;
gCurrentSlot = slot;
delta = (SFN_SLOT_NUM_15K + gCurrentSlot - gPreviousSlot) % SFN_SLOT_NUM_15K;
if (delta != 1)
{
debug_write(DBG_DDR_COMMON_IDX(ape_id, 50), ++g_u32_case22_ape5_timer1_slot_no_continuous);
}
}
return;
}
static inline void check_continuous_sfn(uint16_t sfn)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSfnFlagInit == 1)
{
gSfnFlagInit = 0;
gCurrentSfn = sfn;
}
else
{
gPreviousSfn = gCurrentSfn;
gCurrentSfn = sfn;
delta = (1024 + gCurrentSfn - gPreviousSfn) % 1024;
if (delta != 1) {
debug_write(DBG_DDR_COMMON_IDX(ape_id, 51), ++g_u32_case22_ape5_timer1_sfn_no_continuous);
}
}
return;
}
uint32_t gu32_ape5_send_cnt = 0; //(61) 0xb7e002f4
static inline void send_slot_indication(void)
{
uint16_t scs = LTE_SCS_ID;
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t value = (sfn << 16) + slot;
uint32_t ape_id = get_core_id();
uint32_t size = 8;
char* buf;
uint32_t availableSize,offset;
uint16_t cu_flag = C_PLANE;//U_PLANE;
HandleId_t handler;
handler.port_id = get_ucp_port_id();
handler.inst_id = 1;
handler.type_id = CU_SPLIT;
int32_t ret = msg_transfer_send_start(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 60), handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 61), ++gu32_ape5_send_cnt);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 62), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 63), 0xffff);
ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset);
if (SUCCESS != ret)
{
UCP_PRINT_ERROR("send_slot_indication C_PLANE ret[0x%08x]", ret);
return;
}
uint32_t clockBegin;
rdmcycle(&clockBegin);
do_write(buf, value);
do_write(buf+4, clockBegin);
ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size);
ret = msg_transfer_send_end(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 52), ++g_u32_case22_ape5_timer1_slot_indication);
return;
}
static inline void update_sfn_slot(void)
{
uint32_t clockBegin;
rdmcycle(&clockBegin);
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 53), ++g_u32_case22_ape5_timer1_update_sfn_slot);
UCP_PRINT_ERROR("ape[0x%x]:enter[%d], sfn[%d], slot[%d].", ape_id, g_u32_case22_ape5_timer1_update_sfn_slot, sfn, slot);
check_continuous_slot(slot);
if (slot == 0) {
check_continuous_sfn(sfn);
}
return;
}
/* 定时点任务 */
void ape5_timer1_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 54), ++g_u32_case22_ape5_timer1_process_cnt);
update_sfn_slot();
send_slot_indication();
if (0 == g_u32_case22_ape5_timer1_process_tick)
{
g_u32_case22_ape5_timer1_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape5_timer1_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape5_timer1_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape5_timer1_process_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), clockOffset);
}
}
g_u32_case22_ape5_timer1_process_tick = clockTick;
}
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), g_u32_case22_ape1_timer1_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 56), g_u32_case22_ape5_timer1_process_tick_err);
return;
}
void ape5_timer2_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
g_u32_case22_ape5_timer2_tx_slot_cur = get_tx_nr_slot_cycle();
g_u32_case22_ape5_timer2_rx_slot_cur = get_rx_nr_slot_cycle();
g_u32_case22_ape5_timer2_tx_slot_max = get_max(g_u32_case22_ape5_timer2_tx_slot_cur, g_u32_case22_ape5_timer2_tx_slot_max);
g_u32_case22_ape5_timer2_tx_slot_min = get_min(g_u32_case22_ape5_timer2_tx_slot_cur, g_u32_case22_ape5_timer2_tx_slot_min);
g_u32_case22_ape5_timer2_rx_slot_max = get_max(g_u32_case22_ape5_timer2_rx_slot_cur, g_u32_case22_ape5_timer2_rx_slot_max);
g_u32_case22_ape5_timer2_rx_slot_min = get_min(g_u32_case22_ape5_timer2_rx_slot_cur, g_u32_case22_ape5_timer2_rx_slot_min);
g_u32_case22_ape5_timer2_process_cnt++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 57), g_u32_case22_ape5_timer2_process_cnt);
if (0 == g_u32_case22_ape5_timer2_process_tick)
{
g_u32_case22_ape5_timer2_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape5_timer2_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape5_timer2_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape5_timer2_process_tick_err++;
}
}
g_u32_case22_ape5_timer2_process_tick = clockTick;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 58), g_u32_case22_ape5_timer2_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 59), g_u32_case22_ape5_timer2_process_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 64), g_u32_case22_ape5_timer2_tx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 65), g_u32_case22_ape5_timer2_tx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 66), g_u32_case22_ape5_timer2_tx_slot_cur);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 67), g_u32_case22_ape5_timer2_rx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 68), g_u32_case22_ape5_timer2_rx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 69), g_u32_case22_ape5_timer2_rx_slot_cur);
return ;
}
/*************************************************************************/
/* 收到消息后创建任务 */
void ape5_event_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x01010101);
osp_task_info_ex ape5_task_event1 = {40, (int8_t*)"ape5_task_event1", 40, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape5_event1_task};
osp_task_info_ex ape5_task_event2 = {41, (int8_t*)"ape5_task_event2", 41, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape5_event2_task};
osp_task_info_ex ape5_task_event3 = {42, (int8_t*)"ape5_task_event3", 42, 2048, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape5_event3_task};
osp_task_info_ex ape5_task_timer1 = {43, (int8_t*)"ape5_task_timer1", 43, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 0, NULL, (OSP_TASKENTRY_FUNC)ape5_timer1_task};
osp_task_info_ex ape5_task_timer2 = {44, (int8_t*)"ape5_task_timer2", 44, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 200, NULL, (OSP_TASKENTRY_FUNC)ape5_timer2_task};
osp_task_create(&ape5_task_event1);
osp_task_create(&ape5_task_event2);
osp_task_create(&ape5_task_event3);
osp_task_create(&ape5_task_timer1);
osp_task_create(&ape5_task_timer2);
osp_timer_sync(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x03030303);
return ;
}
/* 收到消息后删除任务 */
void ape5_event_task_del(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x05050505);
//osp_del_task_all(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x06060606);
return;
}

View File

@ -0,0 +1,453 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : case20_ape2_task.s.c
// Author :
// Created On : 2023-01-05
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "ucp_utility.h"
#include "ucp_tick.h"
#include "ucp_printf.h"
#include "phy_para.h"
#include "osp_msg.h"
#include "ucp_testcase.h"
#include "msg_transfer_layer.h"
#include "ucp_port.h"
#include "ape_mtimer.h"
#include "osp_task.h"
#include "osp_timer.h"
/***************************************************************/
/* 事件任务相关打点 */
static uint32_t g_u32_case22_ape6_event1_rev_num = 0; // 30 0xB7E00C78
static uint32_t g_u32_case22_ape6_event1_rev_ok = 0; // 31 0xB7E00C7C
static uint32_t g_u32_case22_ape6_event1_addr_err = 0; // 32 0xB7E00C80
//static uint32_t g_u32_case22_ape6_event1_tick = 0;
//static uint32_t g_u32_case22_ape6_event1_tick_err = 0; // 33 0xB7E00C84
//static uint32_t g_u32_case22_ape6_event1_sfn_slot_err = 0; // 35 0xB7E00C8C
static uint32_t g_u32_case22_ape6_event1_alloc1_err = 0; // 40 0xB7E00CA0
static uint32_t g_u32_case22_ape6_event1_send1_err = 0; // 41 0xB7E00CA4
static uint32_t g_u32_case22_ape6_event1_alloc2_err = 0; // 42 0xB7E00CA8
static uint32_t g_u32_case22_ape6_event1_send2_err = 0; // 43 0xB7E00CAC
static uint32_t g_u32_case22_ape6_event1_send_ok = 0; // 44 0xB7E00CB0
static uint32_t g_u32_case22_ape6_event2_num = 0; // 45 0xB7E00CB4
static uint32_t g_u32_case22_ape6_event3_num = 0; // 46 0xB7E00CB8
/* 收到ARM侧发来的消息通过RFM转发 */
void ape6_event1_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
uint32_t msg_addr = 0;
uint32_t que_num = 0;
uint32_t value = 0;
//uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = 0;
uint16_t slot = 0;
//uint16_t sfn_l = 0;
//uint16_t slot_l = 0;
//uint32_t u32_clock_offset = 0;
//uint32_t u32_clock_tick = 0;
char *paddr = NULL;
int ret = 0;
g_u32_case22_ape6_event1_rev_num++;
if (0 == addr)
{
g_u32_case22_ape6_event1_addr_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 32), g_u32_case22_ape6_event1_addr_err);
return ;
}
msg_addr = do_read(addr);
que_num = do_read(addr+4);
value = *(uint32_t*)msg_addr;
sfn = value >> 16;
slot = value & 0xffff;
//msg_transfer_free_msg(TEST_QUE_PORT_ID, que_num, 0, (char*)msg_addr);
g_u32_case22_ape6_event1_rev_ok++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 30), g_u32_case22_ape6_event1_rev_num);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 31), g_u32_case22_ape6_event1_rev_ok);
#if 0
rdmcycle(&u32_clock_tick);
if (0 == g_u32_case22_ape6_event1_tick)
{
g_u32_case22_ape6_event1_tick = u32_clock_tick;
}
else
{
if (u32_clock_tick > g_u32_case22_ape6_event1_tick)
{
u32_clock_offset = u32_clock_tick - g_u32_case22_ape6_event1_tick;
if ((u32_clock_offset > TIMER_OFFSET_MAX_15K) || (u32_clock_offset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape6_event1_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 33), g_u32_case22_ape6_event1_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 34), u32_clock_offset);
}
}
g_u32_case22_ape6_event1_tick = u32_clock_tick;
}
sfn_l = get_tx_nr_sfn(scs);
slot_l = get_tx_nr_slot(scs);
if ((sfn != sfn_l) || (slot != slot_l))
{
g_u32_case21_ape6_event1_sfn_slot_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 35), g_u32_case22_ape6_event1_sfn_slot_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 36), sfn);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 37), sfn_l);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 38), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 39), slot_l);
}
#endif
/* 给本核event3发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape6_event1_alloc1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 40), g_u32_case22_ape6_event1_alloc1_err);
return ;
}
do_write(paddr, g_u32_case22_ape6_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INNER,
ape_id, // src que id
ape_id, // dst que id
40, // src task id
42); // dst task id
if (0 != ret)
{
g_u32_case22_ape6_event1_send1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 41), g_u32_case22_ape6_event1_send1_err);
//return ;
}
/* 给其核event2发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape6_event1_alloc2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case22_ape6_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape6_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
ape_id+1, // dst que id
40, // src task id
41); // dst task id
if (0 != ret)
{
g_u32_case22_ape6_event1_send2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case22_ape6_event1_send2_err);
return ;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 44), ++g_u32_case22_ape6_event1_send_ok);
return ;
}
/* 收到他核event1发来的消息 */
void ape6_event2_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape6_event2_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 45), g_u32_case22_ape6_event2_num);
return ;
}
/* 收到本核event1发来的消息 */
void ape6_event3_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape6_event3_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 46), g_u32_case22_ape6_event3_num);
return ;
}
/***************************************************************/
/* 定时时任务相关打点 */
static uint32_t g_u32_case22_ape6_timer1_slot_no_continuous = 0; // 50 0xB7E00CC8
static uint32_t g_u32_case22_ape6_timer1_sfn_no_continuous = 0; // 51 0xB7E00CCC
//static uint32_t g_u32_case22_ape6_timer1_slot_indication = 0; // 52 0xB7E00CD0
static uint32_t g_u32_case22_ape6_timer1_update_sfn_slot = 0; // 53 0xB7E00CD4
static uint32_t g_u32_case22_ape6_timer1_process_cnt = 0; // 54 0xB7E00CD8
static uint32_t g_u32_case22_ape6_timer1_process_tick = 0; // 55 0xB7E00CDC
static uint32_t g_u32_case22_ape6_timer1_process_tick_err = 0; // 56 0xB7E00CE0
static uint32_t g_u32_case22_ape6_timer2_process_cnt = 0; // 57 0xB7E00CE4
static uint32_t g_u32_case22_ape6_timer2_process_tick = 0; // 58 0xB7E00CE8
static uint32_t g_u32_case22_ape6_timer2_process_tick_err = 0; // 59 0xB7E00CEC
static uint32_t g_u32_case22_ape6_timer2_tx_slot_max = 0; // 64 0xB7E00D00
static uint32_t g_u32_case22_ape6_timer2_tx_slot_min = 0x32000;//65 0xB7E00D04
static uint32_t g_u32_case22_ape6_timer2_tx_slot_cur = 0; // 66 0xB7E00D08
static uint32_t g_u32_case22_ape6_timer2_rx_slot_max = 0; // 67 0xB7E00D0C
static uint32_t g_u32_case22_ape6_timer2_rx_slot_min = 0x32000; // 68 0xB7E00D10
static uint32_t g_u32_case22_ape6_timer2_rx_slot_cur = 0; // 69 0xB7E00D14
static uint16_t gPreviousSlot = 0;
static uint16_t gCurrentSlot = 0;
static uint8_t gSlotFlagInit = 1;
static uint8_t gSfnFlagInit = 1;
static uint16_t gPreviousSfn = 0;
static uint16_t gCurrentSfn = 0;
static inline void check_continuous_slot(uint16_t slot)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSlotFlagInit == 1)
{
gSlotFlagInit = 0;
gCurrentSlot = slot;
}
else
{
gPreviousSlot = gCurrentSlot;
gCurrentSlot = slot;
delta = (SFN_SLOT_NUM_15K + gCurrentSlot - gPreviousSlot) % SFN_SLOT_NUM_15K;
if (delta != 1)
{
debug_write(DBG_DDR_COMMON_IDX(ape_id, 50), ++g_u32_case22_ape6_timer1_slot_no_continuous);
}
}
return;
}
static inline void check_continuous_sfn(uint16_t sfn)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSfnFlagInit == 1)
{
gSfnFlagInit = 0;
gCurrentSfn = sfn;
}
else
{
gPreviousSfn = gCurrentSfn;
gCurrentSfn = sfn;
delta = (1024 + gCurrentSfn - gPreviousSfn) % 1024;
if (delta != 1) {
debug_write(DBG_DDR_COMMON_IDX(ape_id, 51), ++g_u32_case22_ape6_timer1_sfn_no_continuous);
}
}
return;
}
#if 0
uint32_t gu32_ape6_send_cnt = 0;
static inline void send_slot_indication(void)
{
uint16_t scs = LTE_SCS_ID;
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t value = (sfn << 16) + slot;
uint32_t ape_id = get_core_id();
uint32_t size = 8;
char* buf;
uint32_t availableSize,offset;
uint16_t cu_flag = C_PLANE;
HandleId_t handler;
handler.port_id = get_ucp_port_id();
handler.inst_id = 1;
handler.type_id = CU_SPLIT;
int32_t ret = msg_transfer_send_start(handler.value);
//UCP_PRINT_ERROR("value(0x%x), inst(%d)", handler.value, handler.inst_id);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 60), handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 61), ++gu32_ape6_send_cnt);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 62), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 63), 0xffff);
ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset);
if (SUCCESS != ret)
{
UCP_PRINT_ERROR("send_slot_indication C_PLANE ret[0x%08x]", ret);
return;
}
uint32_t clockBegin;
rdmcycle(&clockBegin);
do_write(buf, value);
do_write(buf+4, clockBegin);
ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size);
ret = msg_transfer_send_end(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 52), ++g_u32_case22_ape6_timer1_slot_indication);
return;
}
#endif
static inline void update_sfn_slot(void)
{
uint32_t clockBegin;
rdmcycle(&clockBegin);
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 53), ++g_u32_case22_ape6_timer1_update_sfn_slot);
UCP_PRINT_ERROR("ape[0x%x]:enter[%d], sfn[%d], slot[%d].", ape_id, g_u32_case22_ape6_timer1_update_sfn_slot, sfn, slot);
check_continuous_slot(slot);
if (slot == 0) {
check_continuous_sfn(sfn);
}
return;
}
/* 定时点任务 */
void ape6_timer1_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 54), ++g_u32_case22_ape6_timer1_process_cnt);
update_sfn_slot();
//send_slot_indication();
if (0 == g_u32_case22_ape6_timer1_process_tick)
{
g_u32_case22_ape6_timer1_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape6_timer1_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape6_timer1_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape6_timer1_process_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), clockOffset);
}
}
g_u32_case22_ape6_timer1_process_tick = clockTick;
}
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), g_u32_case20_ape2_timer1_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 56), g_u32_case22_ape6_timer1_process_tick_err);
return;
}
void ape6_timer2_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
g_u32_case22_ape6_timer2_tx_slot_cur = get_tx_nr_slot_cycle();
g_u32_case22_ape6_timer2_rx_slot_cur = get_rx_nr_slot_cycle();
g_u32_case22_ape6_timer2_tx_slot_max = get_max(g_u32_case22_ape6_timer2_tx_slot_cur, g_u32_case22_ape6_timer2_tx_slot_max);
g_u32_case22_ape6_timer2_tx_slot_min = get_min(g_u32_case22_ape6_timer2_tx_slot_cur, g_u32_case22_ape6_timer2_tx_slot_min);
g_u32_case22_ape6_timer2_rx_slot_max = get_max(g_u32_case22_ape6_timer2_rx_slot_cur, g_u32_case22_ape6_timer2_rx_slot_max);
g_u32_case22_ape6_timer2_rx_slot_min = get_min(g_u32_case22_ape6_timer2_rx_slot_cur, g_u32_case22_ape6_timer2_rx_slot_min);
g_u32_case22_ape6_timer2_process_cnt++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 57), g_u32_case22_ape6_timer2_process_cnt);
if (0 == g_u32_case22_ape6_timer2_process_tick)
{
g_u32_case22_ape6_timer2_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape6_timer2_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape6_timer2_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape6_timer2_process_tick_err++;
}
}
g_u32_case22_ape6_timer2_process_tick = clockTick;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 58), g_u32_case22_ape6_timer2_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 59), g_u32_case22_ape6_timer2_process_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 64), g_u32_case22_ape6_timer2_tx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 65), g_u32_case22_ape6_timer2_tx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 66), g_u32_case22_ape6_timer2_tx_slot_cur);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 67), g_u32_case22_ape6_timer2_rx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 68), g_u32_case22_ape6_timer2_rx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 69), g_u32_case22_ape6_timer2_rx_slot_cur);
return ;
}
/*************************************************************************/
/* 收到消息后创建任务 */
void ape6_event_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x01010101);
osp_task_info_ex ape6_task_event1 = {40, (int8_t*)"ape6_task_event1", 40, 1024, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape6_event1_task};
osp_task_info_ex ape6_task_event2 = {41, (int8_t*)"ape6_task_event2", 41, 1024, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape6_event2_task};
osp_task_info_ex ape6_task_event3 = {42, (int8_t*)"ape6_task_event3", 42, 1024, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape6_event3_task};
osp_task_info_ex ape6_task_timer1 = {43, (int8_t*)"ape6_task_timer1", 43, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 0, NULL, (OSP_TASKENTRY_FUNC)ape6_timer1_task};
osp_task_info_ex ape6_task_timer2 = {44, (int8_t*)"ape6_task_timer2", 44, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 200, NULL, (OSP_TASKENTRY_FUNC)ape6_timer2_task};
osp_task_create(&ape6_task_event1);
osp_task_create(&ape6_task_event2);
osp_task_create(&ape6_task_event3);
osp_task_create(&ape6_task_timer1);
osp_task_create(&ape6_task_timer2);
osp_timer_sync(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x03030303);
return ;
}
/* 收到消息后删除任务 */
void ape6_event_task_del(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x05050505);
//osp_del_task_all(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x06060606);
return;
}

View File

@ -0,0 +1,446 @@
// +FHDR------------------------------------------------------------
// Copyright (c) 2022 SmartLogic.
// ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename : case20_ape3_task.s.c
// Author :
// Created On : 2023-01-05
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------
#include "ucp_utility.h"
#include "ucp_tick.h"
#include "ucp_printf.h"
#include "phy_para.h"
#include "osp_msg.h"
#include "ucp_testcase.h"
#include "msg_transfer_layer.h"
#include "ucp_port.h"
#include "ape_mtimer.h"
#include "osp_task.h"
#include "osp_timer.h"
/***************************************************************/
/* 事件任务相关打点 */
static uint32_t g_u32_case22_ape7_event1_rev_num = 0; // 30 0xB7E00E78
static uint32_t g_u32_case22_ape7_event1_rev_ok = 0; // 31 0xB7E00E7C
static uint32_t g_u32_case22_ape7_event1_addr_err = 0; // 32 0xB7E00E80
//static uint32_t g_u32_case22_ape7_event1_tick = 0;
//static uint32_t g_u32_case22_ape7_event1_tick_err = 0; // 33 0xB7E00E84
//static uint32_t g_u32_case22_ape7_event1_sfn_slot_err = 0; // 35 0xB7E00E8C
static uint32_t g_u32_case22_ape7_event1_alloc1_err = 0; // 40 0xB7E00EA0
static uint32_t g_u32_case22_ape7_event1_send1_err = 0; // 41 0xB7E00EA4
static uint32_t g_u32_case22_ape7_event1_alloc2_err = 0; // 42 0xB7E00EA8
static uint32_t g_u32_case22_ape7_event1_send2_err = 0; // 43 0xB7E00EAC
static uint32_t g_u32_case22_ape7_event1_send_ok = 0; // 44 0xB7E00EB0
static uint32_t g_u32_case22_ape7_event2_num = 0; // 45 0xB7E00EB4
static uint32_t g_u32_case22_ape7_event3_num = 0; // 46 0xB7E00EB8
/* 收到ARM侧发来的消息通过RFM转发 */
void ape7_event1_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
uint32_t msg_addr = 0;
uint32_t que_num = 0;
uint32_t value = 0;
//uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = 0;
uint16_t slot = 0;
//uint16_t sfn_l = 0;
//uint16_t slot_l = 0;
//uint32_t u32_clock_offset = 0;
//uint32_t u32_clock_tick = 0;
char *paddr = NULL;
int ret = 0;
g_u32_case22_ape7_event1_rev_num++;
if (0 == addr)
{
g_u32_case22_ape7_event1_addr_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 32), g_u32_case22_ape7_event1_addr_err);
return ;
}
msg_addr = do_read(addr);
que_num = do_read(addr+4);
value = *(uint32_t*)msg_addr;
sfn = value >> 16;
slot = value & 0xffff;
//msg_transfer_free_msg(TEST_QUE_PORT_ID, que_num, 0, (char*)msg_addr);
g_u32_case22_ape7_event1_rev_ok++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 30), g_u32_case22_ape7_event1_rev_num);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 31), g_u32_case22_ape7_event1_rev_ok);
#if 0
rdmcycle(&u32_clock_tick);
if (0 == g_u32_case22_ape7_event1_tick)
{
g_u32_case22_ape7_event1_tick = u32_clock_tick;
}
else
{
if (u32_clock_tick > g_u32_case22_ape7_event1_tick)
{
u32_clock_offset = u32_clock_tick - g_u32_case22_ape7_event1_tick;
if ((u32_clock_offset > TIMER_OFFSET_MAX_15K) || (u32_clock_offset < TIMER_OFFSET_MIN_15K))
{
g_u32_case21_ape7_event1_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 33), g_u32_case22_ape7_event1_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 34), u32_clock_offset);
}
}
g_u32_case22_ape7_event1_tick = u32_clock_tick;
}
sfn_l = get_tx_nr_sfn(scs);
slot_l = get_tx_nr_slot(scs);
if ((sfn != sfn_l) || (slot != slot_l))
{
g_u32_case21_ape7_event1_sfn_slot_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 35), g_u32_case22_ape7_event1_sfn_slot_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 36), sfn);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 37), sfn_l);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 38), slot);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 39), slot_l);
}
#endif
/* 给本核event3发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape7_event1_alloc1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 40), g_u32_case22_ape7_event1_alloc1_err);
return ;
}
do_write(paddr, g_u32_case22_ape7_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INNER,
ape_id, // src que id
ape_id, // dst que id
40, // src task id
42); // dst task id
if (0 != ret)
{
g_u32_case22_ape7_event1_send1_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 41), g_u32_case22_ape7_event1_send1_err);
//return ;
}
/* 给其核event2发消息 */
paddr = osp_alloc_msg(TEST_MSG_SIZE);
if (NULL == paddr)
{
g_u32_case22_ape7_event1_alloc2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 42), g_u32_case22_ape7_event1_alloc2_err);
return ;
}
do_write(paddr, g_u32_case22_ape7_event1_rev_num);
do_write((paddr+4), 0xA001B002);
ret = osp_send_msg((uint32_t)(paddr),
TEST_MSG_SIZE,
UCP4008_KERNEL_INTER,
ape_id, // src que id
4, // sendto ape4(4 apes 1 cell)
40, // src task id
41); // dst task id
if (0 != ret)
{
g_u32_case22_ape7_event1_send2_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 43), g_u32_case22_ape7_event1_send2_err);
return ;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 44), ++g_u32_case22_ape7_event1_send_ok);
return ;
}
/* 收到他核event1发来的消息 */
void ape7_event2_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape7_event2_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 45), g_u32_case22_ape7_event2_num);
return ;
}
/* 收到本核event1发来的消息 */
void ape7_event3_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
g_u32_case22_ape7_event3_num++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 46), g_u32_case22_ape7_event3_num);
return ;
}
/***************************************************************/
/* 定时时任务相关打点 */
static uint32_t g_u32_case22_ape7_timer1_slot_no_continuous = 0; // 50 0xB7E00EC8
static uint32_t g_u32_case22_ape7_timer1_sfn_no_continuous = 0; // 51 0xB7E00ECC
//static uint32_t g_u32_case22_ape7_timer1_slot_indication = 0; // 52 0xB7E00ED0
static uint32_t g_u32_case22_ape7_timer1_update_sfn_slot = 0; // 53 0xB7E00ED4
static uint32_t g_u32_case22_ape7_timer1_process_cnt = 0; // 54 0xB7E00ED8
static uint32_t g_u32_case22_ape7_timer1_process_tick = 0; // 55 0xB7E00EDC
static uint32_t g_u32_case22_ape7_timer1_process_tick_err = 0; // 56 0xB7E00EE0
static uint32_t g_u32_case22_ape7_timer2_process_cnt = 0; // 57 0xB7E00EE4
static uint32_t g_u32_case22_ape7_timer2_process_tick = 0; // 58 0xB7E00EE8
static uint32_t g_u32_case22_ape7_timer2_process_tick_err = 0; // 59 0xB7E00EEC
static uint32_t g_u32_case22_ape7_timer2_tx_slot_max = 0; // 64 0xB7E00F00
static uint32_t g_u32_case22_ape7_timer2_tx_slot_min = 0x32000;//65 0xB7E00F04
static uint32_t g_u32_case22_ape7_timer2_tx_slot_cur = 0; // 66 0xB7E00F08
static uint32_t g_u32_case22_ape7_timer2_rx_slot_max = 0; // 67 0xB7E00F0C
static uint32_t g_u32_case22_ape7_timer2_rx_slot_min = 0x32000; // 68 0xB7E00F10
static uint32_t g_u32_case22_ape7_timer2_rx_slot_cur = 0; // 69 0xB7E00F14
static uint16_t gPreviousSlot = 0;
static uint16_t gCurrentSlot = 0;
static uint8_t gSlotFlagInit = 1;
static uint8_t gSfnFlagInit = 1;
static uint16_t gPreviousSfn = 0;
static uint16_t gCurrentSfn = 0;
static inline void check_continuous_slot(uint16_t slot)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSlotFlagInit == 1)
{
gSlotFlagInit = 0;
gCurrentSlot = slot;
}
else
{
gPreviousSlot = gCurrentSlot;
gCurrentSlot = slot;
delta = (SFN_SLOT_NUM_15K + gCurrentSlot - gPreviousSlot) % SFN_SLOT_NUM_15K;
if (delta != 1)
{
debug_write(DBG_DDR_COMMON_IDX(ape_id, 50), ++g_u32_case22_ape7_timer1_slot_no_continuous);
}
}
return;
}
static inline void check_continuous_sfn(uint16_t sfn)
{
uint16_t delta = 0;
uint32_t ape_id = get_core_id();
if (gSfnFlagInit == 1)
{
gSfnFlagInit = 0;
gCurrentSfn = sfn;
}
else
{
gPreviousSfn = gCurrentSfn;
gCurrentSfn = sfn;
delta = (1024 + gCurrentSfn - gPreviousSfn) % 1024;
if (delta != 1) {
debug_write(DBG_DDR_COMMON_IDX(ape_id, 51), ++g_u32_case22_ape7_timer1_sfn_no_continuous);
}
}
return;
}
#if 0
static inline void send_slot_indication(void)
{
uint16_t scs = LTE_SCS_ID;
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t value = (sfn << 16) + slot;
uint32_t ape_id = get_core_id();
uint32_t size = 8;
char* buf;
uint32_t availableSize,offset;
uint16_t cu_flag = U_PLANE;
HandleId_t handler;
handler.port_id = get_ucp_port_id();
handler.inst_id = 1;
handler.type_id = CU_SPLIT;
int32_t ret = msg_transfer_send_start(handler.value);
ret = msg_transfer_alloc_msg(handler.value, cu_flag, size, &buf, &availableSize, &offset);
if (SUCCESS != ret)
{
UCP_PRINT_ERROR("send_slot_indication C_PLANE ret[0x%08x]", ret);
return;
}
uint32_t clockBegin;
rdmcycle(&clockBegin);
do_write(buf, value);
do_write(buf+4, clockBegin);
ret = msg_transfer_send_msg(handler.value, cu_flag, (uint8_t *)buf, offset, size);
ret = msg_transfer_send_end(handler.value);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 52), ++g_u32_case22_ape7_timer1_slot_indication);
return;
}
#endif
static inline void update_sfn_slot(void)
{
uint32_t clockBegin;
rdmcycle(&clockBegin);
uint16_t scs = LTE_SCS_ID;//15KHz
uint16_t sfn = get_tx_nr_sfn(scs);
uint16_t slot = get_tx_nr_slot(scs);
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 53), ++g_u32_case22_ape7_timer1_update_sfn_slot);
UCP_PRINT_ERROR("ape[0x%x]:enter[%d], sfn[%d], slot[%d].", ape_id, g_u32_case22_ape7_timer1_update_sfn_slot, sfn, slot);
check_continuous_slot(slot);
if (slot == 0) {
check_continuous_sfn(sfn);
}
return;
}
/* 定时点任务 */
void ape7_timer1_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 54), ++g_u32_case22_ape7_timer1_process_cnt);
update_sfn_slot();
//send_slot_indication();
if (0 == g_u32_case22_ape7_timer1_process_tick)
{
g_u32_case22_ape7_timer1_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape7_timer1_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape7_timer1_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape7_timer1_process_tick_err++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), clockOffset);
}
}
g_u32_case22_ape7_timer1_process_tick = clockTick;
}
//debug_write(DBG_DDR_COMMON_IDX(ape_id, 55), g_u32_case20_ape3_timer1_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 56), g_u32_case22_ape7_timer1_process_tick_err);
return;
}
void ape7_timer2_task(void)
{
uint32_t ape_id = get_core_id();
uint32_t clockTick = 0;
uint32_t clockOffset = 0;
rdmcycle(&clockTick);
g_u32_case22_ape7_timer2_tx_slot_cur = get_tx_nr_slot_cycle();
g_u32_case22_ape7_timer2_rx_slot_cur = get_rx_nr_slot_cycle();
g_u32_case22_ape7_timer2_tx_slot_max = get_max(g_u32_case22_ape7_timer2_tx_slot_cur, g_u32_case22_ape7_timer2_tx_slot_max);
g_u32_case22_ape7_timer2_tx_slot_min = get_min(g_u32_case22_ape7_timer2_tx_slot_cur, g_u32_case22_ape7_timer2_tx_slot_min);
g_u32_case22_ape7_timer2_rx_slot_max = get_max(g_u32_case22_ape7_timer2_rx_slot_cur, g_u32_case22_ape7_timer2_rx_slot_max);
g_u32_case22_ape7_timer2_rx_slot_min = get_min(g_u32_case22_ape7_timer2_rx_slot_cur, g_u32_case22_ape7_timer2_rx_slot_min);
g_u32_case22_ape7_timer2_process_cnt++;
debug_write(DBG_DDR_COMMON_IDX(ape_id, 57), g_u32_case22_ape7_timer2_process_cnt);
if (0 == g_u32_case22_ape7_timer2_process_tick)
{
g_u32_case22_ape7_timer2_process_tick = clockTick;
}
else
{
if (clockTick > g_u32_case22_ape7_timer2_process_tick)
{
clockOffset = clockTick - g_u32_case22_ape7_timer2_process_tick;
if ((clockOffset > TIMER_OFFSET_MAX_15K) || (clockOffset < TIMER_OFFSET_MIN_15K))
{
g_u32_case22_ape7_timer2_process_tick_err++;
}
}
g_u32_case22_ape7_timer2_process_tick = clockTick;
}
debug_write(DBG_DDR_COMMON_IDX(ape_id, 58), g_u32_case22_ape7_timer2_process_tick);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 59), g_u32_case22_ape7_timer2_process_tick_err);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 64), g_u32_case22_ape7_timer2_tx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 65), g_u32_case22_ape7_timer2_tx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 66), g_u32_case22_ape7_timer2_tx_slot_cur);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 67), g_u32_case22_ape7_timer2_rx_slot_max);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 68), g_u32_case22_ape7_timer2_rx_slot_min);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 69), g_u32_case22_ape7_timer2_rx_slot_cur);
return ;
}
/*************************************************************************/
/* 收到消息后创建任务 */
void ape7_event_task(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x01010101);
osp_task_info_ex ape7_task_event1 = {40, (int8_t*)"ape7_task_event1", 40, 1024, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape7_event1_task};
osp_task_info_ex ape7_task_event2 = {41, (int8_t*)"ape7_task_event2", 41, 1024, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape7_event2_task};
osp_task_info_ex ape7_task_event3 = {42, (int8_t*)"ape7_task_event3", 42, 1024, OSP_EVENT_TYPE, 0, 0, 0, NULL, (OSP_TASKENTRY_FUNC)ape7_event3_task};
osp_task_info_ex ape7_task_timer1 = {43, (int8_t*)"ape7_task_timer1", 43, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 0, NULL, (OSP_TASKENTRY_FUNC)ape7_timer1_task};
osp_task_info_ex ape7_task_timer2 = {44, (int8_t*)"ape7_task_timer2", 44, 2048, OSP_TIMER_TYPE, 0, 0x3ff, 200, NULL, (OSP_TASKENTRY_FUNC)ape7_timer2_task};
osp_task_create(&ape7_task_event1);
osp_task_create(&ape7_task_event2);
osp_task_create(&ape7_task_event3);
osp_task_create(&ape7_task_timer1);
osp_task_create(&ape7_task_timer2);
osp_timer_sync(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x03030303);
return ;
}
/* 收到消息后删除任务 */
void ape7_event_task_del(uint32_t addr, uint32_t size)
{
uint32_t ape_id = get_core_id();
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x05050505);
//osp_del_task_all(LTE_SCS_ID);
debug_write(DBG_DDR_COMMON_IDX(ape_id, 29), 0x06060606);
return;
}