URL
https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk
Subversion Repositories openrisc_2011-10-31
[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [tools/] [src/] [libcdl/] [doc/] [concepts.sgml] - Rev 345
Go to most recent revision | Compare with Previous | Blame | View Log
<!-- {{{ Banner --><!-- =============================================================== --><!-- --><!-- concepts.sgml --><!-- --><!-- Introductory chapter. --><!-- --><!-- =============================================================== --><!-- ####COPYRIGHTBEGIN#### --><!-- --><!-- =============================================================== --><!-- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. --><!-- --><!-- This material may be distributed only subject to the terms --><!-- and conditions set forth in the Open Publication License, v1.0 --><!-- or later (the latest version is presently available at --><!-- http://www.opencontent.org/openpub/) --><!-- Distribution of the work or derivative of the work in any --><!-- standard (paper) book form is prohibited unless prior --><!-- permission obtained from the copyright holder --><!-- =============================================================== --><!-- --><!-- ####COPYRIGHTEND#### --><!-- =============================================================== --><!-- #####DESCRIPTIONBEGIN#### --><!-- --><!-- Author(s): bartv --><!-- Contact(s): bartv --><!-- Date: 2000/02/06 --><!-- Version: 0.01 --><!-- --><!-- ####DESCRIPTIONEND#### --><!-- =============================================================== --><!-- }}} --><chapter id="overview"><title>Overview</title><!-- {{{ Introit --><para>&eCos; was designed from the very beginning as a configurablecomponent architecture. The core &eCos; system consists of a number ofdifferent components such as the kernel, the C library, aninfrastructure package. Each of these provides a large number ofconfiguration options, allowing application developers to build asystem that matches the requirements of their particular application.To manage the potential complexity of multiple components and lots ofconfiguration options, &eCos; comes with a component framework: acollection of tools specifically designed to support configuringmultiple components. Furthermore this component framework isextensible, allowing additional components to be added to the systemat any time.</para><!-- }}} --><!-- {{{ Terminology --><sect1 id="overview.terminology"><title>Terminology</title><para>The &eCos; component architecture involves a number of key concepts.</para><!-- {{{ Component Framework --><sect2 id="concepts.terminology.framework"><title>Component Framework</title><para>The phrase <phrase>component framework</phrase> is used to describethe collection of tools that allow users to configure a system andadminister a component repository. This includes the <applicationclass="software">ecosconfig</application> command line tool, thegraphical configuration tool, and the package administration tool.Both the command line and graphical tools are based on a singleunderlying library, the &CDL; library.</para></sect2><!-- }}} --><!-- {{{ Option --><sect2 id="concepts.terminology.option"><title>Configuration Option</title><para>The option is the basic unit of configurability. Typically each optioncorresponds to a single choice that a user can make. For example thereis an option to control whether or not assertions are enabled, and thekernel provides an option corresponding to the number of schedulingpriority levels in the system. Options can control very small amountsof code such as whether or not the C library's<function>strtok</function> gets inlined. They can also control quitelarge amounts of code, for example whether or not the<function>printf</function> supports floating point conversions.</para><para>Many options are straightforward, and the user only gets to choosewhether the option is enabled or disabled. Some options are morecomplicated, for example the number of scheduling priority levels is anumber that should be within a certain range. Options should alwaysstart off with a sensible default setting, so that it is not necessaryfor users to make hundreds of decisions before any work can start ondeveloping the application. Once the application is running thevarious configuration options can be used to tune the system for thespecific needs of the application.</para><para>The component framework allows for options that are not directlyuser-modifiable. Consider the case of processor endianness: someprocessors are always big-endian or always little-endian, while withother processors there is a choice. Depending on the user's choice oftarget hardware, endianness may or may not be user-modifiable.</para></sect2><!-- }}} --><!-- {{{ Component --><sect2 id="concepts.terminology.component"><title>Component</title><para>A component is a unit of functionality such as a particular kernelscheduler or a device driver for a specific device. A component isalso a configuration option in that users may want to enableor disable all the functionality in a component. For example, if aparticular device on the target hardware is not going to be used bythe application, directly or indirectly, then there is no point inhaving a device driver for it. Furthermore disabling the device drivershould reduce the memory requirements for both code and data.</para><para>Components may contain further configuration options. In the case of adevice driver, there may be options to control the exact behavior ofthat driver. These will of course be irrelevant if the driver as awhole is disabled. More generally options and components live in ahierarchy, where any component can contain options specific to thatcomponent and further sub-components. It is possible to view theentire &eCos; kernel as one big component, containing sub-componentsfor scheduling, exception handling, synchronization primitives, and soon. The synchronization primitives component can contain furthersub-components for mutexes, semaphores, condition variables, eventflags, and so on. The mutex component can contain configurationoptions for issues like priority inversion support.</para></sect2><!-- }}} --><!-- {{{ Package --><sect2 id="concepts.terminology.package"><title>Package</title><para>A package is a special type of component. Specifically, a package isthe unit of distribution of components. It is possible to create adistribution file for a package containing all of the source code,header files, documentation, and other relevant files. Thisdistribution file can then be installed using the appropriate tool.Afterwards it is possible to uninstall that package, or to install alater version. The core &eCos; distribution comes with a number ofpackages such as the kernel and the infrastructure. Other packagessuch as network stacks can come from various different sources and canbe installed alongside the core distribution.</para><para>Packages can be enabled or disabled, but the user experience is alittle bit different. Generally it makes no sense for the tools toload the details of every single package that has been installed. Forexample, if the target hardware uses an ARM processor then there is nopoint in loading the HAL packages for other architectures anddisplaying choices to the user which are not relevant. Thereforeenabling a package means loading its configuration data into theappropriate tool, and disabling a package is an unload operation. Inaddition, packages are not just enabled or disabled: it is alsopossible to select the particular version of a package that should beused.</para></sect2><!-- }}} --><!-- {{{ Configuration --><sect2 id="concepts.terminology.configuration"><title>Configuration</title><para>A configuration is a collection of user choices. The varioustools that make up the component framework deal with entireconfigurations. Users can create a new configuration, output asavefile (by default <filename>ecos.ecc</filename>), manipulate aconfiguration, and use a configuration to generate a build tree priorto building &eCos; and any other packages that have been selected.A configuration includes details such as which packages have beenselected, in addition to finer-grained information such as whichoptions in those packages have been enabled or disabled by the user.</para></sect2><!-- }}} --><!-- {{{ Target --><sect2 id="concepts.terminology.target"><title>Target</title><para>The target is the specific piece of hardware on which the applicationis expected to run. This may be an off-the-shelf evaluation board, apiece of custom hardware intended for a specific application, or itcould be something like a simulator. One of the steps when creating anew configuration is need to specify the target. The componentframework will map this on to a set of packages that are used topopulate the configuration, typically HAL and device driver packages,and in addition it may cause certain options to be changed from theirdefault settings to something more appropriate for thespecified target.</para></sect2><!-- }}} --><!-- {{{ Template --><sect2 id="concepts.terminology.template"><title>Template</title><para>A template is a partial configuration, aimed at providing users withan appropriate starting point. &eCos; is shipped with a small numberof templates, which correspond closely to common ways of using thesystem. There is a minimal template which provides very littlefunctionality, just enough to bootstrap the hardware and then jumpdirectly to application code. The default template adds additionalfunctionality, for example it causes the kernel and C library packagesto be loaded as well. The uitron template adds further functionalityin the form of a &uITRON; compatibility layer. Creating a newconfiguration typically involves specifying a template as well as atarget, resulting in a configuration that can be built and linked withthe application code and that will run on the actual hardware. It isthen possible to fine-tune configuration options to produce somethingthat better matches the specific requirements of the application.</para></sect2><!-- }}} --><!-- {{{ Properties --><sect2 id="concepts.terminology.properties"><title>Properties</title><para>The component framework needs a certain amount of information abouteach option. For example it needs to know what the legal values are,what the default should be, where to find the on-line documentation ifthe user needs to consult that in order to make a decision, and so on.These are all properties of the option. Every option (includingcomponents and packages) consists of a name and a set of properties.</para></sect2><!-- }}} --><!-- {{{ Consequences --><sect2 id="concepts.terminology.consequences"><title>Consequences</title><para>Choices must have consequences. For an &eCos; configuration the mainend product is a library that can be linked with application code, sothe consequences of a user choice must affect the build process. Thishappens in two main ways. First, options can affect which files getbuilt and end up in the library. Second, details of the current optionsettings get written into various configuration header files using Cpreprocessor <literal>#define</literal> directives, and package sourcecode can <literal>#include</literal> these configuration headers andadapt accordingly. This allows options to affect a package at a veryfine grain, at the level of individual lines in a source file ifdesired. There may be other consequences as well, for example thereare options to control the compiler flags that get used during thebuild process.</para></sect2><!-- }}} --><!-- {{{ Constraints --><sect2 id="concepts.terminology.constraints"><title>Constraints</title><para>Configuration choices are not independent. The C library can providethread-safe implementations of functions like<function>rand</function>, but only if the kernel provides support forper-thread data. This is a constraint: the C library option has arequirement on the kernel. A typical configuration involves aconsiderable number of constraints, of varying complexity: manyconstraints are straightforward, option <literal>A</literal> requiresoption <literal>B</literal>, or option <literal>C</literal> precludesoption <literal>D</literal>. Other constraints can be morecomplicated, for example option <literal>E</literal> may require thepresence of a kernel scheduler but does not care whether it is thebitmap scheduler, the mlqueue scheduler, or something else.</para><para>Another type of constraint involves the values that can be used forcertain options. For example there is a kernel option related to thenumber of scheduling levels, and there is a legal values constraint onthis option: specifying zero or a negative number for the number ofscheduling levels makes no sense.</para></sect2><!-- }}} --><!-- {{{ Conflicts --><sect2 id="concepts.terminology.conflicts"><title>Conflicts</title><para>As the user manipulates options it is possible to end up with aninvalid configuration, where one or more constraints are notsatisfied. For example if kernel per-thread data is disabled but the Clibrary's thread-safety options are left enabled then there areunsatisfied constraints, also known as conflicts. Such conflicts willbe reported by the configuration tools. The presence of conflicts doesnot prevent users from attempting to build &eCos;, but theconsequences are undefined: there may be compile-time failures, theremay be link-time failures, the application may completely fail to run,or the application may run most of the time but once in a while therewill be a strange failure… Typically users will want to resolveall conflicts before continuing.</para><para>To make things easier for the user, the configuration tools contain aninference engine. This can examine a conflict in a particularconfiguration and try to figure out some way of resolving theconflict. Depending on the particular tool being used, the inferenceengine may get invoked automatically at certain times or the user mayneed to invoke it explicitly. Also depending on the tool, theinference engine may apply any solutions it finds automatically or itmay request user confirmation.</para></sect2><!-- }}} --><!-- {{{ CDL --><sect2 id="concepts.terminology.cdl"><title>CDL</title><para>The configuration tools require information about the various optionsprovided by each package, their consequences and constraints, andother properties such as the location of on-line documentation. Thisinformation has to be provided in the form of &CDL; scripts. CDLis short for Component Definition Language, and is specificallydesigned as a way of describing configuration options.</para><para>A typical package contains the following:</para><orderedlist><listitem><para>Some number of source files which will end up in a library. Theapplication code will be linked with this library to produce anexecutable. Some source files may serve other purposes, for example toprovide a linker script.</para></listitem><listitem><para>Exported header files which define the interface provided by thepackage.</para></listitem><listitem><para>On-line documentation, for example reference pages for each exportedfunction.</para></listitem><listitem><para>Some number of test cases, shipped in source format, allowing users tocheck that the package is working as expected on their particularhardware and in their specific configuration.</para></listitem><listitem><para>One or more &CDL; scripts describing the package to the configurationsystem.</para></listitem></orderedlist><para>Not all packages need to contain all of these. For example somepackages such as device drivers may not provide a new interface,instead they just provide another implementation of an existinginterface. However all packages must contain a &CDL; script thatdescribes the package to the configuration tools.</para></sect2><!-- }}} --><!-- {{{ Component Repository --><sect2 id="concepts.terminology.repo"><title>Component Repository</title><para>All &eCos; installations include a component repository. This is adirectory structure where all the packages get installed. Thecomponent framework comes with an administration tool that allows newpackages or new versions of a package to be installed, old packages tobe removed, and so on. The component repository includes a simpledatabase, maintained by the administration tool, which containsdetails of the various packages.</para><para>Generally application developers do not need to modify anything insidethe component repository, except by means of the administration tool.Instead their work involves separate build and install trees. Thisallows the component repository to be treated as a read-only resourcethat can be shared by multiple projects and multiple users. Componentwriters modifying one of the packages do need to manipulate files inthe component repository.</para></sect2><!-- }}} --></sect1><!-- }}} --><!-- {{{ Why configurability ? --><sect1 id="overview.configurability"><title>Why Configurability?</title><para>The &eCos; component framework places a great deal of emphasis onconfigurability. The fundamental goal is to allow large parts ofembedded applications to be constructed from re-usable softwarecomponents, which does not a priori require that those components behighly configurable. However embedded application development ofteninvolves some serious constraints.</para><para>Many embedded applications have to work with very little memory, tokeep down manufacturing costs. The final application image that willget blown into EPROM's or used to manufacture ROMs should contain onlythe code that is absolutely necessary for the application to work, andnothing else. If a few tens of kilobytes are added unnecessarily to atypical desktop application then this is regrettable, but is quitelikely to go unnoticed. If an embedded application does not fit on thetarget hardware then the problem is much more serious. The componentframework must allow users to configure the components so that anyunnecessary functionality gets removed.</para><para>Many embedded applications need deterministic behavior so that theycan meet real-time requirements. Such deterministic behavior canoften be provided, but at a cost in terms of code size, sloweralgorithms, and so on. Other applications have no such real-timerequirements, or only for a small part of the overall system, and thebulk of the system should not suffer any penalties. Again thecomponent framework must allow the users control over the timingbehavior of components.</para><para>Embedded systems tend to be difficult to debug. Even when it ispossible to get information out of the target hardware by means otherthan flashing an LED, the more interesting debugging problems arelikely to be timing-related and hence very hard to reproduce and trackdown. The re-usable components can provide debugging assistance invarious ways. They can provide functionality that can be exploited bysource level debuggers such as gdb, for example per-thread debugginginformation. They can also contain various assertions so that problemscan be detected early on, tracing mechanisms to figure out whathappened before the assertion failure, and so on. Of course all ofthese involve overheads, especially code size, and affect the timing.Allowing users to control which debugging features are enabled for anygiven application build is very desirable.</para><para>However, although it is desirable for re-usable components to provideappropriate configuration options this is not required. It is possibleto produce a package which does not provide a single configurationoption — although the user still gets to choosewhether or not to use the package. In such cases it is still necessaryto provide a minimal CDL script, but its main purpose would be tointegrate the package with the component framework's build system.</para></sect1><!-- }}} --><!-- {{{ Approaches --><sect1 id="overview.approaches"><title>Approaches to Configurability</title><para>The purpose of configurability is to control the behavior ofcomponents. A scheduler component may or may not support time slicing;it may or may not support multiple priorities; it may or may notperform error checking on arguments passed to the scheduler routines.In the context of a desktop application a button widget may containsome text or it may contain a picture; the text may be displayed in avariety of fonts; the foreground and background color may vary. Whenan application uses a component there must be some way of specifyingthe desired behavior. The component writer has no way of knowing inadvance exactly how a particular component will end up being used.</para><para>One way to control the behavior is at run time. The applicationcreates an instance of a button object, and then instructs this objectto display either text or a picture. No special effort by theapplication developer is required, since a button can always supportall desired behavior. There is of course a major disadvantage interms of the size of the final application image: the code that getslinked with the application has to provide support for all possiblebehavior, even if the application does not require it.</para><para>Another approach is to control the behavior at link-time, typicallyby using inheritance in an object-oriented language. The buttonlibrary provides an abstract base class <classname>Button</classname>and derived classes <classname>TextButton</classname> and<classname>PictureButton</classname>. If an application only uses textbuttons then it will only create objects of type<classname>TextButton</classname>, and the code for the<classname>PictureButton</classname> class does not get used. Inmany cases this approach works rather well and reduces the final imagesize, but there are limitations. The main one is that you can onlyhave so many derived classes before the system gets unmanageable: aderived class<classname>TextButtonUsingABorderWidthOfOnePlusAWhiteBackgroundAndBlackForegroundAndATwelvePointTimesFontAndNoErrorCheckingOrAssertions</classname>is not particularly sensible as far as most application developers areconcerned.</para><para>The &eCos; component framework allows the behavior of components tobe controlled at an even earlier time: when the component source codegets compiled and turned into a library. The button component couldprovide options, for example an option that only text buttons need tobe supported. The component gets built and becomes part of a libraryintended specifically for the application, and the library willcontain only the code that is required by this application and nothingelse. A different application with different requirements would needits own version of the library, configured separately.</para><para>In theory compile-time configurability should give the best possibleresults in terms of code size, because it allows code to be controlledat the individual statement level rather than at the function orobject level. Consider an example more closely related to embeddedsystems, a package to support multi-threading. A standard routinewithin such a package allows applications to kill threadsasynchronously: the POSIX routine for this is<function>pthread_cancel</function>; the equivalent routine in &uITRON;is <function>ter_tsk</function>. These routines themselves tend toinvolve a significant amount of code, but that is not the realproblem: other parts of the system require extra code and data for thekill routine to be able to function correctly. For example if a threadis blocked while waiting on a mutex and is killed off by anotherthread then the kill operation may have to do two things: remove thethread from the mutex's queue of waiting threads; and undo theeffects, if any, of priority inheritance. The implementation requiresextra fields in the thread data structure so that the kill routineknows about the thread's current state, and extra code in the mutexroutines to fill in and clear these extra fields correctly.</para><para>Most embedded applications do not require the ability to kill off athread asynchronously, and hence the kill routine will not get linkedinto the final application image. Without compile-time configurabilitythis would still mean that the mutex code and similar parts of thesystem contain code and data that serve no useful purpose in thisapplication. The &eCos; approach allows the user to select that thethread kill functionality is not required, and all the components canadapt to this at compile-time. For example the code in the mutex lockroutine contains statements to support the killing of threads, butthese statements will only get compiled in if that functionality isrequired. The overall result is that the final application imagecontains only the code and data that is really needed for theapplication to work, and nothing else.</para><para>Of course there are complications. To return to the button example,the application code might only use text buttons directly, but itmight also use some higher-level widget such as a file selector andthis file selector might require buttons with pictures. Therefore thebutton code must still be compiled to support pictures as well astext. The configuration tools must be aware of the dependenciesbetween components and ensure that the internal constraints are met,as well as the external requirements of the application code. An areaof particular concern is conflicting requirements: a button componentmight be written in such a way that it can only support either textbuttons or picture buttons, but not both in one application; thiswould represent a weakness in the component itself rather than in thecomponent framework as a whole.</para><para>Compile-time configurability is not intended to replace the otherapproaches but rather to complement them. There will be times whenrun-time selection of behavior is desirable: for example anapplication may need to be able to change the baud rate of a serialline, and the system must then provide a way of doing this atrun-time. There will also be times when link-time selection isdesirable: for example a C library might provide two different randomnumber routines <function>rand</function> and<function>lrand48</function>; these do not affect other code so thereis no good reason for the C library component not to provide both ofthese, and allow the application code to use none, one, or both ofthem as appropriate; any unused functions will just get eliminated atlink-time. Compile-time selection of behavior is another option, andit can be the most powerful one of the three and the best suited toembedded systems development.</para></sect1><!-- }}} --><!-- {{{ Degrees --><sect1 id="overview.degress"><title>Degrees of Configurability</title><para>Components can support configurability in varying degrees. It is notnecessary to have any configuration options at all, and the only userchoice is whether or not to load a particular package. Alternativelyit is possible to implement highly-configurable code. As an exampleconsider a typical facility that is provided by many real-timekernels, mutex locks. The possible configuration options include:</para><orderedlist><listitem><para>If no part of the application and no other component requires mutexesthen there is no point in having the mutex code compiled into alibrary at all. This saves having to compile the code. In additionthere will never be any need for the user to configure the detailedbehavior of mutexes. Therefore the presence of mutexes is aconfiguration option in itself.</para></listitem><listitem><para>Even if the application does make use of mutexes directly orindirectly, this does not mean that all mutex functions have to beincluded. The minimum functionality consists of lock and unlockfunctions. However there are variants of the locking primitive such astry-lock and try-with-timeout which may or may not be needed.</para><para>Generally it will be harmless to compile the try-lock function even ifit is not actually required, because the function will get eliminatedat link-time. Some users might take the view that the try-lockfunction should never get compiled in unless it is actually needed, toreduce compile-time and disk usage. Other users might argue that thereare very few valid uses for a try-lock function and it should not becompiled by default to discourage incorrect uses. The presence of atry-lock function is a possible configuration option, although it maybe sensible to default it to true.</para><para>The try-with-timeout variant is more complicated because it adds adependency: the mutex code will now rely on some other component toprovide a timer facility. To make things worse the presence of thistimer might impact other components, for example it may now benecessary to guard against timer interrupts, and thus have aninsidious effect on code size. The presence of a lock-with-timeoutfunction is clearly a sensible configuration option, but the defaultvalue is less obvious. If the option is enabled by default then thefinal application image may end up with code that is not actuallyessential. If the option is disabled by default then users will haveto enable the option somehow in order to use the function, implyingmore effort on the part of the user. One possible approach is tocalculate the default value based on whether or not a timer componentis present anyway.</para></listitem><listitem><para>The application may or may not require the ability to create anddestroy mutexes dynamically. For most embedded systems it is both lesserror-prone and more efficient to create objects like mutexesstatically. Dynamic creation of mutexes can be implemented using apre-allocated pool of mutex objects, involving some extra code tomanipulate the pool and an additional configuration option to definethe size of the pool. Alternatively it can be implemented using ageneral-purpose memory allocator, involving quite a lot of extra codeand configuration options. However this general-purpose memoryallocator may be present anyway to support the application itself orsome other component. The ability to create and destroy mutexesdynamically is a configuration option, and there may not be a sensibledefault that is appropriate for all applications.</para></listitem><listitem><para>An important issue for mutex locks is the handling of priorityinversion, where a high priority thread is prevented from runningbecause it needs a lock owned by a lower priority thread. This is onlyan issue if there is a scheduler with multiple priorities: somesystems may need multi-threading and hence synchronization primitives,but a single priority level may suffice. If priority inversion is atheoretical possibility then the application developer may still wantto ignore it because the application has been designed such that theproblem cannot arise in practice. Alternatively the developer may wantsome sort of exception raised if priority inversion does occur,because it should not happen but there may still be bugs in the code.If priority inversion can occur legally then there are three main waysof handling it: priority ceilings, priority inheritance, and ignoringthe problem. Priority ceilings require little code but extra effort onthe part of the application developer. Priority inheritance requiresmore code but is automatic. Ignoring priority inversion may or may notbe acceptable, depending on the application and exactly when priorityinversion can occur. Some of these choices involve additionalconfiguration options, for example there are different ways of raisingan exception, and priority inheritance may or may not be appliedrecursively.</para></listitem><listitem><para>As a further complication some mutexes may be hidden inside acomponent rather than being an explicit part of the application. Forexample, if the C library is configured to provide a<function>malloc</function> call then there may be an associated mutexto make the function automatically thread-safe, with no need forexternal locking. In such cases the memory allocation component of theC library can impose a constraint on the kernel, requiring thatmutexes be provided. If the user attempts to disable mutexes anywaythen the configuration tools will report a conflict.</para></listitem><listitem><para>The mutex code should contain some general debugging code such asassertions and tracing. Usually such debug support will be enabled ordisabled at a coarse level such as the entire system or everythinginside the kernel, but sometimes it will be desirable to enable thesupport more selectively. One reason would be memory requirements: thetarget may not have enough memory to hold the system if all debuggingis enabled. Another reason is if most of the system is working butthere are a few problems still to resolved; enabling debugging in theentire system might change the system's timing behavior too much, butenabling some debug options selectively can still be useful. Thereshould be configuration options to allow specific types of debuggingto be enabled at a fine-grain, but with default settings inheritedfrom an enclosing component or from global settings.</para></listitem><listitem><para>The mutex code may contain specialized code to interactwith a debugging tool running on the host. It should bepossible to enable or disable this debugging code, and there maybe additional configuration options controlling the detailedbehavior.</para></listitem></orderedlist><para>Altogether there may be something like ten to twenty configurationoptions that are specific to the mutex code. There may be a similarnumber of additional options related to assertions and other debugfacilities. All of the options should have sensible default values,possibly fixed, possibly calculated depending on what is happeningelsewhere in the configuration. For example the default setting foran assertion option should generally inherit from a kernel-wideassertion control option, which in turn inherits from a global option.This allows users to enable or disable assertions globally or ata more fine-grained level, as desired.</para><para>Different components may be configurable to different degrees, rangingfrom no options at all to the fine-grained configurability of theabove mutex example (or possibly even further). It is up to componentwriters to decide what options should be provided and how best toserve the needs of application developers who want to use thatcomponent.</para></sect1><!-- }}} --><!-- {{{ Warning --><sect1 id="overview.warning"><title>Warnings</title><para>Large parts of &eCos; were developed concurrently with the developmentof the configuration technology, or in some cases before design workon that technology was complete. As a consequence the various &eCos;packages often make only limited use of the available functionality.This situation is expected to change over time. It does mean that manyof the descriptions in this guide will not correspond exactly to howthe &eCos; packages work right now, but rather to how they could work.Some of the more extreme discrepancies such as the location of on-linedocumentation in the component repository will be mentioned in theappropriate places in the guide.</para><para>A consequence of this is that developers of new components can look atexisting &CDL; scripts for examples, and discover discrepanciesbetween what is recommended in this guide and what actually happens atpresent. In such cases this guide should be treated as authoritative.</para><para>It is also worth noting that the current component framework is notfinished. Various parts of this guide will refer to possible changesand enhancements in future versions. Examining the source code of theconfiguration tools may reveal hints about other likely developments,and there are many more possible enhancements which only exist at aconceptual level right now.</para></sect1><!-- }}} --></chapter>
Go to most recent revision | Compare with Previous | Blame | View Log
