/** * check the load from components bound to the given memory The components can be threads or * higher level components. * * @param curMemory Component Instance of memory */ protected void checkMemoryLoad(ComponentInstance curMemory, final SystemOperationMode som) { SystemInstance root = curMemory.getSystemInstance(); final ComponentInstance currentMemory = curMemory; final String somName = som.getName(); long timeBefore = System.currentTimeMillis(); OsateDebug.osateDebug("[Memory] before get sw comps (memory=" + curMemory.getName() + ")"); EList<ComponentInstance> boundComponents = InstanceModelUtil.getBoundSWComponents(curMemory); long timeAfter = System.currentTimeMillis(); long period = timeAfter - timeBefore; OsateDebug.osateDebug("[CPU] after get sw comps, time taken=" + period + "ms"); if (GetProperties.getROMCapacityInKB(curMemory, 0.0) > 0.0) { doMemoryLoad(curMemory, somName, boundComponents, true); // ROM } if (GetProperties.getRAMCapacityInKB(curMemory, 0.0) > 0.0) { doMemoryLoad(curMemory, somName, boundComponents, false); // RAM } }
/** * check the load from components bound to the given memory The components can be threads or * higher level components. * * @param curMemory Component Instance of memory */ protected void doMemoryLoad( ComponentInstance curMemory, String somName, EList boundComponents, boolean isROM) { double totalMemory = 0.0; UnitLiteral kbliteral = GetProperties.getKBUnitLiteral(curMemory); String resourceName = isROM ? "ROM" : "RAM"; double Memorycapacity = isROM ? GetProperties.getROMCapacityInKB(curMemory, 0.0) : GetProperties.getRAMCapacityInKB(curMemory, 0.0); if (boundComponents.size() == 0 && Memorycapacity > 0) { errManager.infoSummary( curMemory, somName, "No application components bound to " + curMemory.getComponentInstancePath() + " with " + resourceName + " capacity " + GetProperties.toStringScaled(Memorycapacity, kbliteral)); return; } if (Memorycapacity == 0) { errManager.errorSummary( curMemory, somName, "Memory " + curMemory.getComponentInstancePath() + " has no " + resourceName + " capacity but has bound components."); } logHeader( "\n\nDetailed Workload Report for memory " + curMemory.getComponentInstancePath() + " with Capacity " + GetProperties.toStringScaled(Memorycapacity, kbliteral) + "\n\nComponent,Budget,Actual"); Set budgeted = new HashSet(); for (Iterator it = boundComponents.iterator(); it.hasNext(); ) { String notes = ""; ComponentInstance bci = (ComponentInstance) it.next(); double totalactual = sumMemoryActuals(bci, isROM); double budget = isROM ? GetProperties.getROMBudgetInKB(bci, 0.0) : GetProperties.getRAMBudgetInKB(bci, 0.0); if (totalactual > 0) { // only compare if there were actuals if (totalactual > budget) { notes = notes + ",Error: " + resourceName + " subtotal exceeds budget by " + (totalactual - budget) + " KB"; } else if (totalactual < budget) { notes = notes + ",Warning: " + resourceName + " Subtotal under budget by " + (budget - totalactual) + " KB"; } } if (totalactual == 0.0) { // we use a budget number as there are no actuals if (budget > 0 && !budgeted.contains(bci)) { // only add it if no children budget numbers have been added totalMemory += budget; detailedLog(bci, budget, kbliteral); // add ancestors to budgeted list so their budget does not get added later while ((bci = bci.getContainingComponentInstance()) != null) { budgeted.add(bci); } } } else { // add only the current actual; the children actual have been added before double currentActual = isROM ? GetProperties.getROMActualInKB(bci, 0.0) : GetProperties.getRAMActualInKB(bci, 0.0); detailedLog(bci, budget, kbliteral); totalMemory += currentActual; } } if (Memorycapacity == 0) errManager.errorSummary( curMemory, somName, "" + (isROM ? "ROM" : "RAM") + " memory " + curMemory.getComponentInstancePath() + " has no memory capacity specified"); if (totalMemory > Memorycapacity) { errManager.errorSummary( curMemory, somName, "Total Memory " + totalMemory + " KB of bounds tasks exceeds Memory capacity " + Memorycapacity + " KB of " + curMemory.getComponentInstancePath()); } else if (totalMemory == 0.0 && Memorycapacity == 0.0) { errManager.warningSummary( curMemory, somName, "" + (isROM ? "ROM" : "RAM") + " memory " + curMemory.getComponentInstancePath() + " has no capacity. Bound app's have no memory budget."); } else { errManager.infoSummary( curMemory, somName, "Total " + (isROM ? "ROM" : "RAM") + " memory " + totalMemory + " KB of bound tasks within Memory capacity " + Memorycapacity + " KB of " + curMemory.getComponentInstancePath()); } }