<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Robust Embedded Software Architecture in 5 Easy Steps</title>
	<atom:link href="http://embeddedgurus.com/barr-code/2009/09/robust-embedded-software-architecture-in-5-easy-steps/feed/" rel="self" type="application/rss+xml" />
	<link>http://embeddedgurus.com/barr-code/2009/09/robust-embedded-software-architecture-in-5-easy-steps/</link>
	<description>A Blog by Michael Barr</description>
	<lastBuildDate>Fri, 18 May 2012 17:16:50 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Thomas Honold</title>
		<link>http://embeddedgurus.com/barr-code/2009/09/robust-embedded-software-architecture-in-5-easy-steps/comment-page-1/#comment-66</link>
		<dc:creator>Thomas Honold</dc:creator>
		<pubDate>Thu, 08 Oct 2009 13:58:04 +0000</pubDate>
		<guid isPermaLink="false">http://www.gfcdev.org/test-stack/2009/09/17/robust-embedded-software-architecture-in-5-easy-steps/#comment-66</guid>
		<description>I have read your post and want to give some feedback.  First I have enjoyed reading it. The best part for me was Step 2: &quot;Distinguish architecture from design&quot; showing the different levels of HOW.For the test aspect I think you haven&#039;t yet shown the complete picture. Since testing is about 60 % of the whole project time, I  think it should be a little bit more detailed. Here is what I suggest:In Step 4: &quot;Design for test&quot; from my point of view it is missing that the tests should all be requirements driven. This means, that the requirements which were defined in Step 1 are the base of all  tests. This formal approach has the big advantage that you do not  test what the code does (like white box Unit Tests in the past), it is tested what the code is supposed to do.It should also be stated that it is not required to test each requirement by a single test. To reduce the overall test time, you can run the OK-case tests first by using the Release Build of the product. Then you check what requirements where already covered.  Then the Error-Cases should be tested by an instrumented Debug Build (by injecting errors), to see what happens in error cases. It is a  Debug Build, since the final code should not contain any test features, since they are unused code in normal operation.What we do in our SW development process for avionics equipment (DO-178B) is1. Run test procedures with all requirements based OK-cases (Release Build of SW)2. Run test procedures with all requirements based Error-cases (instrumented Debug Build)3. Do dedicated Unit Tests for modules which were not coverable by the first 2 steps4. If Unit Tests do no cover 100% of the code, manual code inspection fills this gapWe use PERL scripts on a Personal Computer commanding the embedded system to execute the dedicated tests. The test results then are  sent back to the PC for a final report. All tests have to run automatically without any user interaction.This test approach is quite a lot of work for the first time. But for all further SW releases it pays off.I have once read that the most SW bugs are introduced by SW changes. I think this is absolutely the truth.I&#039;m looking forward to you next articles for this matter.kind regards,Thomas</description>
		<content:encoded><![CDATA[<p>I have read your post and want to give some feedback.  First I have enjoyed reading it. The best part for me was Step 2: &quot;Distinguish architecture from design&quot; showing the different levels of HOW.For the test aspect I think you haven&#39;t yet shown the complete picture. Since testing is about 60 % of the whole project time, I  think it should be a little bit more detailed. Here is what I suggest:In Step 4: &quot;Design for test&quot; from my point of view it is missing that the tests should all be requirements driven. This means, that the requirements which were defined in Step 1 are the base of all  tests. This formal approach has the big advantage that you do not  test what the code does (like white box Unit Tests in the past), it is tested what the code is supposed to do.It should also be stated that it is not required to test each requirement by a single test. To reduce the overall test time, you can run the OK-case tests first by using the Release Build of the product. Then you check what requirements where already covered.  Then the Error-Cases should be tested by an instrumented Debug Build (by injecting errors), to see what happens in error cases. It is a  Debug Build, since the final code should not contain any test features, since they are unused code in normal operation.What we do in our SW development process for avionics equipment (DO-178B) is1. Run test procedures with all requirements based OK-cases (Release Build of SW)2. Run test procedures with all requirements based Error-cases (instrumented Debug Build)3. Do dedicated Unit Tests for modules which were not coverable by the first 2 steps4. If Unit Tests do no cover 100% of the code, manual code inspection fills this gapWe use PERL scripts on a Personal Computer commanding the embedded system to execute the dedicated tests. The test results then are  sent back to the PC for a final report. All tests have to run automatically without any user interaction.This test approach is quite a lot of work for the first time. But for all further SW releases it pays off.I have once read that the most SW bugs are introduced by SW changes. I think this is absolutely the truth.I&#39;m looking forward to you next articles for this matter.kind regards,Thomas</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Rob Williams</title>
		<link>http://embeddedgurus.com/barr-code/2009/09/robust-embedded-software-architecture-in-5-easy-steps/comment-page-1/#comment-65</link>
		<dc:creator>Rob Williams</dc:creator>
		<pubDate>Sun, 20 Sep 2009 20:06:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.gfcdev.org/test-stack/2009/09/17/robust-embedded-software-architecture-in-5-easy-steps/#comment-65</guid>
		<description>A recommendation that has several plus points in its favour is to clearly divide the requirements into &quot;Positives&quot; and &quot;Negatives&quot;. The positives state what the system should be able to do, while the negatives identify the behaviours which are to be avoided at all costs.There are at least three advantages for establishing the distinction at an early stage in the development:1. Separate the development team into two parts, one to deal with the core functional behaviour, while the second deals with error management aspects. This eliminates, or at least mitigates, the worst case errors which arise from misunderstanding the original requirements spec. The two teams carry out separate analysis, design and implementation, with less chance of propagating the fundamental mistake throughout the final system.2. It reduces the likelihood of a conflict with clients around some &quot;implied&quot; behaviour. Having documentation that states what the system will NOT do is a powerful argument in any dispute.3. The separation of functional core code from the associated error management routines, as far as possible, improves testability and eventual reusability.</description>
		<content:encoded><![CDATA[<p>A recommendation that has several plus points in its favour is to clearly divide the requirements into &quot;Positives&quot; and &quot;Negatives&quot;. The positives state what the system should be able to do, while the negatives identify the behaviours which are to be avoided at all costs.There are at least three advantages for establishing the distinction at an early stage in the development:1. Separate the development team into two parts, one to deal with the core functional behaviour, while the second deals with error management aspects. This eliminates, or at least mitigates, the worst case errors which arise from misunderstanding the original requirements spec. The two teams carry out separate analysis, design and implementation, with less chance of propagating the fundamental mistake throughout the final system.2. It reduces the likelihood of a conflict with clients around some &quot;implied&quot; behaviour. Having documentation that states what the system will NOT do is a powerful argument in any dispute.3. The separation of functional core code from the associated error management routines, as far as possible, improves testability and eventual reusability.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: K1200LT Rider</title>
		<link>http://embeddedgurus.com/barr-code/2009/09/robust-embedded-software-architecture-in-5-easy-steps/comment-page-1/#comment-64</link>
		<dc:creator>K1200LT Rider</dc:creator>
		<pubDate>Fri, 18 Sep 2009 17:47:35 +0000</pubDate>
		<guid isPermaLink="false">http://www.gfcdev.org/test-stack/2009/09/17/robust-embedded-software-architecture-in-5-easy-steps/#comment-64</guid>
		<description>One basic problem with requirements that I&#039;ve seen a handful of times goes something like this:&quot;The event shall occur at 30 Hz&quot; - with no tolerance specified.  As written, a measured frequency of 29.9999999 Hz is a failure.  In this case, repeated requests for a tolerance went unanswered, so we picked what we thought was suitable, and the requirement has never been edited.  Amazing.</description>
		<content:encoded><![CDATA[<p>One basic problem with requirements that I&#39;ve seen a handful of times goes something like this:&quot;The event shall occur at 30 Hz&quot; &#8211; with no tolerance specified.  As written, a measured frequency of 29.9999999 Hz is a failure.  In this case, repeated requests for a tolerance went unanswered, so we picked what we thought was suitable, and the requirement has never been edited.  Amazing.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Nigel Jones</title>
		<link>http://embeddedgurus.com/barr-code/2009/09/robust-embedded-software-architecture-in-5-easy-steps/comment-page-1/#comment-63</link>
		<dc:creator>Nigel Jones</dc:creator>
		<pubDate>Fri, 18 Sep 2009 13:05:33 +0000</pubDate>
		<guid isPermaLink="false">http://www.gfcdev.org/test-stack/2009/09/17/robust-embedded-software-architecture-in-5-easy-steps/#comment-63</guid>
		<description>Very nice article Mike. I could probably write an essay on all my thoughts, but I&#039;ll restrain myself to the first step that you outlined - namely the &#039;what&#039;. In my experience this is amazingly difficult to obtain. Particular problems I often see are:1. An incomplete list of &#039;whats&#039;2. A &#039;what&#039; that is incomplete. For example &quot;The oven must be up to temperature with 5 minutes&quot;. Seems clear enough - until you realize that getting it up to temperature is one thing, but ensuring it doesn&#039;t overshoot by too much is another!3. Over specification at times. (I see this a lot on government type requirements)Anyway, given that it&#039;s the first step (and in my opinion the toughest to get right), it&#039;s hardly surprising that a lot of products have architectural problems.</description>
		<content:encoded><![CDATA[<p>Very nice article Mike. I could probably write an essay on all my thoughts, but I&#39;ll restrain myself to the first step that you outlined &#8211; namely the &#39;what&#39;. In my experience this is amazingly difficult to obtain. Particular problems I often see are:1. An incomplete list of &#39;whats&#39;2. A &#39;what&#39; that is incomplete. For example &quot;The oven must be up to temperature with 5 minutes&quot;. Seems clear enough &#8211; until you realize that getting it up to temperature is one thing, but ensuring it doesn&#39;t overshoot by too much is another!3. Over specification at times. (I see this a lot on government type requirements)Anyway, given that it&#39;s the first step (and in my opinion the toughest to get right), it&#39;s hardly surprising that a lot of products have architectural problems.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Sundar Srinivasan</title>
		<link>http://embeddedgurus.com/barr-code/2009/09/robust-embedded-software-architecture-in-5-easy-steps/comment-page-1/#comment-62</link>
		<dc:creator>Sundar Srinivasan</dc:creator>
		<pubDate>Thu, 17 Sep 2009 17:52:29 +0000</pubDate>
		<guid isPermaLink="false">http://www.gfcdev.org/test-stack/2009/09/17/robust-embedded-software-architecture-in-5-easy-steps/#comment-62</guid>
		<description>That&#039;s simple and neat, Michael. But I think this would work only if performance is the single design objective. We crack under pressure when we have to guarantee performance under the constraints of power, area, and of course time to market. That&#039;s when we have to start looking at application-specific hardware. That part is not addressed.</description>
		<content:encoded><![CDATA[<p>That&#39;s simple and neat, Michael. But I think this would work only if performance is the single design objective. We crack under pressure when we have to guarantee performance under the constraints of power, area, and of course time to market. That&#39;s when we have to start looking at application-specific hardware. That part is not addressed.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

