프로젝트

일반

사용자정보

Documentation #354

안일환(SDC)이(가) 8달 전에 변경

증상 
 RTE에 추가된 초기화 되지 않는 변수가 상황에 따라 RETENTION 영역에 할당 될 수도 있고, 그렇지 않을 수도 있음. 
 이로 인해, 예상되지 않은 동작을 할 수 있음. 

 Ex) 
 ``` c 
 static uint8    ss_GetSleepCondition() 
 { 
     uint8 Sleep_Ret = 0; 
     uint8 App_SleepCond; 
     uint8 Nvm_SleepCond; 

     Rte_Read_R_Mode_SleepCondition_Mode_SleepCond(&App_SleepCond); 
     Rte_Read_R_Mode_Nvm_SleepCondition_Mode_SleepCond(&Nvm_SleepCond); 
 ... 
 } 


 #ifndef Rte_Read_R_Mode_SleepCondition_Mode_SleepCond 
 #define Rte_Read_R_Mode_SleepCondition_Mode_SleepCond \ 
   Rte_Read_SWC_AppMode_R_Mode_SleepCondition_Mode_SleepCond 
 #endif 

 FUNC(Std_ReturnType, RTE_CODE) 
 Rte_Read_SWC_AppMode_R_Mode_SleepCondition_Mode_SleepCond(P2VAR(boolean, AUTOMATIC, RTE_APPL_DATA) Data) 
 { 
   /* polyspace<MISRA-C:14.2:Not a defect:Justify with annotations> AUTOSAR Standard rte_sws_1236 */ 
   Rte_ReadHook_SWC_AppMode_R_Mode_SleepCondition_Mode_SleepCond_Start(Data); 

   if (Data != NULL_PTR) 
   { 
     *Data = Rte_GblSR_Mode_SleepCondition_113_Mode_SleepCond_88; 
   } 

   /* polyspace<MISRA-C:14.2:Not a defect:Justify with annotations> AUTOSAR Standard rte_sws_1236 */ 
   Rte_ReadHook_SWC_AppMode_R_Mode_SleepCondition_Mode_SleepCond_Return(Data); 

   return Rte_GucStatus_SR_Mode_SleepCondition_113_Mode_SleepCond_88; 
 } 

 #define RTE_START_SEC_VAR_CLEARED_8 
 #include "MemMap.h" 
 static VAR(boolean, RTE_VAR_CLEARED) Rte_GblSR_Mode_SleepCondition_113_Mode_SleepCond_164; 
 static VAR(boolean, RTE_VAR_CLEARED) Rte_GblSR_Mode_SleepCondition_113_Mode_SleepCond_88; 

 #define RTE_STOP_SEC_VAR_CLEARED_8 
 #include "MemMap.h" 


 #elif defined (RTE_START_SEC_VAR_CLEARED_8) 
   #undef RTE_START_SEC_VAR_CLEARED_8 
  
   #pragma ghs section bss=".bss.DEFAULT_RAM_VAR_CLEARED" 
 ``` 

 ``` c 
   .ramcode                                 ABS ALIGN(4)      : > RAM_SYSTEM 
   .pidbase                                     ALIGN(16)     : > . 
   .data                                        ALIGN(4)      : {*(".data*")} > . 
   .mcal_data                                   ALIGN(4)      : > . 
   .bss                          CLEAR (NOLOAD) ALIGN(4)      : {*(".bss.*VAR_CLEARED*") 
                                                             *(".bss.ATM_RAM_VAR_CLEARED") 
                                                             *(".bss.DEFAULT_RAM_VAR_CLEARED") 

 ``` 

 ``` 
  .bss               2040689a+000001 Rte_GblSR_Mode_SleepCondition_113_Mode_SleepCond_88..D.3A.5Cprojects.5CAMOSENSE.5CTPMS.5Camosense.5Ctpms.2Dplatform.2Ds32k.5CDebug.5CGenerated.5CBsw_Output.5Csrc.5CRte. 
  .bss               2040689c+000001 Rte_GblSR_Mode_SleepCondition_113_Mode_SleepCond_164..D.3A.5Cprojects.5CAMOSENSE.5CTPMS.5Camosense.5Ctpms.2Dplatform.2Ds32k.5CDebug.5CGenerated.5CBsw_Output.5Csrc.5CRte. 

 ``` 

 S32K312의 retenrion memory 크기는 32KB이고, Hex로 0x8000이다. 
 ![](clipboard-202504301025-o8j4q.png) 


 # 해결 방법 
 어느 곳에 배치가 되더라고, Reset이나, Wakeup 등의 조건에 따라 명시적으로 Init시, 초기화하도록 함 

 ``` c 
 void App_amo_Init(void) 
 { 
     Rte_Write_P_Mode_SleepCondition_Mode_SleepCond(0u); /* SC_NOT_SET */ 
 } 
 ``` 

 ``` c 
 FUNC(void, App_Tpms_CODE) RTE_RUNNABLE_App_Tpms_IE_Runnable(void) 
 { 
     Std_ReturnType retVal; 
     EcuM_StateType sShutdownTarget = 0xFFu; 
     EcuM_ModeType sShutdownMode = 0xFFu; 

     retVal = Rte_Call_clientPort_ShutdownTarget_GetLastShutdownTarget(&sShutdownTarget, &sShutdownMode); 

     App_amo_tda5235_Init(); 
     App_CanTxRx_Init(); 
     App_amo_Init(); 
    
     if ((retVal != RTE_E_OK) 
     || (sShutdownTarget != ECUM_STATE_SLEEP)) 
     { 
         App_amo_Init_POR(); 
         App_amo_tda5235_Init_POR(); 
         App_amo_ivd_Init_POR(); 
         App_CanTxRx_Init_POR(); 
     } 
 } 
 ``` 

 ![](clipboard-202504301029-nz7us.png) 

뒤로