<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>State Space &#187; Uncategorized</title>
	<atom:link href="http://embeddedgurus.com/state-space/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://embeddedgurus.com/state-space</link>
	<description>A Blog by Miro Samek</description>
	<lastBuildDate>Mon, 26 Sep 2011 20:24:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>On the Origin of Software by Means of Artificial Selection</title>
		<link>http://embeddedgurus.com/state-space/2011/08/on-the-origin-of-software-by-means-of-artificial-selection/</link>
		<comments>http://embeddedgurus.com/state-space/2011/08/on-the-origin-of-software-by-means-of-artificial-selection/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 21:32:44 +0000</pubDate>
		<dc:creator>Miro Samek</dc:creator>
				<category><![CDATA[TDD]]></category>
		<category><![CDATA[embedded books]]></category>
		<category><![CDATA[embedded software development]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/?p=102</guid>
		<description><![CDATA[If you haven&#8217;t put your hands on the recent James Grenning&#8217;s book &#8220;Test-Driven Development for Embedded C&#8221; yet, I highly recommend you do. Here is why. First, you need to realize that this book is not really about testing&#8211;it is about software development. The central idea behind TDD (Test-Driven Development) is that software, as any complex [...]]]></description>
			<content:encoded><![CDATA[<p>If you haven&#8217;t put your hands on the recent James Grenning&#8217;s book<em> &#8220;Test-Driven Development for Embedded C&#8221;</em> yet, I highly recommend you do. Here is why.</p>
<p>First, you need to realize that this book is <strong>not</strong> really about testing&#8211;it is about software <strong>development</strong>. The central idea behind TDD (Test-Driven Development) is that software, as any complex system in nature, has to evolve gradually and has to keep <strong>working</strong> throughout all the development stages. This idea is of course not new and goes back all the way to the Darwin&#8217;s &#8220;<em>On the Origin of Species&#8221;</em>. More recently, in his 1977 book &#8220;<em>Systemantics: How Systems Work and Especially How They Fail</em>&#8221; John Gall wrote:</p>
<blockquote><p><em>&#8220;A complex system that works is invariably found to have evolved from a simple system that worked&#8230;. A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over, beginning with a working simple system&#8221;. </em></p></blockquote>
<p>The key point of TDD is to subject the software to constant &#8220;struggle for existence&#8221; to actually see if it indeed <strong>is</strong> still working and in the process weed out any undesired mutations.</p>
<p>Of course, in developing software we don&#8217;t have the deep evolutionary time, so we need to accelerate the pace of software evolution. We do this by <strong>automating</strong> the testing.</p>
<p>For embedded development this means avoiding the target system bottleneck (James calls it DOH-Development On Hardware). The embedded TDD strategy is to develop embedded software on the <strong>desktop</strong> and only occasionally check it on the real embedded hardware. This means that the C/C++ compilers and tools for the desktop (such as Visual C++, MinGW, or Cygwin for Windows and GCC for Linux and Mac OS X) are important for us.</p>
<p>The book comes with testing frameworks (Unity and CppUTest) and plenty of example code. The code works right of the box on Linux, but I had some issues running it on Windows. In the process of learning the tools, I&#8217;ve prepared a small template for Visual C++ 2008, which is available for download from:</p>
<p><a title="tdd_blinky.zip" href="http://www.state-machine.com/attachments/tdd_blinky.zip">http://www.state-machine.com/attachments/blinky_tdd.zip</a></p>
<p>This demo assumes that you download and install the CppUTest framework (<a href="http://sourceforge.net/projects/cpputest/">http://sourceforge.net/projects/cpputest/</a>) and that you define the environment variable CPP_U_TEST to point to the directory where you installed CppUTest. The Visual Studio solution AllTest.sln is located in the blinky\tests directory.</p>
<p>I&#8217;d love to hear about your experiences with TDD in embedded programming. I&#8217;m sure I will blog more about it in the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2011/08/on-the-origin-of-software-by-means-of-artificial-selection/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Rapid Prototyping with QP and Arduino</title>
		<link>http://embeddedgurus.com/state-space/2011/02/rapid-prototyping-with-qp-and-arduino/</link>
		<comments>http://embeddedgurus.com/state-space/2011/02/rapid-prototyping-with-qp-and-arduino/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 16:54:50 +0000</pubDate>
		<dc:creator>Miro Samek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/?p=62</guid>
		<description><![CDATA[Arduino (see arduino.cc) is an open-source electronics prototyping platform, designed to make digital electronics more accessible to non-specialists in multidisciplinary projects. Arduino has gained popularity, because it provides both hardware and compatible software focused on developing working prototypes. By making it easier to build the first prototype, Arduino lowers the barrier of entry to the [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float: right;margin-left: 5px" src="http://www.state-machine.com/news/logo_arduino.png" alt="" /></p>
<p>Arduino (see <a href="http://arduino.cc">arduino.cc</a>) is an open-source electronics prototyping platform, designed to make digital electronics more accessible to <strong>non-specialists</strong> in multidisciplinary projects. Arduino has gained popularity, because it provides both hardware and compatible software focused on developing working prototypes. By making it easier to build the first prototype, Arduino lowers the barrier of entry to the field of modern microelectronics and enables a host of new applications.</p>
<p>However, programming the Arduino microcontroller (Atmel AVRmega) remains a challenge. Traditionally, Arduino programs are written in a sequential manner, which means that whenever an Arduino program needs to synchronize with some external event, such as a button press, arrival of a character through the serial port, or a time delay, it explicitly waits in-line for the occurrence of the event. Waiting &#8220;in-line&#8221; means that the Arduino processor spends all of its cycles constantly checking for some condition in a tight loop (called the polling loop).</p>
<p>Although this approach is functional in many situations, it doesn&#8217;t work very well when there are multiple possible sources of events whose arrival times and order you cannot predict and where it is important to handle the events in a timely manner. The fundamental problem is that while a sequential program is waiting for one kind of event (e.g., a button press), it is not doing any other work and is not responsive to other events (e.g., characters from the serial port).</p>
<p>Another big problem with the sequential program structure is wastefulness in terms of power dissipation. Regardless of how much or how little actual work is being done, the Arduino processor is always running at top speed, which drains the battery quickly and prevents you from making truly long-lasting battery-powered devices.</p>
<h3>Event-Driven Programming for Arduino</h3>
<p>For these and other reasons experienced programmers turn to the long-know design strategy called <em>event-driven programming</em>, which requires a distinctly different way of thinking than conventional sequential programs. All event-driven programs are naturally divided into the application, which actually handles the events, and the supervisory event-driven infrastructure (framework), which waits for events and dispatches them to the application. The control resides in the event-driven framework, so from the application standpoint, the control is inverted compared to a traditional sequential program.</p>
<p>It turns out that the <strong>QP/C++</strong> state machine framework beautifully complements the Arduino platform and provides everything you need to build responsive, robust, and power-efficient Arduino programs based on modern hierarchical state machines. In many ways the open source QP/C++ state machine framework is like a modern real-time operating system (RTOS) specifically designed for executing event-driven state machines. The free QM™ graphical modeling tool takes Arduino programming to the next level, by enabling automatic code generation of complete Arduino sketches.</p>
<p>The QP Development Kit (QDK) for Arduino is different from most other QDKs available from <a href="http://www.state-machine.com">state-machine.com</a> in that it is self-contained and includes the simplified and compacted source-code version of the QP/C++ framework. The QDK-Arduino is designed to plug directly into the Arduino IDE to become immediately useful without building a binary library. The extensive Application Note <a href="http://www.state-machine.com/arduino/AN_Event-Driven_Arduino.pdf">&#8220;Event Driven Arduino Programming with QP&#8221;</a> describes the main concepts and how to get started.</p>
<div><a href="http://www.state-machine.com/arduino" target="_blank">QDK-Arduino on state-machine.com<strong>»</strong></a><br />
<a href="http://arduino.cc/playground/Code/QP" target="_blank">QP on Arduino Playground<strong>»</strong></a></div>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2011/02/rapid-prototyping-with-qp-and-arduino/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>A Heap of Problems</title>
		<link>http://embeddedgurus.com/state-space/2010/01/heap-of-problems/</link>
		<comments>http://embeddedgurus.com/state-space/2010/01/heap-of-problems/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 22:24:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/2010/01/24/a-heap-of-problems/</guid>
		<description><![CDATA[Some design problems never seem to go away. You think that anybody who has been in the embedded software development business for a while must have learned to be wary of malloc() and free() (or their C++ counterparts new and delete). Then you find that many developers actually don&#8217;t know why embedded real-time systems are [...]]]></description>
			<content:encoded><![CDATA[<p>Some design problems never seem to go away. You think that anybody who has been in the embedded software development business for a while must have learned to be wary of malloc() and free() (or their C++ counterparts new and delete). Then you find that many developers actually don&#8217;t know why embedded real-time systems are so particularly intolerant of heap problems.</p>
<p>For example, recently an Embedded.com reader attacked my comment to the article &#8220;<a href="http://www.embedded.com/design/opensource/216800007">Back to the Basics &#8211; Practical Embedded Coding Tips: Part 1 Reentrancy, atomic variables and recursion</a>&#8220;, in which I advised against using the heap. Here is this reader&#8217;s argumentation:</p>
<blockquote><p>I have no idea why did you bring up the pledge not to use the heap, on modern 32-bit MCUs (ARMs etc) there is no reason &#8211; and no justification &#8211; to avoid using the heap. The only reason not to use the heap is to avoid memory fragmentation, but good heap implementation and careful memory allocation planning will overcome that.</p></blockquote>
<p>As I cannot disagree more with the statements above, I decided that it&#8217;s perhaps the time to re-post my &#8220;heap of problems&#8221; list, which goes as follows:</p>
<ul>
<li>Dynamically allocating and freeing memory can fragment the heap over time to the point that the program crashes because of an inability to allocate more RAM. The total remaining heap storage might be more than adequate, but no single piece satisfies a specific malloc() request.</li>
<li>Heap-based memory management is wasteful. All heap management algorithms must maintain some form of header information for each block allocated. At the very least, this information includes the size of the block. For example, if the header causes a four-byte overhead, then a four-byte allocation requires at least eight bytes, so only 50 percent of the allocated memory is usable to the application. Because of these overheads and the aforementioned fragmentation, determining the minimum size of the heap is difficult. Even if you were to know the worst-case mix of objects simultaneously allocated on the heap (which you typically don&#8217;t), the required heap storage is much more than a simple sum of the object sizes. As a result, the only practical way to make the heap more reliable is to massively oversize it.</li>
<li>Both malloc() and free() can be (and often are) nondeterministic, meaning that they potentially can take a long (hard to quantify) time to execute, which conflicts squarely with real-time constraints. Although many RTOSs have heap management algorithms with bounded, or even deterministic performance, they don&#8217;t necessarily handle multiple small allocations efficiently.</li>
</ul>
<p>Unfortunately, the list of heap problems doesn&#8217;t stop there. A new class of problems appears when you use heap in a multithreaded environment. The heap becomes a shared resource and consequently causes all the headaches associated with resource sharing, so the list goes on:</p>
<ul>
<li>Both malloc() and free() can be (and often are) non-reentrant; that is, they cannot be safely called simultaneously from multiple threads of execution.</li>
<li>The reentrancy problem can be remedied by protecting malloc(), free(), realloc(), and so on internally with a mutex, which lets only one thread at a time access the shared heap. However, this scheme could cause excessive blocking of threads (especially if memory management is nondeterministic) and can significantly reduce parallelism. Mutexes can also be subject to priority inversion. Naturally, the heap management functions protected by a mutex are not available to interrupt service routines (ISRs) because ISRs cannot block.</li>
</ul>
<p>Finally, all the problems listed previously come on top of the usual pitfalls associated with dynamic memory allocation. For completeness, I&#8217;ll mention them here as well.</p>
<ul>
<li>If you destroy all pointers to an object and fail to free it or you simply leave objects lying about well past their useful lifetimes, you create a memory leak. If you leak enough memory, your storage allocation eventually fails.</li>
<li>Conversely, if you free a heap object but the rest of the program still believes that pointers to the object remain valid, you have created dangling pointers. If you dereference such a dangling pointer to access the recycled object (which by that time might be already allocated to somebody else), your application can crash.</li>
<li>Most of the heap-related problems are notoriously difficult to test. For example, a brief bout of testing often fails to uncover a storage leak that kills a program after a few hours, or weeks, of operation. Similarly, exceeding a real-time deadline because of nondeterminism can show up only when the heap reaches a certain fragmentation pattern. These types of problems are extremely difficult to reproduce.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2010/01/heap-of-problems/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A nail for a fuse</title>
		<link>http://embeddedgurus.com/state-space/2009/11/a-nail-for-a-fuse/</link>
		<comments>http://embeddedgurus.com/state-space/2009/11/a-nail-for-a-fuse/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 17:13:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/2009/11/27/a-nail-for-a-fuse/</guid>
		<description><![CDATA[If I were to search my soul, I&#8217;d have to admit that the use of assertions has helped me more than any other single technique, even more than my favorite state machines. But, the use of assertions, simple as they are, is surrounded by so many misconceptions and misunderstandings that it&#8217;s difficult to know where [...]]]></description>
			<content:encoded><![CDATA[<p>If I were to search my soul, I&#8217;d have to admit that the use of assertions has helped me more than any other single technique, even more than my favorite state machines. But, the use of assertions, simple as they are, is surrounded by so many misconceptions and misunderstandings that it&#8217;s difficult to know where to start. The discussion around the recent Jack Genssle&#8217;s article &#8220;<a href="http://www.embedded.com/columns/breakpoint/221800158">The Use of Assertions</a>&#8221; shows many of the misunderstandings.</p>
<p>I suppose that the main difficulties in understanding assertions lay in the fact that while the implementation of assertions is trivial, the effective use of assertions requires a paradigm shift in the view of software construction and the nature of software errors in particular.</p>
<p>Perhaps the most important point to understand about assertions is that they neither handle nor prevent errors, in the same way as fuses in electrical circuits don&#8217;t prevent accidents or abuse. In fact, a fuse is an intentionally introduced <span style="font-weight:bold">weak</span> spot in the circuit that is designed to fail sooner than anything else, so actually the whole circuit with a fuse is less robust than without it.</p>
<p>I believe that the analogy between assertions and fuses (which, by the way has been originally proposed by Niall Murphy in a private conversation at one of the Embedded Systems Conferences) is accurate and valuable, because it helps in making the paradigm shift in understanding many aspects of using assertions. Here I&#8217;d only like to elaborate just two aspects.    </p>
<p>First, the analogy to fuses correctly suggests that assertions work best in the &#8220;weakest&#8221; spots. Such &#8220;weak spots&#8221; are often found at the interface between components (e.g., preconditions in a function) but there are many others. The best assertions are those that protect the most of the system. In other words, the best assertions catch errors that would have the most impact on the rest of the system. </p>
<p>The second important implication of the fuse analogy is the issue of disabling assertions in the production code. As the comments to the aforementioned <a href="http://www.embedded.com/columns/breakpoint/221800158">article</a> suggest, most engineers tend to disable assertions before shipping the code, especially in the safety critical products. I believe that this is exactly <span style="font-weight:bold">backwards</span>.</p>
<p>I understand that the standard &#8220;assert.h&#8221; header file is designed to use assertions only in a debug build, so the macro assert() compiles to nothing when the symbol NDEBUG is defined. I strongly suggest rethinking this philosophy, because disabling assertions in the release configuration is like using nails, paper clips, or coins for fuses. Just imagine finding a nail in place of a fuse in a hospital&#8217;s operating room or in a dashboard of an airliner? What would you think of this sort of &#8220;repairs&#8221;? </p>
<p>Yet, by disabling assertions in our code we do exactly this.  </p>
<p>I believe it is very important to understand that assertions have a very important role to play, especially in the filed and especially in the mission-critical systems, because they add additional <span style="font-weight:bold">safety</span> layer in the software. Perhaps the biggest fallacy of our profession is the naïve optimism that our software will not fail. In a nutshell we somehow believe that when we stop checking for errors, they will stop occurring. After all&#8211;we don&#8217;t see them anymore. But this is not how computer systems work. An error, no matter how small, can cause catastrophic failure. With software, there are no &#8220;small&#8221; errors. Our software is either in complete control over the machine or it isn&#8217;t. Assertions help us know when we lose control. </p>
<p>So what do I suggest we do when the assertion fires in the filed? The proper course of action requires a lot of thinking and sometimes a lot of work. In safety-critical systems software failure should be part of the fault-tree analysis. Sometimes, reaching a fail-safe state requires some redundancy in the hardware. In any case, the assertion failures should be extensively tested.</p>
<p>But this is really the best we can do.</p>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2009/11/a-nail-for-a-fuse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cute Creator</title>
		<link>http://embeddedgurus.com/state-space/2009/04/cute-creator/</link>
		<comments>http://embeddedgurus.com/state-space/2009/04/cute-creator/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 17:26:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/2009/04/28/cute-creator/</guid>
		<description><![CDATA[For a long time I&#8217;ve been looking for a good cross platform development environment that would allow fast exploration and navigation of C/C++ source code, not just editing of individual files. For a while I though that Eclipse will fit the bill, but as I wrote previously, the CDT (C/C++ Development Tooling) was really disappointing [...]]]></description>
			<content:encoded><![CDATA[<p>For a long time I&#8217;ve been looking for a good cross platform development environment that would allow fast exploration and navigation of C/C++ source code, not just editing of individual files. For a while I though that Eclipse will fit the bill, but as I wrote <a href="http://www.embeddedgurus.net/state-space/2007/09/emperors-new-clothes.html">previously</a>, the CDT (C/C++ Development Tooling) was really disappointing for me.</p>
<p>In this post I&#8217;d like to tell you about my recent big hope for a truly productive IDE, which is the <a href="http://www.qtsoftware.com/products">Qt Creator</a> from <a>qtsoftware.com</a>. Qt Creator is based on the popular cross-platform Qt framework and runs natively on Windows, Linux, BSD, Mac OS X, and some embedded platforms. No Java (as in the case of Eclipse) means speed and snappy interface. Qt Software (previously Trolltech, acquired in 2008 by Nokia) offers free downloads of Qt Creator for all major platforms.</p>
<p>Qt Creator is primarily targeted as the IDE for Qt-related development. However, the recently released version 1.1 (April 23, 2009) supports external projects, so adding your embedded or any other projects unrelated to Qt is easy.</p>
<p>For example, I&#8217;ve created an embedded project for a &#8220;game&#8221; shown in the screen shot below (click on the image to see it full-size):</p>
<div id="attachment_33" class="wp-caption alignnone" style="width: 310px"><a href="http://embeddedgurus.com/state-space/files/2009/04/QtCreator.jpg"><img class="size-medium wp-image-33" title="QtCreator" src="http://embeddedgurus.com/state-space/files/2009/04/QtCreator-300x185.jpg" alt="QtCreator" width="300" height="185" /></a><p class="wp-caption-text">QtCreator</p></div>
<p>The editing surface maximizes the screen real-estate for file viewing and supports sophisticated splitting, so that my favorite side-by-side code editing is easy.</p>
<p>As shown in the left pane, you can add to your project as many files in different directories as you like. Given this information, Qt Creator builds an internal database of all symbols in your code to allow you exploring and navigating through your source code quickly. For example, you can jump from symbol usage to its definition by pressing F2 (press Alt-back-arrow to jump back to the previous context).</p>
<p>Everything in the editor is designed to enhance quick navigation. For example, every editor pane has a drop-down list of functions and other elements in the file. The editor also supports selective viewing with collapsible/expandable code sections, so you can fit more information on the screen. To quickly view the collapsed section you can simply hover your mouse cursor over it.</p>
<p>I immensely like the support for project-wide searching (as well as search-and-replace), which is available at the bottom of the screen. This feature alone is worth installing the tool.</p>
<p>Even though it is so new, Qt Creator is already very interesting, free, cross-platform IDE with features comparable to Visual Studio 2008 and other best-in-class tools. Qt Software seems very committed to enhancing Qt Creator and I hope that Qt Creator will soon catch up with Eclipse as third-party plug-ins will be developed. One feature that I will be looking forward to is side-by-side code differencing. But already, it is a powerful, free, cross-platform tool that you should try.</p>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2009/04/cute-creator/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Make the most of side-by-side code differencing</title>
		<link>http://embeddedgurus.com/state-space/2008/06/make-the-most-of-side-by-side-code-differencing/</link>
		<comments>http://embeddedgurus.com/state-space/2008/06/make-the-most-of-side-by-side-code-differencing/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 15:36:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/2008/06/11/make-the-most-of-side-by-side-code-differencing/</guid>
		<description><![CDATA[I&#8217;m constantly amazed how many developers shoot themselves in the foot by defeating the benefits of side-by-side source code differencing, which is perhaps the most routinely used technique in daily code development and maintenance with any VCS (Version Control System). In this post, I&#8217;d like to share a few tips for making the most of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m constantly amazed how many developers shoot themselves in the foot by defeating the benefits of side-by-side source code differencing, which is perhaps the most routinely used technique in daily code development and maintenance with any VCS (Version Control System). In this post, I&#8217;d like to share a few tips for making the most of side-by-side differencing, which in my view should be adopted into every coding standard.</p>
<p>First of all, to benefit from side-by-side diff you need to limit the width of your lines so that you don&#8217;t need to scroll horizontally to see all the code. Countless bugs slip into a VCS, because they are hidden off screen during the final merge and people are simply tired of constantly scrolling back and forth. (All GUI usability studies agree that horizontal scrolling of text is always a bad idea.)</p>
<p>Granted, the modern high-resolution wide screens offer a lot of horizontal pixels, but ultimately you&#8217;ll always run out of the screen real estate if you allow lines to go on for miles. The column width must obviously allow comfortable viewing two code listings side-by-side, but you should also budget some horizontal space for the directory-tree view, vertical sliders, line numbers, and line margins, as shown in the screen shot below. I&#8217;ve been using the column width limit of no more than 78 characters. Your limit could perhaps be higher, but you <strong>must</strong> set such a limit and then enforce it without exceptions.</p>
<p><img src="http://www.state-machine.com/resources/side_by_side_diff.jpg" alt="side-by-side diff" vspace="10" /></p>
<p>I can see two main reasons why people write very long lines. The first is long strings in the code. But C or C++ allow writing wide string constants in the following way:</p>
<p><code>char const s1[] =    "This long string is acc\</code></p>
<p><code>eptable to all C compilers.";</code></p>
<p><code>char const s2[] =    "This long string is permissible "</code></p>
<p><code> "in ANSI C.";</code></p>
<p>In other words, you can either use a backslash &#8216;\&#8217; to terminate a string and continue in the next line, or you can terminate a string normally with a double quote &#8216;&#8221;&#8216;, and an ANSI C compiler will concatenate such adjacent strings into a single zero-terminated string.</p>
<p>The second reason for long lines are preprocessor macros. Here again, you can use the backslash &#8216;\&#8217; to break up a longer macro into lines. For example:<br />
<code>#define err(flag, msg) if (flag) \   printf(msg)</code></p>
<p>is the same as</p>
<p><code>#define err(flag, msg) if (flag) printf(msg)</code></p>
<p>The use of a backslash for breaking up longer lines brings up the issue of the end-of-line convention and the use of white space in your source code in general.</p>
<p>Let me start with the end-of-line convention. The issue here is that the backslash continuation won&#8217;t work unless the &#8216;\&#8217; character is <strong>immediately</strong> followed by the end-of-line. Unfortunately, at lest two incompatible end-of-line conventions are in widespread use. The DOS/Windows end-of-line convention consists of the pair of characters CR-LF (0x0D, 0x0A in hex) to terminate lines. In contrast the UNIX™ end-of-line convention uses only one LF character (0x0A). As it turns out, Unix-like machines (e.g. Linux) are confused by the DOS end-of-line convention and will <strong>not</strong> correctly recognize the backslash-continuation, which looks like &#8216;\&#8217;-CR-LF (0x5C, 0x0D, 0x0A), instead of &#8216;\&#8217;-LF (0x5C, 0x0A).</p>
<p>My recommendation is to use consistently only the UNIX end-of-line convention, even on Windows machines. In my experience all Windows-based compilers have no problems with the UNIX convention, including the ancient tools from the DOS-era. As I mentioned, the converse is not true.</p>
<p>And finally, let me talk about the use of white space (spaces, tabs, end-of-line) in general. Obviously, to benefit from source code differencing you&#8217;d like to see only the relevant differences and differences in white space only are typically not relevant. Many code-differencing tools offer an option to ignore white space, but I would not recommend relying on it. Are files with different sizes really identical? And also, as I said before, extra spaces or tabs after the backslash, but before the end-of-line, are not allowed.</p>
<p>As far as tabs are concerned, I&#8217;d strongly recommend <strong>not</strong> to use them at all. Tabs are rendered differently by different editors and printers and bring only insignificant memory savings. Preferably, you should disable tabs at the editor level. At the very least, you should replace all tabs by spaces (&#8220;untabify&#8221;) before saving the file. As for spaces, I recommend removing any trailing spaces that precede the end-of-line character (LF).</p>
<p>Obviously, you can and should automate the source code cleanup. I use the QCLEAN utility (available <a href="http://www.state-machine.com/resources/qclean.zip">here</a> under the GPL license) for cleaning up the code from tabs, trailing blanks, and to enforce the Unix end-of-line convention. The simple console QCLEAN Windows executable scanns recursively all source files (.C, .CPP, .H, .ASM, .S, Makefile, etc.) down from the directory in which it is invoked. The following two listings show a code snippet before and after cleanup with the QCLEAN utility (spaces are shown as dots, tabs as \t, DOS end-of-lines as \r\n, UNIX end-of-lines as \n).</p>
<p>before cleanup:<br />
<code>.\t...\r\n</code></p>
<p><code>class.Foo.:.public.Bar.{...\n</code></p>
<p><code>public:.\r\n</code></p>
<p><code>\tFoo(int8_t.x,.int16_t.y,.int32_t z).//..ctor..\n</code></p>
<p><code>....:.Bar(x,.y),.m_z(z)....\n</code></p>
<p><code>....{}.............\n</code></p>
<p><code>.\t..\n</code></p>
<p><code>....virtual.~Foo();\t... //.xtor........\r\n</code></p>
<p><code>....virtual int32_t doSomething(int8_t.x);.//.method..\r\n </code></p>
<p>after cleanup with QCLEAN:<br />
<code>\n</code></p>
<p><code>class.Foo.:.public.Bar.{\n</code></p>
<p><code>public:\n</code></p>
<p><code>....Foo(int8_t.x,.int16_t.y,.int32_t z).//..ctor\n</code></p>
<p><code>....:.Bar(x,.y),.m_z(z)\n</code></p>
<p><code>....{}\n</code></p>
<p><code>\n</code></p>
<p><code>....virtual.~Foo();... //.xtor\n</code></p>
<p><code>....virtual int32_t doSomething(int8_t.x);.//.method\n<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2008/06/make-the-most-of-side-by-side-code-differencing/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Object-based programming in C</title>
		<link>http://embeddedgurus.com/state-space/2008/01/object-based-programming-in-c/</link>
		<comments>http://embeddedgurus.com/state-space/2008/01/object-based-programming-in-c/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 00:11:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/2008/01/21/object-based-programming-in-c/</guid>
		<description><![CDATA[Embedded developers abandon C++ in droves. According to the 2007 survey published in the ESD magazine, the C++ use declined by one-third compared to year before, which was offset by an equal rise in popularity of C—the only viable alternative in embedded. Even though the last year was most dramatic, the trend has been actually [...]]]></description>
			<content:encoded><![CDATA[<p>Embedded developers abandon C++ in droves. According to the <a href="http://www.embedded.com/design/opensource/201803499">2007 survey</a> published in the ESD magazine, the C++ use declined by one-third compared to year before, which was offset by an equal rise in popularity of C—the only viable alternative in embedded.</p>
<p>Even though the last year was most dramatic, the trend has been actually continuing for a number of years. This couldn&#8217;t go unnoticed by UML tool vendors, who desparately have been trying to cater to C programmers. For example, you can check out the DDJ article &#8220;<a href="http://www.ddj.com/web-development/184401948">UML for C Programmers</a>&#8221; (which seems to be pretty exact re-print of the Embedded Systems Conference paper &#8220;<a href="https://www.cmpevents.com/ESCw08/a.asp?option=C&amp;V=11&amp;SessID=6716">UML for C-Based Embedded Systems</a>&#8220;). To my surprise, nether this article, nor the ESC class mention any well-known techniques of mapping objects and classes to C. I’m sure that it is not what UML vendors like. After all, UML is crippled without objects. (The only real meat remaining are state machines.) But I suppose that the marketing departments of I-Logix/Telelogic have done their homework. Apparently <strong>embedded developers</strong> don’t like to hear about objects anymore.</p>
<p>I find this really disturbing. It seems that &#8220;object&#8221; and (pardon my language) &#8220;class&#8221; are becoming dirty words in the embedded circles. C++ decline is one thing. But abandoning objects is a different story. Aren’t we throwing out the baby with the bath water?</p>
<p>One would assume that the 21st-century software developers have objects in their bones and everyone knows how to program with objects in any language, including C. Apparently increasing number of us don’t know that object technology is a <strong>way of design</strong>, not the use of any particular language or tool. Most design and implementation techniques now associated with C++, Smalltalk, or Java, actually long predate these languages.</p>
<p>So here is how you implement a Point class in C (a Point that you can put on a screen):<br />
<code>typedef struct PointTag {</code></p>
<p><code> int16_t x;   /* x-coordinate */</code></p>
<p><code> int16_t y;   /* y-coordinate */</code></p>
<p><code>} Point;</code></p>
<p><code>void Point_ctor(Point *me, int16_t x, int16_t y) {</code></p>
<p><code> me-&gt;x = x;</code></p>
<p><code> me-&gt;y = y;</code></p>
<p><code>}</code></p>
<p><code>void Point_move(Point *me, int16_t dx, int16_t dy) {</code></p>
<p><code> me-&gt;x += dx;</code></p>
<p><code> me-&gt;y += dy;</code></p>
<p><code>}</code></p>
<p><code>int16_t Point_dist(Point const *me, Point const *other) {</code></p>
<p><code> int16_t dx = me-&gt;x – other-&gt;x;</code></p>
<p><code> int16_t dy = me-&gt;y – other-&gt;y;</code></p>
<p><code> return (int16_t)sqrt(dx*dx + dy*dy);</code></p>
<p><code>}. . .</code></p>
<p><code>/* example of using Point objects */</code></p>
<p><code>Point foo, bar, tar;  /* multiple instances of Point */</code></p>
<p><code>int16_t dist;</code></p>
<p><code>Point_ctor(&amp;foo, 0, 0);Point_ctor(&amp;bar, 1, 1);</code></p>
<p><code>Point_ctor(&amp;tar, -1, 2);</code></p>
<p><code>dist = Point_dist(&amp;foo, &amp;bar);</code></p>
<p><code>Point_move(&amp;tar, 2, 4);dist = Point_dist(&amp;bar, &amp;tar);. . .</code></p>
<p>You can create any number of Point objects as instances of the Point struct. You need to initialize each point with the &#8220;constructor&#8221; Point_ctor(). You manipulate the Points only through the provided functions, which take the pointer &#8220;me&#8221; as the first argument. The &#8220;me&#8221; pointer corresponds directly to the implicit &#8220;this&#8221; pointer in C++.</p>
<p>Moreover, you can as easily implement single inheritance. Assume for example, that you need to add a color attribute to Points. Instead of developing such a colored-Point from scratch, you can <strong>inherit</strong> most what’s common from Point and add only what’s different. Here’s how you do it:<br />
<code>typedef struct ColoredPointTag {</code></p>
<p><code> Point super;    /* derives from Point */</code></p>
<p><code> uint16_t color; /* 16-bit color */</code></p>
<p><code>} ColoredPoint;</code></p>
<p><code>void ColoredPoint_ctor(ColoredPoint *me, </code></p>
<p><code> int16_t x, int16_t y, uint16_t color) {</code></p>
<p><code> Point_ctor(&amp;me-&gt;super, x, y); /* call superclass’ ctor */</code></p>
<p><code> me-&gt;color = color;</code></p>
<p><code>}<br />
...</code></p>
<p><code>/* example of using ColoredPoint objects */</code></p>
<p><code>ColoredPoint p1, p2;int16_t dist;<br />
ColoredPoint_ctor(&amp;p1, 0, 2, RED);</code></p>
<p><code>ColoredPoint_ctor(&amp;p2, 0, 2, BLUE);<br />
/* re-use inherited function */</code></p>
<p><code>dist = Point_dist((Point *)&amp;p1, (Point *)&amp;p2);</code></p>
<p>As you can see, you implement inheritance by literally embedding the superclass (Point) as the first member of the subclass (ColoredPoint). Such nesting of structures always aligns the first data member &#8216;super&#8217; at the beginning of every instance of the derived structure. This alignment is guaranteed by the C standard. Specifically, WG14/N1124 Section 6.7.2.1.13 says: &#8220;&#8230; A pointer to a structure object, suitably converted, points to its initial member. There may be unnamed padding within a structure object, but not at its beginning&#8221;. This alignment lets you treat a pointer to the derived ColoredPoint struct as a pointer to the Point base struct. All this is legal, portable, and blessed by the Standard.</p>
<p>With this arrangement, you can always safely pass a pointer to ColoredPoint to any C function that expects a pointer to Point. Consequently, all functions designed for the Point structure are automatically available to the ColoredPoint structure. They are all <strong>inherited</strong>.</p>
<p>There is really nothing to it.</p>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2008/01/object-based-programming-in-c/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Is Eclipse The Emperor&#8217;s New Clothes?</title>
		<link>http://embeddedgurus.com/state-space/2007/09/is-eclipse-the-emperors-new-clothes/</link>
		<comments>http://embeddedgurus.com/state-space/2007/09/is-eclipse-the-emperors-new-clothes/#comments</comments>
		<pubDate>Wed, 26 Sep 2007 16:59:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/2007/09/26/is-eclipse-the-emperors-new-clothes/</guid>
		<description><![CDATA[&#8220;Many years ago there was an Emperor so exceedingly fond of new clothes&#8230; &#8230;one day came two swindlers. They let it be known they were weavers, and they said they could weave the most magnificent fabrics imaginable. Not only were their colors and patterns uncommonly fine, but clothes made of this cloth had a wonderful [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Many years ago there was an Emperor so exceedingly fond of new clothes&#8230;</p>
<p>&#8230;one day came two swindlers. They let it be known they were weavers, and they said they could weave the most magnificent fabrics imaginable. Not only were their colors and patterns uncommonly fine, but clothes made of this cloth had a wonderful way of becoming invisible to anyone who was unfit for his office, or who was unusually stupid.</p>
<p>&#8230;so off went the Emperor in his new clothes that were nothing at all. Everyone in the streets and the windows said, &#8220;Oh, how fine are the Emperor&#8217;s new clothes! Don&#8217;t they fit him to perfection? And see his long train!&#8221; Nobody would confess that he couldn&#8217;t see anything, for that would prove him either unfit for his position, or a fool. No costume the Emperor had worn before was ever such a complete success.&#8221;</p>
<p>&#8211;Hans Christian Andersen, &#8220;The Emperor&#8217;s New Clothes&#8221;</p>
<p>To me this little story has a lot to do with Eclipse (www.eclipse.org), which apparently is taking our industry by storm. Obviously, I must be the poor fool, unfit to see the remarkable benefits of Eclipse, but as an embedded developer I really, honestly don’t.</p>
<p>Admittedly, I&#8217;m a very naïve user of Eclipse, with experience limited just to two tools: the Altera Nios II Integrated Development Environment (IDE) and the Texas Instruments Code Composer Essentials for MSP430. Both these tools are based on Eclipse, and because of this both are just terrible.</p>
<p>I&#8217;m really not impressed with the CDT (C/C++ Development Tooling). The CDT workspaces, project files, and makefiles are notoriously difficult to move from one development workstation to another because they contain absolute paths. Even for the simplest project the CDT manages somehow to produce hundreds of files in a directory tree 3-level deep. You tell me how am I supposed to save this in any VCS (Version Control System).</p>
<p>The make process takes ages.</p>
<p>But probably, the worst part is the GDB interface to the remote target. Not only is the connection flaky and dreadfully slow (no comparison at all to other commercial offerings.) The target connectivity spawns some GDB server processes that tend to be &#8220;pigs&#8221; (i.e., take 100% of your host CPU, even if not talking to the target.) This isn&#8217;t the highest level of professionalism&#8230;</p>
<p>Sure, the CDT allows you to forego the automatic makefiles generation and use external Makefiles instead (which I would actually recommend). In principle, I could also go ahead and fix any problems in Eclipse, the CDT plugin, or the GDB server, because they are all available as open source. But, then I must ask if Eclipse is really such a great productivity booster? Don&#8217;t I really have a bigger fish to fry than fighting the tool?</p>
<p>So, as it stands, the Eclipse Emperor is naked for me.</p>
<p>What do you think? What are your experiences with Eclipse in the embedded system space?</p>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2007/09/is-eclipse-the-emperors-new-clothes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Embedded Software Crisis or Embedded Software Glut?</title>
		<link>http://embeddedgurus.com/state-space/2007/06/embedded-software-crisis-or-embedded-software-glut/</link>
		<comments>http://embeddedgurus.com/state-space/2007/06/embedded-software-crisis-or-embedded-software-glut/#comments</comments>
		<pubDate>Sat, 23 Jun 2007 02:47:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/2007/06/23/embedded-software-crisis-or-embedded-software-glut/</guid>
		<description><![CDATA[I’ve been listening to the recent webcast &#8220;Solving the Embedded Software Crisis&#8221; (see also Rich Nass’ column &#8220;The need for more programmers&#8221; in the May issue of the ESD magazine). Of course, the main thrust of this particular webcast (as well as the ESD column) was the use of code generating tools (such as LabView [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been listening to the recent webcast &#8220;<a href="http://seminar2.techonline.com/s/esd_jun1907">Solving the Embedded Software Crisis</a>&#8221; (see also Rich Nass’ column &#8220;<a href="http://www.embedded.com/showArticle.jhtml?articleID=199202706">The need for more programmers</a>&#8221; in the May issue of the ESD magazine). Of course, the main thrust of this particular webcast (as well as the ESD column) was the use of code generating tools (such as LabView from National Instruments, the sponsor of this webcast) to alleviate the allegedly looming crisis.</p>
<p>But tools or no tools, the real problem in my view is not so much with creating new code, as it is in <b>getting rid</b> of the old code.</p>
<p>In every company I worked for, we had to maintain just one broad code base for all products of that particular division of the company. We only kept adding to this code base, as new features, product variants, and entirely new products were released. But we never removed anything. Needless to say, the code was a kitchen sink of everything that the company ever did, including prototypes and dead ends. Most of the stuff was long obsolete, but it lived on in our code forever.</p>
<p>Adding code is easy. Removing dead code (without breaking the actually used parts of the code) is hard. But without the mechanisms for dropping the old baggage, we face a <b>real</b> Software Crisis.</p>
<p>Yet most managers don’t get it. I remember one day my boss came to my desk wanting to know how much code I have just cranked out. I proudly showed him that I managed to actually remove an ugly function. He was clearly disappointed in my negative productivity.</p>
<p>From all my experience, I’m convinced that getting rid of code is more important than creating new code. As I said, it’s not easy, but rather requires careful planning and actual design for obsolescence. In the future installments of this blog, I plan to provide a few concrete design strategies to allow easy (or at least easier) removing of obsolete code. Stay tuned.</p>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2007/06/embedded-software-crisis-or-embedded-software-glut/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Agile Embedded Development</title>
		<link>http://embeddedgurus.com/state-space/2006/09/agile-embedded-development/</link>
		<comments>http://embeddedgurus.com/state-space/2006/09/agile-embedded-development/#comments</comments>
		<pubDate>Sun, 24 Sep 2006 01:56:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://embeddedgurus.com/state-space/2006/09/24/agile-embedded-development/</guid>
		<description><![CDATA[Silicon Valley finally seems to be taking a serious look at &#8220;agile development&#8221; as a competitive advantage. Articles like “Reinventing the Software Development Strategy” by John Seybold give us a glimmer of hope that maybe software development doesn’t always need to be a “death march” of missed schedules, but rather can actually be fun. If [...]]]></description>
			<content:encoded><![CDATA[<p>Silicon Valley finally seems to be taking a serious look at &#8220;agile development&#8221; as a competitive advantage. Articles like “<a href="http://www.sterlinghoffman.com/cgi-bin/index.pl?p=newsletter/articles/article252.html">Reinventing the Software Development Strategy</a>” by John Seybold give us a glimmer of hope that maybe software development doesn’t always need to be a “death march” of missed schedules, but rather can actually be fun. </p>
<p>If you accept arguments made in Seybold’s article (and many other articles and books about agile development and extreme programming), then you must look at testing in an entirely new light. Testing is not some pain-in-the-neck chore performed long after the design and coding by the most junior and inexperienced team members. Rather, continuous testing is the primary activity that drives everything else that’s going on in the project. In fact, if you truly put so understood Testing (with capital T) at the center, the whole agile process falls out more or less automatically from this single principle.  </p>
<p>Testing, in the agile sense, has been notoriously difficult in the embedded space. The desktop guys have powerful, commodity hardware with plenty of standard development tools. We embedded folks, on the other hand, by definition work on some custom design interfaced to proprietary, often buggy (or not even yet existing) hardware.</p>
<p>But it doesn’t mean that embedded developers cannot dramatically improve Testability of their software. If you truly, seriously think about Testing, you need to bend everything in the project toward the Testing, not the other way around. </p>
<p>Let’s start with the design. Everybody knows that modular software with independently testable pieces is good. The trick, of course, is to build it that way.</p>
<p>The conventional approaches, unfortunately, aren’t helping here. Take for example a traditional RTOS. The natural units of decomposition are tasks. But when you try to unit-test any real-world task, you quickly notice that it is hopelessly intertwined with other tasks by means of semaphores, shared resources, mutexes, condition variables, event flags, message mailboxes, message queues, and so on. Surely, traditional RTOSes provide no shortage of mechanisms to tie the application in a hopeless knot.</p>
<p>Experienced <a href="http://www.embedded.com/98/9807fe.htm">embedded gurus</a> know to be wary of most of the RTOS mechanisms, and strictly build applications around the message-passing paradigm. Strict encapsulation is the name of the game. A task hides all its internal data and resources and communicates with the outside world only by sending and receiving events. Such systems use only a tiny fraction of the RTOS, namely message queues, and have really no need for all the other tricky RTOS mechanisms. Software components designed that way are not only easier to unit-test. They are also safer, more reusable, maintainable, and extensible.</p>
<p>But at this point I need to ask the nagging questions. Why structuring all systems that way is not somehow enforced in the RTOS itself? Why RTOS vendors bend over backwards to keep adding even more ways to couple the tasks? </p>
<p>The second aspect of software development that can make or break any successful Testing strategy is the error and exception handling policy. I’m really amazed how much complexity is added to the code by &#8220;<a href="http://en.wikipedia.org/wiki/Defensive_programming">defensive programming</a>&#8221; techniques that somehow attempt to “handle” erroneous situations that never should have occurred in the first place, like overrunning an array index or dereferencing a NULL-pointer. The problem is that defensive programming hinders Testing&#8230; and demoralizes the testers.</p>
<p>You see, defensively written code accepts much wider range of inputs than it should and by doing so <b>hides bugs</b>. Your tests don’t appear to uncover evident errors. Yet such tests don’t build much confidence in the system, because the code might be wondering around all nights and weekends silently sweeping the errors under the rug.</p>
<p>A much better alternative is to confront errors head-on, by liberally using <a href="http://www.quantum-leaps.com/writings/samek0308.pdf">assertions</a> (or more scientifically the <a href="http://en.wikipedia.org/wiki/Design_By_Contract">Design By Contract</a> philosophy). Testing a piece of code peppered with assertions is an entirely different experience than “defensive” code. Every successful Test run means that the program passed all its assertions. Every Test failure is much harder to dismiss as “not reproducible”, because you have a record in form of a file name and line number where the assertion fired. This information gives you an excellent starting point for understanding and ultimately fixing the bug. </p>
<p>And finally, Testing almost always requires instrumenting the code to give the tester additional visibility into the inner workings of the software. Unfortunately, in many embedded systems even the primitive printf() facility is unavailable (no screen to print to). Obviously, you can do much better than printf() (e.g., see the <a href="http://www.quantum-leaps.com/products/qs.htm">Quantum Spy</a> software trace facility). </p>
<p>As you can see, Testing in the agile sense requires serious upfront investments and rethinking many of the time-honored embedded practices. You can no longer build a system without accounting for Testing right from the start.  </p>
<p>What do you think about agile embedded software development? What do you do to improve Testability of your systems?</p>
]]></content:encoded>
			<wfw:commentRss>http://embeddedgurus.com/state-space/2006/09/agile-embedded-development/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

