]> rtime.felk.cvut.cz Git - arc.git/blobdiff - system/SchM/SchM.c
EcuM: More SchM,Gpt stuff
[arc.git] / system / SchM / SchM.c
index a619af9c1dadc975b01ead5c6863650a62a71fa0..cab78fc70ca956dc146a49a76512508c6f1100d1 100644 (file)
  * -------------------------------- Arctic Core ------------------------------*/\r
 \r
 \r
+/* ----------------------------[information]----------------------------------*/\r
+/*\r
+ * Author: mahi\r
+ *\r
+ * Part of Release:\r
+ *   3.1.5\r
+ *\r
+ * Description:\r
+ *   Implements the SchM module\r
+ *\r
+ * Support:\r
+ *   General                             Have Support\r
+ *   -------------------------------------------\r
+ *   SCHM_DEV_ERROR_DETECT             N\r
+ *   SCHM_VERSION_INFO_API             N\r
+ *\r
+ *   General                             Have Support\r
+ *   -------------------------------------------\r
+ *   SCHM_POSITION_IN_TASK             N\r
+ *   SCHM_MAINFUNCTION_REF             N\r
+ *   SCHM_MAPPED_TO_TASK               N\r
+ *   .....\r
+ *\r
+ * Implementation Notes:\r
+ *   There are a lot of examples in SchM about scheduling and it\r
+ *   all seems very complicated. What is boils down to is that\r
+ *   the BSW MainFunctions have different requirements. Most modules\r
+ *   have only periodic needs for timeouts and other things. But there\r
+ *   are also module that needs extra iterations at certain points in time, to\r
+ *   be really efficient.\r
+ *\r
+ *\r
+ *   BSW Module Code:\r
+ *    SchM_Enter_NvM(EXCLUSIVE_AREA_0);\r
+ *    ..Do stuff...\r
+ *    SchM_Enter_NvM(EXCLUSIVE_AREA_0);\r
+ *\r
+ *   but today we have Irq_Save(state), Irq_Restore(state).\r
+ *   ArcCore Irq_Save/Irq_Restore is almost the same as SuspendAllInterrupts/ResumeAllInterrupts,\r
+ *   since they can both be nested and saves state. But the OSEK (Susp../Resume..) can't do it locally, it\r
+ *   assumes some kind of local FIFO, that is bad.\r
+ *\r
+ *\r
+ * BSW Modules with generated mainfunction period times. Checked Only 3.1.5\r
+ *\r
+ *          Specification                        Studio   Core=Generator\r
+ *  --------------------------------------------------------------------------------------\r
+ *  Adc     N/A *1\r
+ *  Can     CanMainFunctionReadPerdiod             No      No\r
+ *          CanMainFunctionWritePerdiod\r
+ *          ..\r
+ *  CanIf   Have No mainf                          N/A\r
+ *  CanNm   CanNmMainFunctionPeriod                Yes     Accessible in struct.. not as define\r
+ *  CanSm   Have mainf. but no period              Yes*2   Nothing is generated\r
+ *  CanTp   CanTpMainFunctionPeriod                Yes     CANTP_MAIN_FUNCTION_PERIOD_TIME_MS\r
+ *  CanTrcv Have mainf. but no period              N/A\r
+ *  Com     Have mainf. but no period              No*3\r
+ *  ComM    ComMMainFunctionPeriod                 Yes     Accessible in struct.. not as define\r
+ *  Dcm     Have MainF. DcmTaskTime                Yes     DCM_MAIN_FUNCTION_PERIOD_TIME_MS\r
+ *  Dem     Have MainF. DemTaskTime                                No\r
+ *  EcuM    Have MainF.EcuMMainFunctionPeriod      Yes     ECUM_MAIN_FUNCTION_PERIOD\r
+ *  Ea      Have MainF. ON_PRE_CONDITION (ie not cyclic)\r
+ *  Eep     Have MainF. VARIABLE_CYCLIC\r
+ *  Fee     Have MainF. ON_PRE_CONDITION\r
+ *  Fls     Have MainF. FIXED_CYCLIC\r
+ *  IoHwAb  Have no mainfunction\r
+ *  ..\r
+ *  Nm      Have MainF. FIXED_CYCLIC ,            No\r
+ *          NmCycletimeMainFunction\r
+ *  NvM     Have MainF. VARIABLE_CYCLIC                          No\r
+ *  PduR    Have no MainF.\r
+ *  Spi     Have MainF. FIXED_CYCLIC, no period\r
+ *  WdgM    Have MainF. WdgMTriggerCycle           *4\r
+ *\r
+ * *1 No MainFunction\r
+ * *2 What is it used for?\r
+ * *3 Com have lots of timing... it's related to what? (reads timer?)\r
+ * *4 Probably not.\r
+ *\r
+ * ----->>>>\r
+ *\r
+ * Conclusion:\r
+ * * Support in generator is extremely limited.\r
+ * * Support in specification is limited\r
+ * * Support in studio is limited\r
+ *\r
+ *  Write scheduling information directly in the SchM_<mod>.h files.\r
+ *  OR\r
+ *  Write scheduling information in SchM_cfg.h....better (keeps information in one place)\r
+ *\r
+ *     #if defined(USE_SCHM)\r
+ *     assert( SCHM_TIMER(x) == <period> )\r
+ *     #endif\r
+ *\r
+ *  It seems it's mandatory to include SchM_<mod>.h for each BSW module.\r
+ *  So,\r
+ *  - <mod>.c ALWAYS include SchM_<mod.h>\r
+ *  - SchM.c have condidional include on SchM_<mod>.h, e.g must define it's MainFunctions.\r
+ *\r
+ *\r
+ *\r
+ */\r
 \r
+#include "SchM.h"\r
+#include "SchM_cfg.h"\r
 \r
 \r
+#if defined(USE_MCU)\r
+#include "Mcu.h"\r
+#endif\r
+#if defined(USE_GPT)\r
+#include "Gpt.h"\r
+#endif\r
 \r
+#if defined(USE_CAN)\r
+#include "Can.h"\r
+#include "SchM_Can.h"\r
+#else\r
+#define        SCHM_MAINFUNCTION_CAN_WRITE()\r
+#define        SCHM_MAINFUNCTION_CAN_READ()\r
+#define        SCHM_MAINFUNCTION_CAN_BUSOFF()\r
+#define        SCHM_MAINFUNCTION_CAN_ERROR()\r
+#define        SCHM_MAINFUNCTION_CAN_WAKEUP()\r
+#endif\r
 \r
+#if defined(USE_CANIF)\r
+#include "CanIf.h"\r
+#include "SchM_CanIf.h"\r
+#endif\r
 \r
+#if defined(USE_PDUR)\r
+#include "PduR.h"\r
+#include "SchM_PduR.h"\r
+#endif\r
+\r
+#if defined(USE_COM)\r
+#include "Com.h"\r
+#include "SchM_Com.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_COMRX()\r
+#define SCHM_MAINFUNCTION_COMTX()\r
+#endif\r
+\r
+#if defined(USE_CANTP)\r
+#include "CanTp.h"\r
+#include "SchM_CanTp.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_CANTP()\r
+#endif\r
+\r
+#if defined(USE_J1939TP)\r
+#include "J1939Tp.h"\r
+#include "SchM_J1939TP.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_J1939TP()\r
+#endif\r
+\r
+\r
+#if defined(USE_DCM)\r
+#include "Dcm.h"\r
+#include "SchM_Dcm.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_DCM()\r
+#endif\r
+\r
+#if defined(USE_DEM)\r
+#include "Dem.h"\r
+#include "SchM_Dem.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_DEM()\r
+#endif\r
+\r
+#if defined(USE_PWM)\r
+#include "Pwm.h"\r
+#include "SchM_Pwm.h"\r
+#endif\r
+\r
+\r
+#if defined(USE_IOHWAB)\r
+#include "IoHwAb.h"\r
+#include "SchM_IoHwAb.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_IOWHAB()\r
+#endif\r
+\r
+#if defined(USE_FLS)\r
+#include "Fls.h"\r
+#include "SchM_Fls.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_FLS()\r
+#endif\r
+\r
+#if defined(USE_ECUM)\r
+#include "EcuM.h"\r
+#include "SchM_EcuM.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_ECUM()\r
+#endif\r
+\r
+#if defined(USE_EEP)\r
+#include "Eep.h"\r
+#include "SchM_Fls.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_EEP()\r
+#endif\r
+\r
+#if defined(USE_FEE)\r
+#include "Fee.h"\r
+#include "SchM_Fee.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_FEE()\r
+#endif\r
+\r
+#if defined(USE_EA)\r
+#include "Ea.h"\r
+#include "SchM_Ea.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_EA()\r
+#endif\r
+\r
+#if defined(USE_NVM)\r
+#include "NvM.h"\r
+#include "SchM_NvM.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_NVM()\r
+#endif\r
+\r
+#if defined(USE_COMM)\r
+#include "ComM.h"\r
+#include "SchM_ComM.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_COMM()\r
+#endif\r
+\r
+#if defined(USE_NM)\r
+#include "Nm.h"\r
+#include "SchM_Nm.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_NM()\r
+#endif\r
+\r
+#if defined(USE_CANNM)\r
+#include "CanNm.h"\r
+#include "SchM_CanNm.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_CANNM()\r
+#endif\r
+\r
+#if defined(USE_CANSM)\r
+#include "CanSM.h"\r
+#include "SchM_CanSM.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_CANSM()\r
+#endif\r
+\r
+#if defined(USE_UDPNM)\r
+#include "UdpNm.h"\r
+#endif\r
+\r
+#if defined(USE_LINSM)\r
+#include "LinSM.h"\r
+#endif\r
+\r
+#if defined(USE_SPI)\r
+#include "Spi.h"\r
+#include "SchM_Spi.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_SPI()\r
+#endif\r
+\r
+#if defined(USE_WDG)\r
+#include "Wdg.h"\r
+#endif\r
+\r
+#if defined(USE_WDGM)\r
+#include "WdgM.h"\r
+#include "SchM_WdgM.h"\r
+#else\r
+#define SCHM_MAINFUNCTION_WDMG()\r
+#endif\r
+\r
+SCHM_DECLARE(CAN_WRITE);\r
+SCHM_DECLARE(CAN_READ);\r
+SCHM_DECLARE(CAN_BUSOFF);\r
+SCHM_DECLARE(CAN_WAKEUP);\r
+SCHM_DECLARE(CAN_ERROR);\r
+SCHM_DECLARE(COMRX);\r
+SCHM_DECLARE(COMTX);\r
+SCHM_DECLARE(CANTP);\r
+SCHM_DECLARE(CANNM);\r
+SCHM_DECLARE(DCM);\r
+SCHM_DECLARE(DEM);\r
+SCHM_DECLARE(COMM);\r
+SCHM_DECLARE(NM);\r
+SCHM_DECLARE(CANSM);\r
+SCHM_DECLARE(ECUM);\r
+SCHM_DECLARE(NVM);\r
+SCHM_DECLARE(FEE);\r
+SCHM_DECLARE(EA);\r
+SCHM_DECLARE(FLS);\r
+SCHM_DECLARE(WDGM_TRIGGER);\r
+SCHM_DECLARE(WDGM_ALIVESUPERVISION);\r
 \r
-#include "SchM.h"\r
 \r
 \r
 void SchM_Init( void ) {\r
-       \r
+\r
 }\r
+\r
 void SchM_Deinit( void ) {\r
-       \r
+\r
 }\r
 \r
 void SchM_GetVersionInfo( Std_VersionInfoType *versionInfo ) {\r
-       \r
+\r
+}\r
+\r
+\r
+static void runMemory( void ) {\r
+       SCHM_MAINFUNCTION_NVM();\r
+       SCHM_MAINFUNCTION_EA();\r
+       SCHM_MAINFUNCTION_FEE();\r
+       SCHM_MAINFUNCTION_EEP();\r
+       SCHM_MAINFUNCTION_FLS();\r
+       SCHM_MAINFUNCTION_SPI();\r
 }\r
 \r
-/*  \r
- * Implement\r
+/**\r
+ * Startup task.\r
  */\r
-// Critical sections\r
-// void SchM_Enter_<ModulePrefix>( uint8 instance, uint8 exclusiveArea )\r
-// void SchM_Exit_<ModulePrefix>( uint8 instance, uint8 exclusiveArea )\r
-\r
-// Triggers\r
-// SchM_ReturnType SchM_ActMainFunction_<ModulePrefix>( uint8 instance, uint8 activationPoint );\r
-// SchM_ReturnType SchM_CancelMainFunction_<ModulePrefix>( uint8 instance, uint8 activationPoint );\r
-\r
-/* \r
- * Callable functions in the <ModulePrefix>\r
- */ \r
-// <ModulePrefix>_MainFunction_<name>()\r
-// <ModulePrefix>_MainFunction_<name>()\r
+TASK(SchM_Startup){\r
+\r
+       /* At this point EcuM ==  ECUM_STATE_STARTUP_ONE */\r
+\r
+       /* Set events on TASK_ID_BswService_Mem */\r
+       SetRelAlarm(ALARM_ID_Alarm_BswService, 10, 2);\r
+\r
+       /*\r
+        * Call EcuM_StartupTwo that do:\r
+        * - Startup RTE,\r
+        * - Wait for Nvm to complete\r
+        * - Call EcuM_AL_DriverInitThree() to initiate Nvm dependent modules.\r
+        */\r
+       EcuM_StartupTwo();\r
+\r
+       /* Start to schedule BSW parts */\r
+       CancelAlarm(ALARM_ID_Alarm_BswService);\r
+       SetRelAlarm(ALARM_ID_Alarm_BswService, 10, 5);\r
+\r
+       EcuM_RequestRUN(ECUM_USER_User_1);\r
+\r
+       ActivateTask(TASK_ID_Application);\r
+\r
+       TerminateTask();\r
+\r
+}\r
+\r
+\r
+TASK(SchM_BswService) {\r
+       EcuM_StateType  state;\r
+\r
+       EcuM_GetState(&state);\r
+\r
+       switch( state ) {\r
+       case ECUM_STATE_STARTUP_ONE:\r
+               /* Nothing to schedule */\r
+               break;\r
+       case ECUM_STATE_STARTUP_TWO:\r
+               runMemory();\r
+               break;\r
+       default:\r
+               runMemory();\r
+\r
+               SCHM_MAINFUNCTION_ECUM();\r
+\r
+               SCHM_MAINFUNCTION_CAN_WRITE();\r
+               SCHM_MAINFUNCTION_CAN_READ();\r
+               SCHM_MAINFUNCTION_CAN_BUSOFF();\r
+               SCHM_MAINFUNCTION_CAN_ERROR();\r
+               SCHM_MAINFUNCTION_CAN_WAKEUP();\r
+\r
+\r
+               SCHM_MAINFUNCTION_COMRX();\r
+               SCHM_MAINFUNCTION_COMTX();\r
+\r
+               SCHM_MAINFUNCTION_CANTP();\r
+               SCHM_MAINFUNCTION_J1939TP();\r
+               SCHM_MAINFUNCTION_DCM();\r
+               SCHM_MAINFUNCTION_DEM();\r
+\r
+               SCHM_MAINFUNCTION_IOWHAB();\r
+               SCHM_MAINFUNCTION_COMM();\r
+               SCHM_MAINFUNCTION_NM();\r
+               SCHM_MAINFUNCTION_CANNM();\r
+               SCHM_MAINFUNCTION_CANSM();\r
+               SCHM_MAINFUNCTION_WDGM_TRIGGER();\r
+               SCHM_MAINFUNCTION_WDGM_ALIVESUPERVISION();\r
+               break;\r
+       }\r
+\r
+       TerminateTask();\r
+}\r
+\r
+void SchM_MainFunction( void ) {\r
+\r
+}\r
 \r
 \r
 \r