/** * Generate the OIL/C code for a processor * * @param processor L'AST du processeur. */ private void genCpu(ProcessSubcomponent ps) { Cpu cpu = oil.getCpu(); Os os = cpu.getOs(); _mainHCode.addOutputNewline("#include \"kernel.h\""); _mainHCode.addOutputNewline("#include \"kernel_id.h\""); /* Generate code for threads process */ ProcessImplementation pi = (ProcessImplementation) ps.getComponentImplementation(); cpu.addAllDataSubcomponent(pi.getOwnedDataSubcomponents()); buildDataAccessMapping(pi, dataAccessMapping); EList<ThreadSubcomponent> subcomponents = pi.getOwnedThreadSubcomponents(); _mainCCode.addOutputNewline("/*********** Tasks ***********/"); for (ThreadSubcomponent threadSubcomponent : subcomponents) { genTask(ps, threadSubcomponent, COUNTER_NAME); genCTask(ps, threadSubcomponent); } /* Generate code for OS */ /* * If one data contains Concurrency_Control_Protocol at * Priority_Ceiling STATUS => EXTENDED */ if (os.getStatus() == Status.STANDARD) { ProcessImplementation processImpl = (ProcessImplementation) ps.getComponentImplementation(); EList<Subcomponent> subcmpts = processImpl.getAllSubcomponents(); for (Subcomponent s : subcmpts) { if (s instanceof DataSubcomponent) { String value = PropertyUtils.getEnumValue(s, "Concurrency_Control_Protocol"); if (value != null) { if (value.equals("Priority_Ceiling")) { os.setStatus(Status.EXTENDED); break; } } else { String errMsg = "cannot fetch Concurrency_Control_Protocol for \'" + s.getName() + '\''; _LOGGER.error(errMsg); ServiceProvider.SYS_ERR_REP.error(errMsg, true); } } } } List<String> modeIdList = getProcessModesIdentifiers(ps); cpu.setAppmode(modeIdList); cpu.setName(ps.getName()); genOsConfig(ps); }