String GenerateRteOsTaskName(OsTask task)
 {
     return("Rte_osTask_" + task.Name);
 }
Example #2
0
 public static String GenerateRteOsTaskFunctionName(OsTask task)
 {
     return("Rte_Task_Runnable_" + task.Name);
 }
        void Generate_RteTaskScheduler_Source_File()
        {
            double systickfreq           = AutosarApplication.GetInstance().SystickFrequencyHz;
            int    schedulerStepMicrosec = (int)((1000.0d / systickfreq) * 1000.0);

            String       FileName = RteFunctionsGenerator.GetRteFolder() + "\\" + Properties.Resources.RTE_TASK_SCHEDULER_C_FILENAME;
            StreamWriter writer   = new StreamWriter(FileName);

            RteFunctionsGenerator.GenerateFileTitle(writer, FileName, Properties.Resources.RTE_RUNTIME_ENVIRONMENT_FILE_DESCRIPTION);

            writer.WriteLine();
            RteFunctionsGenerator.AddInclude(writer, Properties.Resources.RTE_RUNTIME_ENVIRONMENT_H_FILENAME);
            writer.WriteLine();

            int tasksCount = AutosarApplication.GetInstance().OsTasks.Count;

            writer.WriteLine(RteFunctionsGenerator.CreateDefine("RTE_TASKS_COUNT", tasksCount.ToString(), false));

            int stepsCount = AutosarApplication.GetInstance().OsTasks.GetSchedulerNecessaryStepsCount(schedulerStepMicrosec);

            writer.WriteLine();
            writer.WriteLine(RteFunctionsGenerator.CreateDefine("RTE_SCHEDULER_STEPS", stepsCount.ToString(), false));

            writer.WriteLine();
            writer.WriteLine("/* One Rte Task pointer */");
            writer.WriteLine("typedef void (*Rte_Scheduler_Task)();");

            writer.WriteLine();
            writer.WriteLine("/* One step of scheduler */");
            writer.WriteLine("typedef  Rte_Scheduler_Task Rte_Scheduler_Step[RTE_TASKS_COUNT];");

            writer.WriteLine();
            writer.WriteLine("/* All possible steps in scheduler */");
            writer.WriteLine("typedef  Rte_Scheduler_Step Rte_Scheduler_Sequence[RTE_SCHEDULER_STEPS];");

            writer.WriteLine();
            writer.WriteLine("static uint32 schedulingCounter = 0u;");

            writer.WriteLine();

            String htim = "Not defined!";

            switch (AutosarApplication.GetInstance().MCUType.Type)
            {
            case MCUTypeDef.STM32F1xx:
            {
                htim = "htim4";
                break;
            }

            case MCUTypeDef.STM32F4xx:
            {
                htim = "htim13";
                break;
            }
            }

            writer.WriteLine("extern TIM_HandleTypeDef " + htim + ";");


            writer.WriteLine();
            writer.WriteLine("static const Rte_Scheduler_Sequence  taskScheduling =");
            writer.WriteLine("{");
            /* Sort tasks by priority is necessary */
            AutosarApplication.GetInstance().OsTasks.DoSort();



            for (int i = 0; i < stepsCount; i++)
            {
                writer.WriteLine("    {");
                int writtenFunctions = 0;
                for (int j = 0; j < tasksCount; j++)
                {
                    OsTask task             = AutosarApplication.GetInstance().OsTasks[j];
                    bool   includeCondition = true;

                    int TaskMicrosec = (int)(task.PeriodMs * 1000);

                    int ost = schedulerStepMicrosec * i % TaskMicrosec;
                    includeCondition = (ost == 0);
                    if (includeCondition)
                    {
                        String osTaskName = RteFunctionsGenerator.GenerateRteOsTaskFunctionName(task);
                        writer.Write("        " + osTaskName);
                        if (writtenFunctions < tasksCount - 1)
                        {
                            writer.WriteLine(",");
                        }
                        else
                        {
                            writer.WriteLine();
                        }
                        writtenFunctions++;
                    }
                }

                /* Write necessary NULLs */
                for (int j = writtenFunctions; j < tasksCount; j++)
                {
                    writer.Write("        NULL");
                    if (j < tasksCount - 1)
                    {
                        writer.WriteLine(",");
                    }
                    else
                    {
                        writer.WriteLine();
                    }
                }
                writer.Write("    }");
                if (i < stepsCount - 1)
                {
                    writer.WriteLine(",");
                }
                else
                {
                    writer.WriteLine();
                }
            }
            writer.WriteLine("};");
            writer.WriteLine();

            /* Writing DoScheduling function */
            writer.WriteLine("void DoScheduling(void)");
            writer.WriteLine("{");
            writer.WriteLine("    if (__HAL_TIM_GET_FLAG(&" + htim + ", TIM_FLAG_UPDATE) != RESET)");
            writer.WriteLine("    {");
            writer.WriteLine("        __HAL_TIM_CLEAR_FLAG(&" + htim + ", TIM_FLAG_UPDATE);");
            writer.WriteLine("        uint32 index = schedulingCounter % RTE_SCHEDULER_STEPS;");
            writer.WriteLine("        for (uint32 i = 0; i < RTE_TASKS_COUNT; i++)");
            writer.WriteLine("        {");
            writer.WriteLine("            if (NULL != taskScheduling[index][i])");
            writer.WriteLine("            {");
            writer.WriteLine("                taskScheduling[index][i]();");
            writer.WriteLine("            }");
            writer.WriteLine("            else");
            writer.WriteLine("            {");
            writer.WriteLine("                break;");
            writer.WriteLine("            }");
            writer.WriteLine("        }");
            writer.WriteLine("        schedulingCounter++;");
            writer.WriteLine("    }");
            writer.WriteLine("}");


            RteFunctionsGenerator.WriteEndOfFile(writer);
            writer.Close();
        }
Example #4
0
 public static String GenerateRteOsTaskName(OsTask task)
 {
     return("Rte_Task_" + task.Name);
 }