Эх сурвалжийг харах

fix:单元测试未添加接口函数导致的测试不通过问题

CN\guohui27 2 жил өмнө
parent
commit
590bb94d30

+ 8 - 0
User project/1.FrameLayer/Include/FSM_1st.h

@@ -12,6 +12,9 @@
 #ifndef FSM1ST_H
 #define FSM1ST_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
 /****************************************
  *
  *          Definitions & Macros
@@ -215,4 +218,9 @@ void RlyOnInit(void);
  */
 void FSM_voInit(void);
 
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
 #endif

+ 15 - 13
User project/3.BasicFunction/Source/Cadence.c

@@ -28,6 +28,8 @@ CADENCE_COF cadence_stFreGetCof = CADENCE_COF_DEFAULT;
 CADENCE_OUT cadence_stFreGetOut = CADENCE_OUT_DEFAULT;
 
 static ULONG cad_pvt_ulCadFreqPu = 0;
+static ULONG cad_pvt_ulCapValErr = 0;
+static ULONG cad_pvt_ulCapValErrLast = 0;
 /***************************************************************
  Function: cadence_voCadenceCof;
  Description: cadence function coef cal
@@ -105,18 +107,16 @@ static void cadence_voCadenceIdle(UWORD source)
  Subroutine Call: N/A
  Reference: N/A
 ****************************************************************/
-static ULONG ulCaputureCntErr = 0,ulCaputureCntErrLast = 0;
-UWORD testcadc;
-
 static void cadence_voCadenceHighFrequencyWork(UWORD source)
 {
-    if (source == 1 && cadence_stFreGetOut.uwCaputureNumCnt == 1)
+    /* 只有踏频一个脉冲会一直在此函数中,对运行无影响,即source==1 && cadence_stFreGetOut.uwCaputureNumCnt==0 的情况未处理 */
+
+    if (source == 1 && cadence_stFreGetOut.uwCaputureNumCnt == 1) 
     {
         cadence_stFreGetOut.uwCaputureOverflowCnt++;
     }
     else if (source == 2)
     {
-
         if (cadence_stFreGetOut.uwCaputureNumCnt == 0)
         {
             cadence_stFreGetOut.uwCaputureNumCnt = 1;
@@ -124,20 +124,19 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
         }
         else if (cadence_stFreGetOut.uwCaputureNumCnt == 1)
         {
-            testcadc=0;
             cadence_stFreGetOut.uwForwardCnt++;
             cadence_stFreGetOut.uwCaputureNumCnt = 2;
 
             cadence_stFreGetOut.uwCaputure2Cnt = (UWORD)iCap_GetCaptureValue(0, CAP_CH(2));
 
-            ulCaputureCntErrLast = ulCaputureCntErr;
+            cad_pvt_ulCapValErrLast = cad_pvt_ulCapValErr;
 
-            ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * 720 * cadence_stFreGetCof.uwTimerUnit) -
+            cad_pvt_ulCapValErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * 720 * cadence_stFreGetCof.uwTimerUnit) -
                             cadence_stFreGetOut.uwCaputure1Cnt + cadence_stFreGetOut.uwCaputure2Cnt;
             cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
 
             /* Cadence Freq Cal */
-            cad_pvt_ulCadFreqPu = (ULONG)(((UQWORD)HW_TIM1CLK_KHZ * 1000 << 20) / ((((UQWORD)ulCaputureCntErr + (UQWORD)ulCaputureCntErrLast)>>1)* cadence_stFreGetCof.uwNumbersPulses * FBASE));
+            cad_pvt_ulCadFreqPu = (ULONG)(((UQWORD)HW_TIM1CLK_KHZ * 1000 << 20) / ((((UQWORD)cad_pvt_ulCapValErr + (UQWORD)cad_pvt_ulCapValErrLast)>>1)* cadence_stFreGetCof.uwNumbersPulses * FBASE));
 
             cadence_stFreGetOut.uwCaputureNumCnt = 1;
             cadence_stFreGetOut.uwCaputure1Cnt = cadence_stFreGetOut.uwCaputure2Cnt; 
@@ -153,7 +152,7 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
     	//do noting
     }
 
-    if (cadence_stFreGetOut.cadence_dir == CADENCE_DIR_BACKWARD) // 100ms
+    if (cadence_stFreGetOut.cadence_dir == CADENCE_DIR_BACKWARD) 
     {
         cadence_stFreGetOut.cadence_fsm = CADENCE_BACKWOR;
     }
@@ -171,7 +170,6 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
         cadence_stFreGetOut.cadence_dir = CADENCE_DIR_ERROR;
         cadence_stFreGetOut.cadence_fsm = CADENCE_ERROR;
         cadence_stFreGetOut.uwFreqPercent = 0;
-        cp_stHistoryPara.uwCadSensorAlamTimes++;
     }
     else if (cadence_stFreGetOut.uwCaputureOverflowCnt > cadence_stFreGetCof.uwHfMaxTimeCnt)
     {
@@ -189,10 +187,10 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
     }
     else 
     {
-        cadence_stFreGetOut.uwFrequencyPu = cad_pvt_ulCadFreqPu;
+        cadence_stFreGetOut.uwFrequencyPu = cad_pvt_ulCadFreqPu; // Q20
         
         cadence_stFreGetOut.uwLPFFrequencyPu = (cadence_stFreGetOut.uwLPFFrequencyPu * cadence_stFreGetCof.uwCadenceLPFgain +
-                                                cadence_stFreGetOut.uwFrequencyPu * (100 - cadence_stFreGetCof.uwCadenceLPFgain)) / 100;
+                                                cadence_stFreGetOut.uwFrequencyPu * (100 - cadence_stFreGetCof.uwCadenceLPFgain)) / 100;  // Q20
         cadence_stFreGetOut.uwFreqPercent = (UWORD)(((ULONG)cadence_stFreGetOut.uwLPFFrequencyPu << 14) / cadence_stFreGetCof.uwMaxCadenceFre); // Q14
     }
 }
@@ -285,6 +283,10 @@ void cadence_voCadenceInit(void)
     cadence_stFreGetOut.blCadenceCalStartState = FALSE;
     cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
     cadence_stFreGetOut.cadence_dir = CADENCE_DIR_IDLE;
+
+    cad_pvt_ulCadFreqPu = 0;
+    cad_pvt_ulCapValErr = 0;
+    cad_pvt_ulCapValErrLast = 0;
 }
 /***************************************************************
  Function: cadence_voCadenceCal

+ 1 - 1
User project/3.BasicFunction/Source/bikespeed.c

@@ -89,7 +89,7 @@ static void bikespeed_voBikeSpeedIdle(UWORD source)
         }
         bikespeed_stFreGetOut.uwCaputureNumCnt++;
         bikespeed_stFreGetOut.uwCaputureOverflowCnt = 0;
-        if (bikespeed_stFreGetOut.uwCaputureNumCnt == bikespeed_stFreGetCof.uwNumbersValidPulse2Start)
+        if (bikespeed_stFreGetOut.uwCaputureNumCnt >= bikespeed_stFreGetCof.uwNumbersValidPulse2Start)
         {
             bikespeed_stFreGetOut.blBikeSpeedCalStartState = TRUE;
             bikespeed_stFreGetOut.uwCaputureOverflowCnt = 0;

+ 1 - 0
User project/3.BasicFunction/Source/canAppl.c

@@ -373,6 +373,7 @@ void Can_voMC_Run_1ms(void) /* parasoft-suppress METRICS-28 "本项目圈复杂
             
             if (alm_unBikeCode.bit.CadenceSen == 1)
             {
+                cp_stHistoryPara.uwCadSensorAlamTimes++;
                 MC_ErrorCode.ERROR_Bit.Fault_CadenceSensor = 1;
             }
             

+ 86 - 1
tests/unit_test/board_sim/api_rt/api_rt_cap.c

@@ -15,7 +15,62 @@ void iRtCap_Init(void)
     Caps[0].CapBase = TIMER1;
 }
 
+void iRtCap_Isr(uint8_t devIndex)
+{   
+    uint32_t base = Caps[devIndex].CapBase;
+    uint16_t  capValues[5]={0,0,0,0,0};
+    uint8_t  results[5]={0,1,2,3,4};
+    uint16_t tmpIntf;
 
+    tmpIntf = TIMER_INTF(base);   
+    for (int i = 1; i < 5; i++)
+    {
+        if (tmpIntf & (0x01 << i ))
+        {
+            capValues[i] = iCap_GetCaptureValue(devIndex,(i-1));
+        }
+    }
+    if (tmpIntf & 0x01)
+    {      
+        capValues[0] = iCap_GetPeriod(devIndex) >> 1;
+    }
+
+    for(int i = 0; i < 4; i++)
+    { 
+        for(int j = 0;j < (4-i); j++)
+        {
+           if(capValues[results[j]]< capValues[results[j + 1]])
+           {
+               uint8_t tmp = results[j];
+               results[j] = results[j + 1];
+               results[j + 1] = tmp;
+           }
+        }
+    }
+    for(int i = 0; i < 5; i++)
+    { 
+          if (tmpIntf & (0x01 << results[i]))
+          {
+              if(results[i]==0)
+              {
+                  if (Caps[devIndex].CountMaxISR.Enable && Caps[devIndex].CountMaxISR.Action != 0)
+                  {
+                      Caps[devIndex].CountMaxISR.Action();
+                  }
+                  TIMER_INTF(base) &= ~0x01;
+              }
+              else
+              {
+                    if (Caps[devIndex].ChannelISR[results[i]-1].Enable && Caps[devIndex].ChannelISR[results[i]-1].Action != 0)
+                    {
+                        Caps[devIndex].ChannelISR[results[i]-1].Action();
+                    }
+                    TIMER_INTF(base) &= ~(0x01 << results[i]);
+              }
+              
+          }
+    }
+}
 
 /* ========================================================================== */
 /* ============================== API Functions ============================= */
@@ -45,6 +100,36 @@ uint32_t iCap_GetCaptureValue(uint8_t devIndex, uint8_t channelIndex)
     }
     return value;
 }
-    
+
+uint32_t iCap_GetPeriod(uint8_t devIndex)
+{
+    return (HW_TIM_CLOCK_HZ / 100 / 40);
+}
+
+void iCap_BindDeviceInterrupt(uint8_t devIndex, void (*action)())
+{
+    Caps[devIndex].CountMaxISR.Action = action;
+}
+
+void iCap_BindChannelInterrupt(uint8_t devIndex, uint8_t channelIndex, void (*action)())
+{
+    Caps[devIndex].ChannelISR[channelIndex].Action = action;
+}
+
+void iCap_EnableDeviceInterrupt(uint8_t devIndex)
+{
+    Caps[devIndex].CountMaxISR.Enable = 1;
+}
+
+void iCap_EnableChannelInterrupt(uint8_t devIndex, uint8_t channelIndex)
+{
+    Caps[devIndex].ChannelISR[channelIndex].Enable = 1;
+}
+
+void iCap_SetEdgeType(uint8_t devIndex, uint8_t channelIndex, ApiCap_EdgeType edge)
+{}
+
+
+
 
 

+ 11 - 1
tests/unit_test/board_sim/api_rt/api_rt_cap.h

@@ -3,12 +3,18 @@
 
 #include "api_cap.h"
 #include <stdint.h>
+#include "api_rt_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
 
 
 typedef struct 
 {
     uint32_t            CapBase;
-
+    ApiRt_Interrupt CountMaxISR;
+    ApiRt_Interrupt ChannelISR[4];
 } ApiRtCap_Handle;
 
 extern ApiRtCap_Handle Caps[1];
@@ -16,4 +22,8 @@ extern ApiRtCap_Handle Caps[1];
 void iRtCap_Init(void);
 void iRtCap_Isr(uint8_t devIndex);
 
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
 #endif

+ 22 - 0
tests/unit_test/board_sim/api_rt/api_rt_common.h

@@ -0,0 +1,22 @@
+#ifndef _API_RT_COMMON_H_
+#define _API_RT_COMMON_H_
+
+#include "stdint.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+typedef struct
+{
+    uint8_t Enable;
+    void (*Action)();
+} ApiRt_Interrupt;
+
+void iRt_Init();
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+#endif

+ 29 - 21
tests/unit_test/test_cadence.cpp

@@ -9,16 +9,21 @@ class CadenceTest : public testing::Test
 protected:
     static void SetUpTestSuite()
     {
-        cadence_voCadenceInit();
-        iRt_Init();
+
     }
     virtual void SetUp() override
     {
+        iRt_Init();
+        iCap_BindDeviceInterrupt(0,IC_CountMaxISR);
+        iCap_EnableDeviceInterrupt(0);
+        iCap_BindChannelInterrupt(0,CAP_CH(2),IC_CadenceISR);
+        iCap_EnableChannelInterrupt(0,CAP_CH(2));
 
+        cadence_voCadenceInit();
     }
     virtual void TearDown() override
     {
-        cadence_voCadenceInit();
+
     }
 };
 
@@ -36,6 +41,7 @@ TEST_P(CadenceTest1, FreCal)
     int cadenceSignal = 0, cadCnt = 0, cadenceSignalLast = 0;
     int cadencePrd = get<0>(GetParam());
     int capValue = 0; 
+    int capOverflowCnt = 0, capOverflowCnt2 = 0;
 
     testGpioBValue[GPIOB] = get<1>(GetParam());
 
@@ -76,11 +82,14 @@ TEST_P(CadenceTest1, FreCal)
         /* Interrupt: update and capture */       
         if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP])  
         {
+            capOverflowCnt ++;
             cadence_voCadenceCal(1);
             testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0;
         }
         else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2])
         {
+            capOverflowCnt2 = capOverflowCnt;
+            capOverflowCnt = 0;
             cadence_voCadenceCal(2);
             testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 0;
         }      
@@ -89,7 +98,7 @@ TEST_P(CadenceTest1, FreCal)
 
     double cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 2 * 1048576 / cadencePrd / FBASE / cadence_stFreGetCof.uwNumbersPulses;  // Q20
 
-    if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || cadence_stFreGetOut.uwCaputureOverflowCnt > cadence_stFreGetCof.uwHfMaxTimeCnt || cadence_stFreGetOut.cadence_dir == 1)
+    if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || capOverflowCnt2 > cadence_stFreGetCof.uwHfMaxTimeCnt || cadence_stFreGetOut.cadence_dir == 1)
     {
         EXPECT_NEAR(cadence_stFreGetOut.uwFrequencyPu, 0, 0.1);
     }
@@ -102,40 +111,39 @@ TEST_P(CadenceTest1, FreCal)
 INSTANTIATE_TEST_SUITE_P(DiffCadencePeriod, CadenceTest1,
                          ::testing::Combine(::testing::Values(0, 500, 3000, 18002, 100000,1000000), ::testing::Values(0,0x0004)));
 
-TEST_F(CadenceTest, FreCal2)
+TEST_F(CadenceTest, IntSimultFreCal)
 {
     /* Coef Cal */
     cadence_voCadenceCof();
     cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
+    switch_flg.SysCoef_Flag = TRUE;
+    bikespeed_voBikeSpeedCof(); ///< timer更新中断函数中有bikespeed函数,防止运行时除0
 
     /* Test conditions */
     cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
     cadence_stFreGetOut.uwCaputureNumCnt = 1;
-    cadence_stFreGetOut.uwCaputure1Cnt = 0;
-    cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
+    cadence_stFreGetOut.uwCaputure1Cnt = 100;
+    cadence_stFreGetOut.uwCaputureOverflowCnt = 1;  ///< OverflowCnt cant be 0
     testGpioBValue[GPIOB] = 0;
 
     double overflowCnt = cadence_stFreGetOut.uwCaputureOverflowCnt;
     double cap1Cnt = cadence_stFreGetOut.uwCaputure1Cnt;
 
-    testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 1;
     testCh2CapValue[TIMER1] = 17900;
-    testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 1;
 
-    /* Interrupt: update and capture */       
-    if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP])  
+    /* Interrupt flag */ 
+    testTimerIntFlag2[TIMER1] = 0x0009;
+
+    /* Interrupt: update and capture */ 
+    if(testTimerIntFlag2[TIMER1] != 0)  
     {
-        cadence_voCadenceCal(1);
-        testTimerIntFlg[TIMER1][TIMER_INT_FLAG_UP] = 0;
+        iRtCap_Isr(0);
     }
-    else if(testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2])
-    {
-        cadence_voCadenceCal(2);
-        testTimerIntFlg[TIMER1][TIMER_INT_FLAG_CH2] = 0;
-    }        
-
-    double cadFreqPu =  overflowCnt * 18000 + cadence_stFreGetOut.uwCaputure2Cnt - cap1Cnt;
-    cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 2 * 1048576 / cadFreqPu / FBASE / cadence_stFreGetCof.uwNumbersPulses;  // Q20
+ 
+    double capValErrLast = 0, capValErr = 0, cadFreqPu = 0;
+    capValErrLast = capValErr;
+    capValErr =  overflowCnt * 18000 + cadence_stFreGetOut.uwCaputure2Cnt - cap1Cnt;
+    cadFreqPu = (double)TIM1CLK_KHZ * 1000 * 1048576 / ((capValErr + capValErrLast) / 2)/ FBASE / cadence_stFreGetCof.uwNumbersPulses;  // Q20
 
     if(cadFreqPu > cadence_stFreGetCof.uwMaxCadenceFre || cadence_stFreGetOut.uwCaputureOverflowCnt > cadence_stFreGetCof.uwHfMaxTimeCnt || cadence_stFreGetOut.cadence_dir == 1)
     {

+ 3 - 0
tests/unit_test/test_user.c

@@ -5,6 +5,7 @@ int testAdcInjectData1[2];
 int testAdcInjectData2[2];
 int testAdcIntFlg[2][2];
 int testTimerIntFlg[2][4];
+int testTimerIntFlag2[2];
 int testCh2CapValue[2];
 int testCh3CapValue[2];
 int testGpioBValue[2];
@@ -21,6 +22,8 @@ UWORD adc_uwRdsonVReg;
 UWORD adc_uwRdsonWReg;
 UWORD adc_uwADDMAPhase1;
 
+SYS_FMS_FLAG   switch_flg;
+
 int timer_interrupt_flag_get(int timer_periph, int interrupt)
 {
     return testTimerIntFlg[timer_periph][interrupt];

+ 6 - 2
tests/unit_test/test_user.h

@@ -1,4 +1,5 @@
 #include "Cadence.h"
+#include "InputCapture.h"
 #include "bikespeed.h"
 #include "torquesensor.h"
 #include "adc.h"
@@ -19,6 +20,7 @@
 #include "Temp.h"
 #include "spdctrmode.h"
 #include "user.h"
+#include "FSM_1st.h"
 
 
 #include "api_rt.h"
@@ -51,9 +53,10 @@ extern "C" {
 #define ADC_IDATA0(adcx)   testAdcInjectData0[adcx]
 #define ADC_IDATA1(adcx)   testAdcInjectData1[adcx]
 #define ADC_IDATA2(adcx)   testAdcInjectData2[adcx]
-#define TIMER_CH2CV(timex) testCh2CapValue[timex]
-#define TIMER_CH3CV(timex) testCh3CapValue[timex]
+#define TIMER_CH2CV(timerx) testCh2CapValue[timerx]
+#define TIMER_CH3CV(timerx) testCh3CapValue[timerx]
 #define GPIO_ISTAT(gpiox)  testGpioBValue[gpiox]
+#define TIMER_INTF(timerx)  testTimerIntFlag2[timerx]
 
 //#define ABS(x) ((x) >= 0 ? (x) : (-(x)))
 
@@ -62,6 +65,7 @@ extern int testAdcInjectData1[2];
 extern int testAdcInjectData2[2];
 extern int testAdcIntFlg[2][2];
 extern int testTimerIntFlg[2][4];
+extern int testTimerIntFlag2[2];
 extern int testCh2CapValue[2];
 extern int testCh3CapValue[2];
 extern int testGpioBValue[2];

+ 1 - 0
xmake.lua

@@ -19,6 +19,7 @@ target("unittest")
     add_files("User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Source/CodePara.c", "User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Source/mathtool.c")
     add_files("User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Source/macroequ.c","User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Source/glbcof.c")
     add_files("User project/3.BasicFunction/Source/Cadence.c", "User project/3.BasicFunction/Source/bikespeed.c", "User project/3.BasicFunction/Source/torquesensor.c")
+    add_files("User project/3.BasicFunction/Source/InputCapture.c")
     add_files("User project/2.MotorDrive/Source/adc.c", "User project/2.MotorDrive/Source/pwm.c", "User project/2.MotorDrive/Source/packed/torqobs.c")
     add_files("User project/2.MotorDrive/Source/packed/pwrlim.c", "User project/2.MotorDrive/Source/packed/asr.c", "User project/2.MotorDrive/Source/packed/brake.c")
     add_files("User project/3.BasicFunction/Source/Temp.c")