Thursday, July 30, 2020

MasterSar: Initialize one

main()
{

EcuM_Init();

}

-- Bsw/EcuM/EcuM.c --

EcuM_Init()
{
    /* Set the current state of the EcuM to STARTUP */
    ECUM_STATE_STARTUP;

EcuM_AL_SetProgrammableInterrupts(); /* Source/EcuM_Callout_stubs.c */

    ECUM_DRIVERINITLIST_ZERO(); /* EcuM_AL_DriverInitZero() */

    /* Clear wakeups from all sources */
    EcuM_InternalClearWakeupEvent(ECUM_WKSOURCE_ALL_SOURCES); /*   Clear EcuM_BswM_BufferedWakeups & EcuM_ValidatedWakeups */

    /* Set the current state of the EcuM */
    EcuM_SetModuleState(ECUM_STATE_STARTUP_ONE);

    /* configuration pointer of the module */
    ECUM_DRIVERINITLIST_ONE(); /* Source/EcuM_Callout_stubs.c */

    EcuM_ValidatedWakeups |= ECUM_WKSOURCE_RESET;

    /* Store this source in the BufferedWakeups to validate it at the end of EcuM_StartupTwo */
    EcuM_BswM_BufferedWakeups |= ECUM_WKSOURCE_RESET;

    /* the global variables must be set directly at this place. */
    EcuM_CurrentShutdownTarget = EcuM_GetDefaultShutdownTarget();
    EcuM_CurrentShutdownMode = EcuM_GetDefaultShutdownMode();

    /* Start the AUTOSAR OS with the corresponding default appmode */
    EcuM_StartOS(EcuM_GetDefaultAppMode()); /* Source/EcuMCalloutStubs.c */

}

-- Source/EcuM_Callout_stubs.c --
FUNC(void, ECUM_CODE) EcuM_AL_DriverInitZero(void)
{
  ComM_InitMemory(); /* ComM/ComM.c */ ComM_InitStatus = COMM_UNINIT
  CanSM_InitMemory(); /* CanSM/CanSM.c */ CanSM_IsInitialized = CANSM_INITFUNCTION_NOT_CALLED;
  Com_InitMemory();   /* Com/Com.c */   Com_SetInitialized(FALSE);
  PduR_InitMemory(); /* PduR/PduR.c */  PduR_SetInitialized(FALSE);
  CanTrcv_30_Tja1145_InitMemory();
  BswM_InitMemory();  /* BswM/BswM.c */ BswM_SetInitialized(FALSE);
  Dem_InitMemory();   /* Dem/Dem.c */ Dem_InitState = DEM_INIT_UNINITIALIZED;
  Can_InitMemory(); /* Can/Can.c */   canConfigInitFlag = CAN_STATUS_UNINIT;  /* CAN103 */
  CanNm_InitMemory(); /* CanNM/CanNM.c */ CanNm_GetSizeOfNmState times CanNm_SetNmState(i, NM_STATE_UNINIT);
  CanTp_InitMemory(); /* CanTp/CanTp.c */ CanTp_Data_InitState() = CANTP_STATUS_NOT_INITIALIZED;
  Dem_PreInit( Dem_Config_Ptr ); /* Null */
  CanIf_InitMemory(); /* CanIf/CanIf.c */  CanIf_GetCtrlMode(CanIf_Controller_Value_Local) = CANIF_CS_UNINIT;
  Rte_InitMemory(); /* Gendata/src/Rte.c */   Rte_InitState = RTE_STATE_UNINIT; RteMemClr;
fc_sys_SetBrdID(); /* PF_SYS_MNG/src/SysGetUp.c */
fs_sys_CacheOn();
fc_sys_ResetStart();
fc_sys_AccStart( TRUE );
fc_iop_AccOn(); /* PrjMnGb/CNF/CnfIopTb.c */
fs_wrp_IniFlgSts();/*PF_SYS_WRP/Src/WrpSysCall.c */

}

/* Dem/Dem.c */
Dem_PreInit()
{
    Dem_Queue_PreInit(); -> EventCount = 5, Just initializing 5 variables to 0.
Dem_Mem_PreInit(); -> Initializing to 0.
    Dem_Esm_PreInit(); -> Setting debouncing values to 0.
    Dem_DtcSettingDisabled = FALSE;
    /* At this point:
       - BSW error reporting is enabled (Dem_ReportErrorStatus)
       - NvM has write access to RAM buffers (Dem may not access them!) */
    Dem_InitState = DEM_INIT_PREINITIALIZED;


}

/* Source/EcuMCalloutStubs.c */
void EcuM_StartOS(AppModeType appMode)
{
    fs_wrp_MemLibInit(); /* PF_SYS_WRP/src/WrpMemLb.c */ /* All (fixed) memory pools (like descriptors) for applications */

    fc_swc_MngInit(); /* PF_SWC_APL/src/SwcMng.c */

    /* Start OS must be called for each core */
    StartOS(appMode); appMode = 1, /* _osStartOSasm(); BSW/Os/Osekasm.s79 */

}

-- BSW/Os/Osekasm.s79 --
_osStartOSasm:;   - assembler part of startup code
   ; disable all interrupts
   ; set stack pointer to system stack
   ; set GBR register
   ; initialize minimun interrupts in interrupt priority table ;_osIPRInit
   ; jump to C part of StartOS
   osStartOSc();

/* BSW/Os/Osek.c */
osqFunc1 void osqFunc2 osStartOSc(void)
{
    osInitialize();
    osDisableLevel(); /* set_imask */

   osInitTCBs(); /* 53 Tasks */  osTcbActivationCount[nt]= 0; /* 42 priorities osQReadyTaskHead[np]= osQReadyTaskTail[np]= 0; */

   /* KB begin osekHWosFillTaskStacks (default) */
   osFillTaskStacks();
   osLastActiveTaskIndex = 0;
   osActiveTaskPrio = osHighReadyTaskPrio = osdNoActivePrio; /* mark as invalid for a nested interrupt */
   osActiveTaskIndex = osHighReadyTaskIndex = osdNoActiveTask;
   osIntNestingDepth = 0;
   osStartDispatcher = 0;
   osLockDispatcher = 1; /* lock dispatcher during StartOS */

   /* fullfills [SR:167] of $\AutosarOS\general\Generation5\_doc\12_SystemRequirements\RequirementsSpec_MicrosarOS.doc */
   osActiveISRID = INVALID_ISR;
   osIntAPIStatus = 0;
   /* assure that OS variables are really linked to RAM, osIntAPIStatus is volatile so compiler optimizations do not disturb */
   osIntAPIStatus = 7;
   osIntAPIStatus = 0;
   osResGlobalOccupationCounter = 0;

   for (nr=0; nr<osrNumberOfAllResources; nr++) { /* 36 */
         osResOccupationCounter[nr] = 0;
         osResActualTask[nr] = osdNoActiveTask;
   }

   /* activate all autostart tasks: Only one activated */
   for (nt= 0; nt < osrNumberOfAllTasks; nt++)
   {
      osTcbTaskState[nt] = SUSPENDED;
      if ((oskTcbAutoStart[nt] & osActiveAppMode) != 0)
      {
         (void) osSysActivateTask(nt);
      }

    osInitAlarms();

    /* setting up the task switch interrupt (alias dispatcher interrupt alias delayed interrupt) */
    osInitDelayedInt(); /* Gendata/Src/tcp.c */

   osInitTimer(); /* initialization of the hardware timer now after the startup-hook */

   /* free dispatcher (after osSysActivateTask for AutoStart-Tasks and after StartupHook */
   osLockDispatcher = 0;

   /* enable task level interrupt */
   osEnableLevel(); 

   osDispatch(); /* BSW\Os\osekext.h */ Executes the first task Init_Taskfunc */

}

/* BSW/Os/Osektask.c */
osqFunc2 osSysActivateTask(TaskType taskIndex) { /* PRQA S 1503 */
    priority = oskTcbHomePrio[taskIndex];
    osTcbTaskState[taskIndex] = PRE_READY;
    osTcbActivationCount[taskIndex]++;
    oskQActivationQueues[priority][osQReadyTaskTail[priority]]= taskIndex;
    osQReadyPrios[oskTcbReadyPrioOffset[taskIndex]]|= oskTcbReadyPrioMask[taskIndex];
    osQReadyTaskTail[priority]++;
    /* start dispatcher only if new task has greater prio */
    if (priority < osHighReadyTaskPrio)
    {
        osHighReadyTaskPrio   = priority;
        osHighReadyTaskIndex  = taskIndex;
        osStartDispatcher= osdTRUE;     /* for return from idle loop */
    }
    return E_OK;
}

/* BSW/os/OsekTime.c */
osInitAlarms()
{
    osInitMinHeap();
   /* for (alarmID= 0; alarmID < osrNumberOfAlarms; alarmID++) */
   initialize to 0
}

Monday, July 27, 2020

MasterSar: Code reading __Common

>> _Common

1. Can_GeneralTypes.h
    * It describes the type definitions of the AUTOSAR CAN components Can,CanIf,CanTrcv.
    * It includes ComStack_Types.h, Can_DrvGeneralTypes.h and CanIf_GeneralTypes.h.
    * Structure's CanTrcv_TrcvModeTypeTag, CanTrcv_TrcvWakeupModeTypeTag and CanTrcv_TrcvWakeupReasonTypeTag are defined as typedef enum to map string literials
       to integers.
    * And there is no need to include these structures when CAN Transceiver Driver.

2. Compiler.h
    * It defines different funcions macros for the declaration and definition of functions, that ensures correct syntax of function declarations.
    * It includes Compiler_Cfg.h.
   ---
    Seems to be same as IDE preprocessor definitions.

3. Compiler_cfg.h
    * It includes Rte_Compiler_Cfg.h.
    ---
    * Seems to be defining macros for CODE, CONST, PostBuildCFG, ZERO INIT, VAR_INIT, etc. for each modeule.
      I guess these are for defining sections for placement of each sections. These are for COM, CanSM,
      CDD, DEM, CAN, DrvDio, DrvFls, DrvMcu, DrvPort, DrvSPI, WDG, PDUR, CANIF, FEE, COM, NvM, CANNM, NM,
      BSWM, CRC, DET, CANTP, VstdLib, etc. Only CANIF has some valid definitions to CANIF_APPL_VAR.

3.a. MemMap.h

     * Just has defined detailed macros of the above said modules in Compiler_cfg.h.

4. ComStack_Types.h
    * It includes ComStack_Cfg.h and Std_Types.h.
    ----
    Some COMTYPE and COMSTACKTYPE version information is available repeatedly. NotificationResultType
    macros are defined. Seems to be common for all kind of notification.
    Also, has some Error coded related to ParameterChangeRequest and BusTrcv error codes available.
    Some other structures PDUInfoType, BufReqRetType are defined.
    Important errorcode macros, TpDataStateType TpParameterType are defined here.TP_DATACONF/TP_DATARETRY
    seems to be data state of retried data.

5. Std_Types.h
    * It includes Platform_Types.h and Compiler.h.
    * It contains Std_versionInfoType.
    ---
    VendorID, ModuleID, SwVersions, etc.

6. Platform_Types.h
    * It defines global data types and structures.
    ---
    Important CPU data/bus width, Byte Order (Endian), C Basic Data type definitions.