<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-12950249</id><updated>2011-04-21T11:49:01.455-07:00</updated><category term='SNMP'/><category term='Hardware Test'/><category term='Modem'/><category term='JTRS'/><category term='CodingStyle'/><category term='SoftwareDefinedRadio'/><category term='Profiling'/><category term='Software Development'/><category term='ParallelProgramming'/><category term='LabVIEW'/><category term='MultiCore'/><category term='hardware in the loop'/><category term='Graphical Tools'/><category term='Test'/><category term='Supercomputing'/><category term='Software Test'/><title type='text'>Ideas in Wiring</title><subtitle type='html'>This is my storehouse of information that might be useful to the LabVIEW community. It's the stuff that falls somewhere between "documentation" and "hallway conversation" that you might find useful, entertaining, or just a way to kill some time. As with any personal Blog, I don't speak for NI, that would be way more pressure than I want to deal with. I like hearing from you. &lt;br&gt;Email me your thoughts, ideas, or tips at joel.sumner(AT)ni.com.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12950249.post-6291433719866850566</id><published>2008-06-18T12:49:00.000-07:00</published><updated>2008-06-18T13:32:29.534-07:00</updated><title type='text'>Engineering our future</title><content type='html'>As engineers and scientists, we're trying to make the world a better place.  In addition to our day jobs, there are things we can do off-hours too.  If you can take two hours a week from whatever else you are doing and instead continue to be an engineer, I have a suggestion for you.  Please be a mentor.  You can be the inspiration to an entire classroom of elementary school students to become engineers and scientists when they grow up.  In addition, you get a chance to be a kid and even play with toys - engineering toys.&lt;br /&gt;&lt;br /&gt;One way is to be a mentor for a &lt;a href="http://usfirst.org/what/fll/default.aspx?id=390"&gt;FIRST Lego League&lt;/a&gt; (FLL) team.  Every fall, teams of 4-10 elementary and middle school students get a big box of LEGO pieces and a &lt;a href="http://www.firstlegoleague.org/default.aspx?pid=29550"&gt;challenge&lt;/a&gt;. By December, they need to have built a fully autonomous robot that will complete as many challenges as possible as well as a presentation on the challenge topic.  This year, over 2000 teams participated in regional, national, and international competitions culminating in the &lt;a href="http://www.usfirst.org/community/fll/content.aspx?id=766"&gt;FIRST World Festival&lt;/a&gt; in Atlanta, Georgia. It's fun to watch how the kids grow through their participation. The shy learn to speak up, the dominant learn to share, and they all get to experience some fun that they may not normally get in their school day.&lt;br /&gt;&lt;br /&gt;&lt;a href="javascript:ShowVideo('1st_overview.flv')" id="heroImageLink"&gt;&lt;img id="heroTextImg" src="http://www.usfirst.org/images/hero_f8.jpg" alt="" width="390" border="0" height="237" /&gt;&lt;/a&gt;&lt;br /&gt;(image taken from usfirst.org website - yes, the trophy is made of LEGO pieces)&lt;br /&gt;&lt;br /&gt;If you want to work with high-schoolers, FIRST also has two other competitions: &lt;a href="http://www.usfirst.org/what/fvc/default.aspx?id=380"&gt;FIRST Tech Challenge&lt;/a&gt; and &lt;a href="http://www.usfirst.org/what/frc/default.aspx?id=366"&gt;FIRST Robotics Competition&lt;/a&gt;. While the FLL robots are small and plastic, the FTC  and FRC robots get heavier and more powerful.  FTC robots are around 24" cubes that weigh 5 pounds and the FRC robots get up to 120 pounds and the size of a refrigerator.&lt;br /&gt;&lt;br /&gt;&lt;span id="ctl00_ContentPlaceHolder1_ListSummary1"&gt;&lt;img title="hero_frc_02" alt="hero_frc_02" src="http://www.usfirst.org/uploadedImages/What_We_Do/FIRST_Robotics_Competition/Hero_Assets/hero_frc_02.jpg" border="0" /&gt;&lt;/span&gt;&lt;br /&gt;(image from usfirst.org website)&lt;br /&gt;&lt;br /&gt;40% of FRC participants end up going to engineering school in college. At the FRC finals in Atlanta, I saw 20 colleges with information booths. Athletes aren't the only way to get scholarships now - some schools are giving them out to FRC participants.&lt;br /&gt;&lt;br /&gt;Inspire an engineer - get involved. You won't regret it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-6291433719866850566?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/6291433719866850566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=6291433719866850566' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/6291433719866850566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/6291433719866850566'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2008/06/engineering-our-future.html' title='Engineering our future'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-6423693604785755998</id><published>2007-10-04T08:28:00.001-07:00</published><updated>2007-10-04T08:28:49.006-07:00</updated><title type='text'>Some days you just have to shake your head</title><content type='html'>&lt;p&gt;The Power.org organization just met in Austin and one of their conversations was on multi-core programming.&amp;nbsp; Some days, I just feel sorry for programmers stuck in the traditional embedded world. This is from an &lt;a href="http://www.embedded.com/design/multicore/202102615?_requestid=647620"&gt;EE-times article&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"The inability of C/C++ code to parallelize coupled with its ubiquity throughout the embedded market is a major issue for multi-core going forward," Heikkila wrote in a follow up email to EE Times. "Any alternative parallel programming languages certainly won't materialize in the embedded market, but instead will more likely gain momentum in a more mainstream computing market before making its way into embedded applications," he added.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And more bad news for current developers&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;So far, engineers are giving embedded software a low grade of just 2.06 out of five in terms of its readiness for multi-core.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;One day, they'll use LabVIEW....&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-6423693604785755998?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/6423693604785755998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=6423693604785755998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/6423693604785755998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/6423693604785755998'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/10/some-days-you-just-have-to-shake-your.html' title='Some days you just have to shake your head'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-3460233044328055972</id><published>2007-07-31T14:18:00.000-07:00</published><updated>2008-12-13T05:15:31.905-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MultiCore'/><category scheme='http://www.blogger.com/atom/ns#' term='ParallelProgramming'/><category scheme='http://www.blogger.com/atom/ns#' term='LabVIEW'/><category scheme='http://www.blogger.com/atom/ns#' term='Profiling'/><title type='text'>Profiling Multi-Core Applications</title><content type='html'>&lt;p&gt;A while ago, I wrote an article about &lt;a href="http://ideasinwiring.blogspot.com/2005/06/writing-parallel-programs-in-labview.html"&gt;writing parallel programs&lt;/a&gt;.  The next question is: how do you optimize them? &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Note: if you are writing multi-core programs and are coming to &lt;a href="http://www.ni.com/niweek/"&gt;NIWeek&lt;/a&gt;, please email me (email address on the right). I'd like to talk to you about this topic further.  But I digress...&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Typically, when optimizing an application, you are trying to make it faster. "Faster" usually means "reduce the time the user observes the task to take".  We sometimes call that "&lt;a href="http://whatis.techtarget.com/definition/0,,sid9_gci826109,00.html"&gt;wall clock time&lt;/a&gt;".  Occasionally, there is no outside observer. Instead, you want your task to be less of a disruption on other applications. In that case, you are purely concerned with how much of the resources of the computer, typically the CPU, are being consumed.  This consumption could be called "&lt;a href="http://www.webopedia.com/TERM/C/CPU_time.html"&gt;CPU time&lt;/a&gt;".&lt;/p&gt;&lt;p&gt;When optimizing for wall clock time, you quickly run into some difficulties.&lt;/p&gt;&lt;p&gt;1) Most profilers give you time of operation in CPU time.  A function that goes to sleep for 10 minutes has a CPU time of nearly nothing but a wall clock time of 10 minutes.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For example, if you run this VI with the LabVIEW profiler enabled, it will show that it uses a whopping 46.9 milliseconds&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__jJMKJuMzns/Rq-oP_juD_I/AAAAAAAAAAM/ZDhz7nekFlc/s1600-h/VI1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/__jJMKJuMzns/Rq-oP_juD_I/AAAAAAAAAAM/ZDhz7nekFlc/s320/VI1.JPG" alt="" id="BLOGGER_PHOTO_ID_5093474696292077554" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;So, you think. Wow, my application took 10 seconds and this function only took 47 milliseconds, I guess my slowdown is elsewhere.  And, of course, you would be wrong.  Now, this example is pretty silly. No one just adds a sleep for the heck of it.  Normally, you'll find "sleep time" in a couple of different places&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Pausing because you need to synchronize with other event. Maybe you go to sleep for 1 second until some external piece of hardware has responded.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Calls into the OS.  Reading from disk and writing from disk occurs in the OS. The CPU time returned by the profiler doesn't normally show time spent in the OS, even though it is consuming CPU cycles.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Calls into a driver.  Some driver calls do their work inside the OS so they are a case of #2. Or, sometimes they get implemented as a LabVIEW sleep, and so they also don't get counted.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Task swaps.  The OS might decide to give some other application some time. This hurts the wall clock time of your application but your profiler won't tell you.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If you want wall to measure wall clock time, you should instead get the tick count of the machine before and after the operation occurs. A tick count uses wall clock time to give you the results.  My &lt;a href="http://ideasinwiring.blogspot.com/2005/05/benchmarking-labview-operation.html"&gt;profiling article&lt;/a&gt; shows you how to get the tick count to profile an operation. &lt;/p&gt;&lt;p&gt;2) Things get a bit weirder when you want to try and optimize on a multi-core computer.  On a single core machine, you can make your program run faster by either reducing wait time like you saw in #1 or by reducing the CPU time.  On a multi core machine, a task can have a shorter wall clock time even though the CPU time and wait time are the same.  If you split the CPU work (i.e. CPU time) evenly across two processors, your wall clock time goes down by a factor of 2 but your CPU time is the same.&lt;/p&gt;&lt;p&gt;You can observe this with the Windows task manager.  If you have two cores, the task manager will show two graphs of CPU utilization, one for each CPU.  You can also use the windows application "perfmon" which gives you a bit more flexible way to observe this.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__jJMKJuMzns/Rq-oZ_juEAI/AAAAAAAAAAU/_1G9UR9zSIg/s1600-h/taskman.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/__jJMKJuMzns/Rq-oZ_juEAI/AAAAAAAAAAU/_1G9UR9zSIg/s320/taskman.JPG" alt="" id="BLOGGER_PHOTO_ID_5093474868090769410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;(the CPU Usage History shows 2 graphs, one for each processor)&lt;/p&gt;&lt;p&gt;So, to optimize your application, the trick is to max out both processors.  In effect, you are trying to INCREASE the CPU time for the second processor by shifting the processing from CPU 1 to CPU2.  It's odd to think of optimizing as increasing processor time, but that's what you are doing.&lt;/p&gt;&lt;p&gt;The problem with using this approach is that increasing the CPU time on the second processor doesn't necessarily reduce wall clock time.  Your efforts to make your application more parallel might add CPU work, such as forcing memory copies, that negate the benefit of parallelism.  &lt;/p&gt;&lt;p&gt;As an example, the old LabVIEW queue primitives &lt;em&gt;used to&lt;/em&gt; copy data into and out of the queues. If you put a big array in a queue, it would spend a lot of time copying the array into the queue and then a lot of time copying it out.  To make my application more parallel, I split it into loops and used queues to pass the data between the loops.  My CPU utilization was great, 100% on both cores, but my wall clock time was slower because it spent a long time simply copying data around.  Fortunately, we learned from that experience and the primitives don't make copies of arrays &amp;amp; clusters any more.&lt;/p&gt;&lt;p&gt;Unfortunately, there's not a really good way to look at this effect right now.  Use tick counts to measure your wall clock time and use the profiler to establish a baseline. Then, as you are making changes, make sure the wall clock time is going down and the CPU time is remaining at least constant or only going up slightly.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-3460233044328055972?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/3460233044328055972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=3460233044328055972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3460233044328055972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3460233044328055972'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/07/profiling-multi-core-applications.html' title='Profiling Multi-Core Applications'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__jJMKJuMzns/Rq-oP_juD_I/AAAAAAAAAAM/ZDhz7nekFlc/s72-c/VI1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-7716973106444787069</id><published>2007-07-28T19:49:00.001-07:00</published><updated>2007-07-28T19:50:24.231-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareDefinedRadio'/><title type='text'>Physics of a Radar System</title><content type='html'>&lt;p&gt;If you ever wanted to know how a military radar transmission works, there's a pretty good overview that you can find in this &lt;a href="http://www.rfglobalnet.com/Content/news/article.asp?Bucket=Article&amp;amp;DocID=%7B180306F2-5435-47D7-A673-A8FFDDEDB189%7D"&gt;Tektronix Application Note&lt;/a&gt;&amp;nbsp;on pages 2-6&amp;nbsp;It talks about what a radar pulse looks like and why you might modulate the pulse in order to get better performance. &lt;/p&gt; &lt;p&gt;They skipped the most basic type of radar system but Mattel has utilized it to make a really &lt;a href="http://www.wirelessnetdesignline.com/200001080?cid=RSSfeed_wirelessnetdesignline_wndlRSS"&gt;neat and cheap radar gun&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;You can use &lt;a href="http://en.wikipedia.org/wiki/Radar"&gt;RADAR&lt;/a&gt; (technically it's an acronym so it&amp;nbsp;should be capitalized) to tell a number of things about object it's aimed at. The Mattel radar gun gives you the most basic information, speed.&amp;nbsp; It transmits a &lt;a href="http://en.wikipedia.org/wiki/Microwave"&gt;microwave signal&lt;/a&gt; and observes the reflections (if any) that come back from the object.&amp;nbsp; If the object is moving toward or away from the gun, the reflected signal will have a &lt;a href="http://en.wikipedia.org/wiki/Doppler_effect"&gt;Doppler shift&lt;/a&gt;.&amp;nbsp; The amount of frequency shift is proportional to the speed.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Now if you remember your music theory, when you mix two waves of slightly different frequencies together, you get a signal with both frequencies as well as a "&lt;a href="http://hyperphysics.phy-astr.gsu.edu/hbase/sound/beat.html"&gt;beat&lt;/a&gt;". The frequency of the beat is the frequency difference between the signals.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Taking advantage of this, the Mattel gun combines the signal it sends and the signal it receives to get the resultant signal, filters out the microwave signals and is left with the beat signal.&amp;nbsp; Get the frequency of the beat signal and&amp;nbsp;it's some &lt;a href="http://en.wikipedia.org/wiki/Doppler_effect#General"&gt;simple math&lt;/a&gt; to get the velocity of the object.&lt;/p&gt; &lt;p&gt;All this for $30 retail.&lt;/p&gt; &lt;p&gt;Now, notice that the gun doesn't give you position.&amp;nbsp;Radar systems figure out how far the target is away by measuring how long it takes for the signal to reach the target and come back. To do this, they send a pulse and wait for the return and then time the return.&amp;nbsp; The Mattel gun sends a continuous signal rather than a pulse so it has no way of measuring time of flight.&amp;nbsp; That processing would probably also cost a bit more to implement.&lt;/p&gt; &lt;p&gt;Why did I even bother to read this article?&amp;nbsp; Well, I'm seeing some of our customers testing radar systems by simulating return pulses with hardware such as the &lt;a href="http://sine.ni.com/nips/cds/view/p/lang/en/nid/13566"&gt;R-series plug in boards&lt;/a&gt; or our &lt;a href="http://sine.ni.com/nips/cds/view/p/lang/en/nid/13491"&gt;Vector Signal Generators&lt;/a&gt; and wanted to know a little more about what they were really doing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-7716973106444787069?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/7716973106444787069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=7716973106444787069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/7716973106444787069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/7716973106444787069'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/07/physics-of-radar-system.html' title='Physics of a Radar System'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-6270176260615158338</id><published>2007-07-23T19:46:00.001-07:00</published><updated>2007-07-23T19:46:11.034-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareDefinedRadio'/><category scheme='http://www.blogger.com/atom/ns#' term='Hardware Test'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware in the loop'/><category scheme='http://www.blogger.com/atom/ns#' term='LabVIEW'/><title type='text'>Streaming Processing</title><content type='html'>&lt;p&gt;A device such as a digital oscilloscope uses a high speed a/d converter to acquire the desired signal for some very short duration of time at a very high sampling rate, this acquired data is then transferred through a signal processing engine that may perform some sort of analysis on the data at that point such as an RMS calculation, and then&amp;nbsp;the data is&amp;nbsp;transferred to the main display engine for more math (such as calculating a cursor value) and finally displayed on the screen. So the flow is simple, acquire the data, analyze it to make the measurement, and present the result to the user. For 20 years, NI has used the phrase "acquire, analyze, present" to describe &lt;a href="http://en.wikipedia.org/wiki/Virtual_instrumentation"&gt;virtual instrumentation&lt;/a&gt;. A&amp;nbsp;virtual instrumentation system allowed you to create that oscilloscope yourself out of a PC, a digitizer, and LabVIEW and allowed you to write your own measurement.&lt;/p&gt; &lt;p&gt;However, the phrase "acquire, analyze, present" may misleadingly imply that the phases are discrete when in fact they can be continuous. Why might this be continuous? One example is the processing to perform a trigger. If a scope is going to trigger when the signal exceeds a voltage level, acquisition and analysis must run continuously to digitize the signal and perform some very simple math (comparison) to look for the threshold to be met. &lt;/p&gt; &lt;p&gt;As with all engineering problems, the devil is taking the simple concept and applying it to a need that our customers have.&amp;nbsp; Creating that trigger is subject to two fundamental limitations: the speed at which the trigger criteria can be evaluated and the rate at which the data can be sent from the a/d unit to the trigger computation circuitry.&amp;nbsp;Triggering&amp;nbsp;is typically a hardware operation because it needs to run at a megasample or gigasample rate and it is performed "close" to the&amp;nbsp;a/d converter&amp;nbsp;to handle the&amp;nbsp;data rate of hundreds of megabytes or multiple gigabytes per second being generated.&lt;/p&gt; &lt;p&gt;The march of technology provides some interesting opportunities on the horizon that have been alluded to in past posts. The architecture of a &lt;a href="http://ideasinwiring.blogspot.com/2007/01/whats-software-defined-radio.html"&gt;software defined radio&lt;/a&gt;&amp;nbsp;(SDR) and an oscilloscope are not that different. The FPGA technology and wideband A/D technology driving SDR is beneficial in T&amp;amp;M applications. The biggest&amp;nbsp;difference is the audience. Whereas the SDR design team consists of C and VHDL programmers working for 12 months on a highly specified design in a high process development environment, the T&amp;amp;M system design team is a few people who know LabVIEW trying to keep up with the changing specs being thrown over the wall and trying to avoid the end product being late&amp;nbsp;even when&amp;nbsp;the design team is late.&lt;/p&gt; &lt;p&gt;The next generation of test equipment will be leveraging the technological power available in the SDR architecture but the ease of use you expect from a T&amp;amp;M instrument to get those difficult measurements made.&amp;nbsp; Imagine the possibilities:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Write your own math computation for that trigger, compile it, and have it run at the full rate of the hardware.&lt;/li&gt; &lt;li&gt;Perform calculations on the data at full speed.&amp;nbsp; Need a hundred kilohertz RMS calculation to decode a &lt;a href="http://zone.ni.com/devzone/cda/tut/p/id/4101"&gt;LVDT&lt;/a&gt;? You've got it.&amp;nbsp;Filter or &lt;a href="http://zone.ni.com/devzone/cda/tut/p/id/3293"&gt;demodulate&lt;/a&gt; a 20 MHz communication signal? No problem. &lt;/li&gt; &lt;li&gt;Take that test that you wrote but have part of it run on an FPGA to speed it up.&amp;nbsp; When that's not good enough, take the whole thing and move it down to the FPGA.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;All of these tasks are possible today but some aren't as easy as they could be. The technology is there to accomplish the task, the trick is to expose that power to you.&amp;nbsp; &lt;a href="http://www.ni.com/niweek/"&gt;NIWeek&lt;/a&gt; is coming up in just over two weeks. I look forward to discussing the possibilities with you there.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-6270176260615158338?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/6270176260615158338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=6270176260615158338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/6270176260615158338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/6270176260615158338'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/07/streaming-processing.html' title='Streaming Processing'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-3616419916746035453</id><published>2007-06-28T19:12:00.000-07:00</published><updated>2007-06-28T19:44:35.476-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ParallelProgramming'/><category scheme='http://www.blogger.com/atom/ns#' term='Supercomputing'/><category scheme='http://www.blogger.com/atom/ns#' term='LabVIEW'/><title type='text'>University of Maryland's PRAM Computer</title><content type='html'>In breathless language, the University of Maryland announced &lt;a href="http://www.eng.umd.edu/media/pressreleases/pr062607_supercomputer.html"&gt;"New Era of "Desktop Supercomputing" Made Possible &lt;br /&gt;with Parallel Processing Power on a Single Chip"&lt;/a&gt;. If you read the article, you will find no hint of substance whatsoever about why this is so revolutionary and that's a shame because they might actually have something.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.umiacs.umd.edu/users/vishkin/XMT/spaa07paper.pdf"&gt;presentation they made&lt;/a&gt; at the Symposium on Parallelism in Algorithms and Architectures is similarly light on detail except for one term I was unfamiliar with so I googled it, a &lt;a href="http://www.google.com/search?hl=en&amp;q=pram+machine&amp;btnG=Google+Search"&gt;"PRAM Machine"&lt;/a&gt;.  This machine appears to be a simple (but ill-documented) concept&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;(&lt;a href="http://www.wellesley.edu/CS/courses/CS331/notes/notes_models.pdf"&gt;From Wellesley CS331 Notes&lt;/a&gt;)&lt;br /&gt;A PRAM uses p identical processors ... and [is] able to perform the usual computation of [a typical processor] that is equipped &lt;br /&gt;with a finite amount of local memory. The processors communicate through some shared global memory to which all are connected. The shared memory contains a finite number of memory cells. There is a global clock that sets the pace of the machine executon. In one time-unit period each processor can perform, if so wishes, any or all of the following three &lt;br /&gt;steps: &lt;br /&gt;1. Read from a memory location, global or local; &lt;br /&gt;2. Execute a single RAM operation, and &lt;br /&gt;3. Write to a memory location, global or local.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So really, the only difference between it and a multicore Pentium is that there are probably more than 4 CPUs and that all of the CPUs share a global clock. Interesting but I think the better question is - why did they build it?&lt;br /&gt;&lt;br /&gt;It looks like there's a whole set of theory that goes into how to extract parallelism out of algorithms and a PRAM execution model &lt;a href="http://www.cs.cmu.edu/~scandal/cacm/cacm2.html"&gt;allows the task to be expressed simply&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;For example, suppose you wanted to increment the contents of every element of an array by 1.  This type of machine would simply have every processor load one element, increment it, and store it back. If you had the same number of processors as array elements, that operation would take place in exactly one time unit.  Perfect parallelization.  That particular operation is also found in &lt;a href="http://arstechnica.com/articles/paedia/cpu/simd.ars"&gt;"SIMD" machines&lt;/a&gt;. Again, the importance is not that a PRAM can implement this operation, it's because there have been languages developed that allow all of this business of scheduling all of the instructions across processors to be abstracted from the programmer.&lt;br /&gt;&lt;br /&gt;Interestingly, it looks like we could use these same concepts to schedule LabVIEW code without having to change the diagram at all.  Hmm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-3616419916746035453?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/3616419916746035453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=3616419916746035453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3616419916746035453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3616419916746035453'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/06/university-of-marylands-pram-computer.html' title='University of Maryland&apos;s PRAM Computer'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-3636704178161282926</id><published>2007-06-19T15:18:00.001-07:00</published><updated>2007-06-19T15:18:07.270-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='LabVIEW'/><category scheme='http://www.blogger.com/atom/ns#' term='CodingStyle'/><title type='text'>Reasons for personal source code control</title><content type='html'>&lt;p&gt;In Jim Kring's &lt;a href="http://feeds.feedburner.com/~r/ThinkingInG/~3/125506116/"&gt;top 5 bad excuses for not using source code control&lt;/a&gt; post, someone commented&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Perhaps another top five is needed - “reasons a single LabVIEW developer should use scc software” - then we could decide for ourselves how our manual methods stack up.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;So here's my top 5&lt;/p&gt; &lt;p&gt;1. It forces you to document what you changed&lt;/p&gt; &lt;p&gt;Each time I &lt;a href="http://www.perforce.com/perforce/doc.052/manuals/cmdref/submit.html"&gt;check in&lt;/a&gt;/&lt;a href="http://svnbook.red-bean.com/en/1.1/re06.html"&gt;commit&lt;/a&gt; a set of VIs, the SCC program (+ LabVIEW if I enable it) asks me to describe my changes.&amp;nbsp; It's invaluable to have a running history of the changes you made to your code, both what you said you changed and&amp;nbsp;what VIs actually were different. Here's an example from one of my personal projects&lt;/p&gt; &lt;ul&gt; &lt;li&gt;#1 - "Initial version"&lt;/li&gt; &lt;li&gt;#2 - "Fixed link to Open URL in Browser. It isn't in vi.lib so the paths get all messed up as soon as you move this llb somewhere else"&lt;/li&gt; &lt;li&gt;#3 - "Changed name of LLB and help directory. Added quoting to the URL sent to OpenURL"&lt;/li&gt; &lt;li&gt;#4 - "Added flashing of dots on refresh. Enhanced the help slightly. Will add to the help in the next changelist"&lt;/li&gt; &lt;li&gt;#5 - "Added examples and 2 more pictures to the docs"&lt;/li&gt; &lt;li&gt;#6 - "Completed help and examples - pre final review"&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;That code was written in November 2001 and by looking at that brief history, it takes me back through what I was doing.&lt;/p&gt; &lt;p&gt;2. It tracks code in multiple areas with ease&lt;/p&gt; &lt;p&gt;Code&amp;nbsp;that&amp;nbsp;spans multiple folder hierarchies on disk can be a problem for the "make a copy as a backup" technique.&amp;nbsp; Good source code management systems can track code spread across your disk.&amp;nbsp; Did you put code in user.lib and in your documents &amp;amp; settings area? No problem. As soon as you have code in more than one directory, I question how meticulous you will be about copying "everything".&amp;nbsp; Instead, you'll start getting lazy which takes us to #3.&lt;/p&gt; &lt;p&gt;3. You can always revert to a good (or at least known) state&lt;/p&gt; &lt;p&gt;If something goes horribly wrong, I do a "save" rather than "save as..." and nuke a VI, I can always recover to something known.&amp;nbsp; It can be accomplished in 3 mouse clicks rather than searching around on the hard drive.&amp;nbsp; For SCM systems that are "changelist" based (such as CVS, Subversion, and Perforce), you can pull from a particular known good state.&amp;nbsp; "Give me what I submitted on 5/21/2007" and you know those VIs actually work together. That's why one of the "good scm practices" is to put EVERYTHING that could change under SCM.&amp;nbsp; &lt;/p&gt; &lt;p&gt;4. You can get everything back 6 months from now&lt;/p&gt; &lt;p&gt;This is another version of #2 &amp;amp; #3. Suppose your nifty user.lib extension changes 4 months from now.&amp;nbsp; Can you rebuild your nice little utility that used an older version?&amp;nbsp; Do you even have that older version of the extension any more?&amp;nbsp; Keep everything that could change under SCM, including the OpenG tools that you get from Jim and you can always roll your environment back to the way it was 6 months ago and have a clean rebuild.&amp;nbsp; We put our C++ compiler&amp;nbsp;under SCM here at NI so if we need to rebuild LabVIEW 8.0.1 for some reason, we can make sure we are using the exact same build environment as when we first built it.&lt;/p&gt; &lt;p&gt;5. Allows you to track your components&lt;/p&gt; &lt;p&gt;You got those nifty OpenG tools and you (gasp) modified a VI!&amp;nbsp; How do you keep track of those changes?&amp;nbsp; What happens when they upgrade those components? How do you make sure you go re-modify the source with your changes? Manual record-keeping is not your friend here.&lt;/p&gt; &lt;p&gt;6. More disk efficient&lt;/p&gt; &lt;p&gt;Maybe in this age of big hard drives, this isn't an issue.&amp;nbsp; But how many times are you going to make a duplicate of a 30 meg folder hierarchy because you changed one VI.&amp;nbsp; Do you stop and say "maybe not, I'll do it later". That goes through my head.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-3636704178161282926?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/3636704178161282926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=3636704178161282926' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3636704178161282926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3636704178161282926'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/06/reasons-for-personal-source-code.html' title='Reasons for personal source code control'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-3470724574854597787</id><published>2007-06-13T10:16:00.001-07:00</published><updated>2007-06-13T10:16:34.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Graphical Tools'/><title type='text'>Hear me on a TechOnline roundtable with respected experts</title><content type='html'>&lt;p&gt;Embedded systems are getting more complicated and harder to program. What can be done about it? You can come hear a panel of experts (+ me) &lt;a href="http://seminar2.techonline.com/registration/distrib.cgi?s=1095&amp;amp;d=1032"&gt;talk about the challenges&lt;/a&gt; of embedded systems programming and a risk of programmer shortage in the future.&lt;/p&gt; &lt;p&gt;The round table participants are all current or former editors of &lt;a href="http://www.embedded.com/"&gt;Embedded Systems Design magazine&lt;/a&gt;&amp;nbsp;and are folks I've read for a long time.&amp;nbsp; I've been reading &lt;a href="http://www.embedded.com/columns/ep/"&gt;Jack Ganssle's column&lt;/a&gt; since 1994 when I was at Motorola Semiconductor and &lt;a href="http://www.embedded.com/columns/pp/"&gt;Dan Saks's articles&lt;/a&gt; when I was still programming in C++ on LabVIEW so it's neat to share the virtual stage with them.&lt;/p&gt; &lt;p&gt;This web-cast came about because the current editor in chief of Embedded Systems Design magazine, Rich Nash, wrote an article postulating that there was an &lt;a href="http://www.embedded.com/showArticle.jhtml?articleID=199202706"&gt;emerging coding crisis&lt;/a&gt;. It generated more letters to the editor than anything else he had done. You can see them in the online comments to the article as well as a &lt;a href="http://www.embedded.com/showArticle.jhtml?articleID=199601573"&gt;follow up reader response article&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;So, if you're not going to be busy on June 19th, please &lt;a href="http://seminar2.techonline.com/registration/distrib.cgi?s=1095&amp;amp;d=1032 "&gt;sign up and listen in&lt;/a&gt;. There will be a Q&amp;amp;A section at the end if you want to ask follow-ups or you can post questions to me here if you want.&lt;/p&gt; &lt;p&gt;There are some trends I'm especially interested in discussing such as high level programming tool adoption, &lt;a href="http://ideasinwiring.blogspot.com/2005/06/end-of-free-lunch.html"&gt;difficulties programming multicore processors&lt;/a&gt;, and how &lt;a href="http://ideasinwiring.blogspot.com/2006/03/how-does-data-flow-execution-work.html"&gt;FPGAs might change things&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-3470724574854597787?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/3470724574854597787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=3470724574854597787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3470724574854597787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3470724574854597787'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/06/hear-me-on-techonline-roundtable-with.html' title='Hear me on a TechOnline roundtable with respected experts'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-3279891982653905845</id><published>2007-05-10T08:32:00.000-07:00</published><updated>2007-06-13T10:49:49.600-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LabVIEW'/><title type='text'>Code Reviews</title><content type='html'>A recent post on Embedded.com about &lt;a href="http://www.embedded.com/showArticle.jhtml?articleID=199204097"&gt;Peer Code Reviews&lt;/a&gt; got me thinking about the process we use in the LabVIEW team for checking in code. It came about many many years ago and is, in my opinion, the most effective process I've seen.  We call it "buddying", but a lightweight peer code review is probably the technical term.  &lt;br /&gt;&lt;br /&gt;It can be summarized quickly as: No code gets checked into the main branch unless the changes have been reviewed by a second person.&lt;br /&gt;&lt;br /&gt;The practical process is&lt;br /&gt;1) The programmer makes the code changes.  These changes may be checked in to a private branch in source control or may be just sitting on his/her hard drive. &lt;br /&gt;2) If the changes are in the 100-line or fewer area (which is a majority of submissions), the programmer goes and "gets a buddy".  The buddy is typically a senior level programmer who is already familiar with that code area but that's not a hard rule.&lt;br /&gt;3) The author walks through each line of the changes with the buddy and explains the changes.  The buddy points out any stylistic problems, double checks for off-by-zero or null pointer handling code, and reminds the author about any gotchas that may be in that area.&lt;br /&gt;4) If the buddy is satisfied with the code, it gets checked in to the source code control system and the author &amp; buddy's names are noted.  &lt;br /&gt;&lt;br /&gt;That's it.  It adds about 10 minutes to each code submission and keeps a lot of "doh!" errors out of the code.  If you don't have a system like this now, I recommend you try it.  We find it invaluable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-3279891982653905845?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/3279891982653905845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=3279891982653905845' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3279891982653905845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/3279891982653905845'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/05/code-reviews.html' title='Code Reviews'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-5653389119985153758</id><published>2007-04-26T11:15:00.000-07:00</published><updated>2007-04-26T11:16:54.929-07:00</updated><title type='text'>Manipulating Data Files</title><content type='html'>&lt;p&gt;Jim Kring posted techniques in his blog&amp;nbsp;future-proofing data files by adding schema and version information to the file.&amp;nbsp;Over the years, we’ve &lt;a href="http://ideasinwiring.blogspot.com/2005/11/storing-and-retrieving-data.html"&gt;added some file formats to LabVIEW&lt;/a&gt; that make it hard for customers to follow his rules and that can cause problems. &lt;br /&gt;&lt;p&gt;I’ve seen folks hang themselves with the &lt;a href="http://www.kip.uni-heidelberg.de/fp-computer/LabVIEW/FP_LabView/html/Writing_Datalog_Files.html"&gt;Datalog file&lt;/a&gt; by writing a file with one particular type definition (i.e. cluster) and then can’t read the file any more when they change clusters without understanding it will affect backward compatibility.&lt;br /&gt;&lt;p&gt;The newer file formats in LabVIEW like &lt;a href="http://zone.ni.com/devzone/cda/tut/p/id/3542"&gt;.TDM datalog files&lt;/a&gt;&amp;nbsp;are much more maintainable because they store the type definition (typically called a ’schema’) in the data file so you can’t lose it and so it can be browsed by an external application. &lt;br /&gt;&lt;br /&gt;&lt;small&gt;Technorati tags: &lt;a href="http://technorati.com/tags/LabVIEW" rel="tag"&gt;LabVIEW&lt;/a&gt;, &lt;a href="http://technorati.com/tags/DataStorage" rel="tag"&gt;DataStorage&lt;/a&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-5653389119985153758?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/5653389119985153758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=5653389119985153758' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/5653389119985153758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/5653389119985153758'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/04/manipulating-data-files.html' title='Manipulating Data Files'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-2854002662963244153</id><published>2007-04-25T11:42:00.000-07:00</published><updated>2007-06-13T10:50:27.839-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LabVIEW'/><category scheme='http://www.blogger.com/atom/ns#' term='CodingStyle'/><title type='text'>Writing Stylish Code</title><content type='html'>&lt;p&gt;Working on a codebase that is authored by a lot of people has given me a new appreciation for writing consistently styled code.&amp;nbsp; Even having 10 programmers all writing in a different way makes it hard to go in and modify or fix code written by someone else.&amp;nbsp; In the C/C++ community, there are constant wars &lt;a href="http://www.jwz.org/doc/tabs-vs-spaces.html"&gt;about indention&lt;/a&gt; or &lt;a href="http://blogs.msdn.com/ericlippert/archive/2003/09/12/52989.aspx"&gt;variable naming&lt;/a&gt;. In the end, it's not really important which convention you pick, it's more important that you pick one and stick to it.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;LabVIEW is no different and it may be a bit more difficult because we give you 2 dimensions (X and Y) in which to place your code rather than just one.&amp;nbsp; I just saw an announcement for a new LabVIEW book and thought I'd pass it along.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.bloomy.com/lvstyle/"&gt;The LabVIEW Style Book - Peter A Blume&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Best-Practice Style Rules and Standards for Developing Quality LabVIEW Software&lt;/strong&gt;&lt;br&gt;Drawing on the experiences of a world-class LabVIEW development organization, The LabVIEW Style Book is the definitive guide to best practices in LabVIEW development. &lt;br&gt;Leading LabVIEW development manager Peter A. Blume presents practical guidelines or "rules" for optimizing every facet of your applications: ease of use, efficiency, readability, simplicity, performance, maintainability, and robustness. Blume explains each style rule thoroughly, presenting realistic examples and illustrations. He even presents "nonconforming" examples that show what not to do-and why not. &lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;I like that he mentions a tool that we release and use internally for our own G code reviews&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;Code reviews: Enforcing a style convention using a checklist, the LabVIEW VI Analyzer Toolkit, and peer reviews&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Check it out.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;div class="wlWriterEditableSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:05a8c89b-51ac-405c-854c-2c3effb95807" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/LabVIEW" rel="tag"&gt;LabVIEW&lt;/a&gt;, &lt;a href="http://technorati.com/tags/CodingStyle" rel="tag"&gt;CodingStyle&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://technorati.com/tag/CodingStyle" rel="tag"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-2854002662963244153?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/2854002662963244153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=2854002662963244153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/2854002662963244153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/2854002662963244153'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/04/writing-stylish-code.html' title='Writing Stylish Code'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-5469588381920064577</id><published>2007-02-15T09:00:00.000-08:00</published><updated>2007-02-15T09:11:32.922-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareDefinedRadio'/><category scheme='http://www.blogger.com/atom/ns#' term='Hardware Test'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware in the loop'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Test'/><title type='text'>Tracing Software During Hardware Test</title><content type='html'>In my &lt;a href="http://ideasinwiring.blogspot.com/2007/02/testing-software-radios.html"&gt;last post&lt;/a&gt;, I mentioned a need to find software faults in microprocessor-controlled embedded systems. Since I'm a software guy, I'm curious about this angle and started doing some reasearch.&lt;br /&gt;&lt;br /&gt;1) The faults that were mentioned (timing, memory leaks, crashes) are basically software domain problems but they may only be triggered by certain I/O inputs the system receives (and the sw ends up dealing with).  So, it looks like the main tools to diagnose the fault will need to be ones that deal with the software domain but the system may need to be driven from the hardware I/O domain.&lt;br /&gt;&lt;br /&gt;2) These challenges are similar to those found in other applications that use microprocessor-driven control systems.  For example, NI makes hardware that can be used for real-time process control (such as controlling valves in a paper mill).  The controllers need to run 24x7, just like a radio, and the entire system is controlled by the microprocessor.  NI needs to make those controllers robust and therefore we need to test them extensively.&lt;br /&gt;&lt;br /&gt;3) The automotive industry also uses microprocessor-based high speed control systems, especially to control the "powertrain" (engine &amp; transmission).  They use a technique called &lt;a href="http://www.embedded.com/story/OEG20011129S0054"&gt;Hardware in the loop testing&lt;/a&gt;.  The real controller (ECM) that is to be mounted in the car is hooked to a "simulator".  The ECM sends out real output signals using a real wiring harness to the simulator, the simulator then looks at the outputs from the ECM and calculates what the real engine would do and then sends signals back to the ECM that make it think it is talking to a real engine.  You then "drive" the ECM as if you were driving the car through various scenarios and the simulator checks to make sure all of the outputs from the ECM are valid.  At the same time as the simulator is running, they monitor the software running on the ECM to verify that it is operating properly.  If the ECM crashes, they have tools to tell them what happened in the software.  It would seem like you could do exactly the same thing with software defined radio test.&lt;br /&gt;&lt;br /&gt;4) In the auto industry, they typically don't have an OS and they do the tracing at a low level.  In the old days, this was done with a chip emulator. The emulator (or logic analyzer) would snoop the address and data bus to monitor execution.  Now that caches are so prevalent, the external bus is not a good place to monitor. Chips that Freescale makes for automotive such as the MPC565 have a port called &lt;a href="http://www.ashling.com/technicalarticles/APB179-NexusBooklet.pdf"&gt;NEXUS&lt;/a&gt;.  This port works in conjunction with information coming out on the address/data bus to spit out information while the processor is running that gives visibility into the processor pipeline. You can tell that a branch was taken, not taken, etc.. even if the instruction stream is all in the cache.  There are boxes such as the &lt;a href="http://www.lauterbach.com/frames.html?nexlist.html"&gt;Lauterbach ICD Trace&lt;/a&gt; that hook up to the chip for this purpose. Their tools can then show the full execution history, what led up to the processor crash, etc.  &lt;a href="http://www.windriver.com/products/OCD/wind_river_trace/"&gt;WindRiver&lt;/a&gt;, &lt;a href="http://www.ghs.com/products/timemachine.html"&gt;GreenHills&lt;/a&gt;, and other emulator vendors also have this capability.&lt;br /&gt;&lt;br /&gt;It would seem like this concept could be applied to Software Defined Radio.  A Radio Emulator could drive the radio under test while the radio is being monitored with a tool like this. In the automotive case, I don't know how much this trace data ends up getting synchronized to the operation of the HIL emulator.  It might be critical to share control or timing information between the radio emulator and the trace tool so that you can correlate the waveform signals precisely to the line of code being executed.  This is where I think LabVIEW would come in.  HIL simulators provided by &lt;a href="http://www.ni.com/labview/test/hil_test.htm"&gt;NI partners&lt;/a&gt; use LabVIEW as their base and are open to be modified by the end user. LabVIEW has the ability  to work with other software tools via ActiveX and other interfaces. It should be relatively easy to get LabVIEW to control both the HIL simulator and the trace tool.&lt;br /&gt;&lt;br /&gt;5) Since SDRs typically run high function OSes like GreenHills Integrity or WindRiver VxWorks, there are some additional tools that would be useful during debug. WindRiver has a tool called &lt;a href="http://linuxdevices.com/news/NS8955223434.html"&gt;MemScope&lt;/a&gt; that will monitor the heap so you can see memory leaks.  LabVIEW could control this tool also.  GreenHills &lt;a href="http://www.ghs.com/SlashMemoryUsage.html"&gt;has a leak checker&lt;/a&gt; but I haven't had any luck finding out more details on what it does. &lt;br /&gt;&lt;br /&gt;I'm looking into setting up this type of system in our lab.  We have a reliability lab here for testing our real time controllers and we're looking at adding a tool like MemScope (since we use VxWorks in our controllers) to our testing arsenal. We may add on a trace tool as the next step after that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-5469588381920064577?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/5469588381920064577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=5469588381920064577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/5469588381920064577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/5469588381920064577'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/02/tracing-software-during-hardware-test.html' title='Tracing Software During Hardware Test'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-1360286227047026408</id><published>2007-02-06T13:27:00.000-08:00</published><updated>2007-02-06T13:44:53.995-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareDefinedRadio'/><category scheme='http://www.blogger.com/atom/ns#' term='JTRS'/><category scheme='http://www.blogger.com/atom/ns#' term='SNMP'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Test'/><title type='text'>Testing Software Radios</title><content type='html'>In my visit to the SDR Forum Test Workshop, I observed something interesting.  The presentations given by instrumentation vendors focused on verifying the analog and digital performance of the RF subsystem. These vendors all have very nice equipment, such as spectrum analyzers, to do this testing.&lt;br /&gt;&lt;br /&gt;However, some of the questions from the audience during the round-table discussion asked about issues that had nothing to do with the RF subsystem.  Those questions were about frustrations in testing the software in a software-based electronic system.  One question was on how to get a PC to talk to the radio over the Ethernet interface. JTRS radios are typically controlled via SNMP and a user was looking for a toolkit (&lt;a href="http://www.snmptoolkit.com/"&gt;I found one here&lt;/a&gt;) to talk to their radio.&lt;br /&gt;&lt;br /&gt;Two other attendees needed to trace a device failure to a software condition such as a stack overflow or a priority inversion, both software bugs that expose themselves as if they are hardware failures.  The worst part about these bugs is that they are typically hard to reproduce and can take a long time to track down.  This makes them expensive to track down because in test, time is money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-1360286227047026408?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/1360286227047026408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=1360286227047026408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/1360286227047026408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/1360286227047026408'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/02/testing-software-radios.html' title='Testing Software Radios'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-6782621355879829639</id><published>2007-01-17T16:27:00.000-08:00</published><updated>2007-02-06T13:44:27.401-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SoftwareDefinedRadio'/><category scheme='http://www.blogger.com/atom/ns#' term='Test'/><category scheme='http://www.blogger.com/atom/ns#' term='JTRS'/><category scheme='http://www.blogger.com/atom/ns#' term='Modem'/><title type='text'>What's A Software Defined Radio?</title><content type='html'>RF Test is one of the largest areas of the test market. Somewhere around 1/3rd of all test equipment purchases are for RF test. I've been looking into this market for the past 6 months or so to see we need to be doing in LabVIEW (Desktop, RT, Embedded, FPGA) to better serve people testing RF with the NI platform.&lt;br /&gt;&lt;br /&gt;One interesting area of RF development is in &lt;a href="http://en.wikipedia.org/wiki/Software_radio"&gt;"Software Defined Radio"&lt;/a&gt;. The term is most specifically applied to the &lt;a href="http://enterprise.spawar.navy.mil/body.cfm?type=c&amp;category=27&amp;subcat=60"&gt;JTRS&lt;/a&gt; (Joint Tactical Radio System) program in the military but really applies to the way in which radio design is changing. Historically, radios were implemented in "hardware": either in chips from various silicon vendors or in discrete components on a board. You may have bought a science kit when you were 10 to make an AM radio that consisted of a transistor or vacuum tube and some other electronic components. &lt;br /&gt;&lt;br /&gt;The design of radios is changing. The first migration was moving the signal manipulations that used to take place in the analog domain to the digital domain. A &lt;a href="http://electronics.howstuffworks.com/dsl.htm"&gt;DSL modem&lt;/a&gt; has chips inside that use digital signal processing to convert the analog signal that travels down the copper wire into bits that become Ethernet packets.&lt;br /&gt;&lt;br /&gt;The second migration was to perform these signal processing operations in a re-programmable device. When the 33.6 KBit modems came out, they were implemented using "standard" digital signal processors from &lt;a href="http://www.freescale.com/files/dsp/doc/app_note/AN3114.pdf"&gt;Motorola Semiconductor&lt;/a&gt; (now Freescale), &lt;a href="http://www.modemsite.com/56k/rockacf.asp"&gt;Rockwell&lt;/a&gt;, or others. Using a reprogrammable processor allowed the device to support multiple standards or to be upgradeable when new versions of the standard were released. Now, you are seeing the same thing happen with more 'exotic' radios that broadcast in the RF range rather than just ones that transmit over phone lines.  The JTRS program envisions a radio that can run &lt;a href="http://jitc.fhu.disa.mil/jtrs/index.html"&gt;more than 30 different standards&lt;/a&gt; with the same hardware. These radios use a combination of processors and FPGAs to perform the signal processing needed to pull this off. There is still some very complex analog circuitry in the radio to pull this all off but, as some attendees of a conference I just went to noted, "the bits are getting much closer to the antenna".&lt;br /&gt;&lt;br /&gt;&lt;small&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/SoftwareDefinedRadio" rel="tag"&gt;SoftwareDefinedRadio&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Modem" rel="tag"&gt;Modem&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Test" rel="tag"&gt;Test&lt;/a&gt;, &lt;a href="http://technorati.com/tag/JTRS" rel="tag"&gt;JTRS&lt;/a&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-6782621355879829639?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/6782621355879829639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=6782621355879829639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/6782621355879829639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/6782621355879829639'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2007/01/whats-software-defined-radio.html' title='What&apos;s A Software Defined Radio?'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115749821517332803</id><published>2006-09-05T16:16:00.000-07:00</published><updated>2006-09-05T16:19:15.656-07:00</updated><title type='text'>Asynchronous versus Synchronous Nodes</title><content type='html'>Earlier this year, I wrote an entry about &lt;a href="http://ideasinwiring.blogspot.com/2006/03/how-does-data-flow-execution-work.html"&gt;how LabVIEW's data-flow execution semantics works&lt;/a&gt;. There's an additional aspect of parallelism in LabVIEW that I didn't talk about: synchronous versus asynchronous nodes. A LabVIEW diagram that has parallelism in it can still appear to run in parallel on a single processor machine. The &lt;a href="http://ideasinwiring.blogspot.com/2005/05/55ms.html"&gt;55ms ping-pong&lt;/a&gt; was an example of that. Here's another example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6985/26/1600/pingpong.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6985/26/320/pingpong.jpg" alt="" border="0" /&gt;&lt;/a&gt; &lt;p&gt;The top loop will run and update the indicator with the value of the loop counter while waiting for 100ms, and then repeat. The bottom loop will run and update the indicator with the value of the loop counter while waiting for 50ms, and then repeat. &lt;/p&gt; &lt;p&gt;The LabVIEW diagram used cooperative multithreading. LabVIEW itself didn't go to "sleep" when the top loop tried to wait for 100ms.&lt;/p&gt; &lt;p&gt;Instead, LabVIEW would execute the top wait for 100ms by setting a timer to go off in 100ms. Then, it would look for other parts of the diagram that could still run (like the bottom loop) and run it until that 100ms timer alarmed. When the timer went off, LabVIEW would take control back and finish executing the top diagram. The wait node was called "asynchronous" because it would let the execution system continue even though an operation (the wait) wasn't finished yet. &lt;/p&gt; &lt;p&gt;Well, operating systems have grown up and now we can spawn &lt;a href="http://en.wikipedia.org/wiki/Thread_%28computer_science%29"&gt;"threads"&lt;/a&gt;. Rather than having the LabVIEW execution system use just one thread, we could allow it to use multiple threads. So when LabVIEW tried to execute a node that did block the execution system (we call those, "synchronous"), there might be another OS thread available to get work done. &lt;/p&gt; &lt;p&gt;You may see this when you call some C code that uses the "sleep()" call. The DLL doesn't return so the current thread is blocked but the CPU should be free to do other things. Since LabVIEW has other threads available to it, it will keep executing in the other threads.&lt;/p&gt; &lt;p&gt;So why continue to have asynchronous nodes at all? If you put 500 wait nodes on the diagram, we would in theory have to allocate 500 threads. Operating systems don't like that very much so we don't do that. Instead, we keep the old cooperative multitasking system but augment it by &lt;a href="http://digital.ni.com/public.nsf/websearch/84ECA015AA496B23862565BC006C0F19?OpenDocument"&gt;having each diagram use 4 threads&lt;/a&gt;. This gives LabVIEW the ability to work with external code that blocks and still have efficient execution for primtives LabVIEW knows about.&lt;/p&gt; &lt;p&gt;Why talk about all of this? Because sometimes we expose this to you and ask you to pick. The VISA read and VISA write nodes expose a property that let you decide whether they are synchronous or not. We even wrote &lt;a href="http://digital.ni.com/public.nsf/allkb/ECCAC3C8B9A2A31186256F0B005EEEF7"&gt;an appnote on it&lt;/a&gt;. But, you can't read the appnote without understanding the stuff above, otherwise you'll think that asynchronous means that the node itself will return early. It won't. The setting only affects how LabVIEW internally chooses to execute the node. So why would you pick? In the words of one of our very experienced LabVIEW developers:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Frequently, VISA is used for serial I/O. If you know the instrument has data ready (e.g., you just asked for the number of bytes waiting to be read), a synchronous read will be much faster, since it won't use LabVIEW's execution scheduling mechanisms to poll the I/O.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;There you have it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115749821517332803?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115749821517332803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115749821517332803' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115749821517332803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115749821517332803'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/09/asynchronous-versus-synchronous-nodes.html' title='Asynchronous versus Synchronous Nodes'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115627572646761920</id><published>2006-08-22T12:42:00.000-07:00</published><updated>2006-08-22T12:43:53.870-07:00</updated><title type='text'>Dr. T's Identity Management Method</title><content type='html'>&lt;p&gt;I've never seen it written down before, but this article from Joel on Software, "&lt;a href="http://www.joelonsoftware.com/items/2006/08/10.html"&gt;The Identity Management Method&lt;/a&gt;" really captures what it means to work at NI.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Joel says:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;To be an Identity Method manager, you have to summon all the social skills you have to make your employees identify with the goals of the organization, so that they are highly motivated, then you need to give them the information they need to steer in the right direction.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Those of you who came to NIWeek probably heard &lt;a href="http://www.ni.com/niweek/keynote_videos.htm"&gt;Dr. T's keynote&lt;/a&gt;. Every year, he lays out for our customers where he thinks NI is going.&amp;nbsp; Well, he doesn't just do that at the keynote. He does that pretty much every day.&amp;nbsp; No matter who he's talking to and no matter what the audience, he explains his vision. Sometimes, its the very technical roadmap of the future and sometimes it's the more personal view of the various stakeholders in NI (the employees, our suppliers, our shareholders, our customers). "Sharing the vision" is &lt;a href="http://www.ni.com/anniversary/culture.htm"&gt;an important part of our culture&lt;/a&gt;. It's nice to see a third party validation of it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115627572646761920?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115627572646761920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115627572646761920' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115627572646761920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115627572646761920'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/08/dr-ts-identity-management-method.html' title='Dr. T&apos;s Identity Management Method'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115592399756698866</id><published>2006-08-18T10:59:00.000-07:00</published><updated>2006-08-18T11:08:46.443-07:00</updated><title type='text'>Well I said I wanted feedback...</title><content type='html'>&lt;p&gt;So now I know what it's like to be a musician, having to see a review of one of your performances broadcast widely for the whole city/state/world to see.&amp;nbsp; I got mentioned in a Design News &lt;a href="http://www.designnews.com/article/CA6363430.html?nid=2332&amp;amp;rid=1072503902"&gt;article about podcasts&lt;/a&gt;. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;The first podcast, titled “&lt;a href="http://www.ni.com/podcast/"&gt;What is Embedded&lt;/a&gt;?” was produced by National Instruments. It featured an interview with Joel Sumner of the LabVIEW Embedded Group. Overall I think the 16:58 minute interview fulfilled its promise, but I found my attention straying at times. Conversely, I found Sumner giving short shrift to some of the more potentially interesting topics.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The title of the post was even worse: "Listen to This Boring Podcast".&amp;nbsp; Ouch.&amp;nbsp;The other podcast she reviewed in the article (from another company) also got panned so at least I'm not alone.&lt;/p&gt; &lt;p&gt;Oh well, that was the first one I had ever done and it was part of the first 4 NI had ever done. I guess I/we have a bit of learning to do before we're the NPR of the T&amp;amp;M podcast world.&lt;/p&gt; &lt;p&gt;So, give it to me straight guys, did it suck?&amp;nbsp; Too long? Right level of detail?&amp;nbsp; Wrong level of detail?&amp;nbsp; We've got a tremendous amount of knowledge locked up in these walls and we're willing to share, we just don't want to put you to sleep.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/Podcast" rel="tag"&gt;Podcast&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115592399756698866?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115592399756698866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115592399756698866' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115592399756698866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115592399756698866'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/08/well-i-said-i-wanted-feedback.html' title='Well I said I wanted feedback...'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115582291817801511</id><published>2006-08-17T06:55:00.000-07:00</published><updated>2006-08-18T11:09:24.410-07:00</updated><title type='text'>NIWeek Recap</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;NIWeek is over. Ok, it ended a whole week ago but I haven't made it to the end of my "to do list" so it won't really be over for another week or two. Last year, my team's big project, LV Embedded, launched to great fanfare.&amp;nbsp; This year, another project that I was involved with, the Lego NXT, made it's NIWeek splash. I can't tell you how cool it is to see something you&amp;nbsp;worked on sitting on the shelves of Best Buy or Frys.&amp;nbsp; &lt;/p&gt; &lt;p&gt;You can see a picture of some of the main developers of the software at &lt;a href="http://nxtasy.org/2006/08/11/ni-week-trip-report/"&gt;Dick Swan's blog&lt;/a&gt;. He's also got pictures of some custom sensors he's created or run across for the NXT such as&amp;nbsp;a video camera, a Sony Playstation controller, and probes from Vernier. You can see the Lego NXT demo in the &lt;a href="http://www.ni.com/niweek/keynote_videos.htm"&gt;keynote videos&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Brian Tyler did a &lt;a href="http://detritus.blogs.com/niweek/"&gt;video-blog&lt;/a&gt;&amp;nbsp;on the whole NIWeek Experience. I think the most amusing video was an interview with Diya on what it's like to be up on stage in front of 3,000 people doing the keynote.&amp;nbsp; I love the way we throw engineers who actually worked on the products they are demoing up there.&amp;nbsp; It also helps if the demo doesn't quite go as planned...&lt;/p&gt; &lt;p&gt;You have to admit, a DAQ board isn't much of a visual treat. It just sits there like a rock. Not even blinking lights. I think that's caused us to be a bit more creative when it comes to demos. One of the demos this year involved getting a volunteer from the audience to try out a version of the game &lt;a href="http://en.wikipedia.org/wiki/Dance_Dance_Revolution"&gt;"Dance Dance Revolution"&lt;/a&gt; that had been completely reimplemented in NI hardware and reprogrammed in LabVIEW.&amp;nbsp; The designer of the demo is Roger Dickey, a guy who loves DDR and is in the LabVIEW FPGA team.&amp;nbsp; Here's &lt;a href="http://forums.lavag.org/index.php?act=module&amp;amp;module=gallery&amp;amp;cmd=si&amp;amp;img=813"&gt;the video of him competing&lt;/a&gt; with the, ahem, victim. &lt;/p&gt; &lt;p&gt;Finally, to all of the people I pestered at NIWeek, I wanted to say thanks. I know all of us at NI get a lot of satisfaction hearing how our products affect what you do every day. &lt;/p&gt; &lt;p&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/LabVIEW" rel="tag"&gt;LabVIEW&lt;/a&gt;, &lt;a href="http://technorati.com/tag/NIWeek" rel="tag"&gt;NIWeek&lt;/a&gt;, &lt;a href="http://technorati.com/tag/DanceDanceRevolution" rel="tag"&gt;DanceDanceRevolution&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Mindstorms" rel="tag"&gt;Mindstorms&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Lego" rel="tag"&gt;LEGO&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115582291817801511?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115582291817801511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115582291817801511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115582291817801511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115582291817801511'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/08/niweek-recap.html' title='NIWeek Recap'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115582141400100188</id><published>2006-08-17T06:30:00.000-07:00</published><updated>2006-08-17T06:30:14.090-07:00</updated><title type='text'>Traditions and Testing</title><content type='html'>&lt;p&gt;On the LabVIEW team, we love sweet stuff. Heck, all programmers probably do. "The official food of the LabVIEW team" (tm) used to be Oreos but somewhere in the last few years, it became donuts - specifically Krispie Kreme donuts.&amp;nbsp; Every anniversary, birthday, or just for the heck of it yields a "donuts in (some location)" email.&amp;nbsp; A sugar fix is nearly guaranteed every morning.&lt;/p&gt; &lt;p&gt;Another tradition is to do a coding challenge as we enter final testing. LabVIEW is pretty stable at that point and we've gone through the entire testing database a few times. A coding challenge is a good way to make sure everyone is using the product in a "real way" rather than running through some script. We let a developer or group of developers write something, anything they want, in LabVIEW. There are awards given for the program that uses the most new features, coolest, most annoying, etc..&amp;nbsp; I think I won most annoying a few years ago for using the "new" (at the time) Datasocket feature along with the state machine editor to create a distributed music playing program. Every person who loaded the VI could enter some musical notes which would then be played on every other person's machine.&amp;nbsp; Can you say noisy?&amp;nbsp; "Annoying" was an apt title for that one.&lt;/p&gt; &lt;p&gt;Anyway, my favorite entry was from the LabVIEW 8.0 release. A couple folks got together and wrote a client-server application that would not only notify you of any new donuts but also show a map on the floor of where they were sitting and map a route through the cubes to show you the shortest way to get to the donuts. It had a nice installer and ran in the system tray.&amp;nbsp; Of course it was all programmed in LabVIEW.&lt;/p&gt; &lt;p&gt;So, what are you going to build with LabVIEW 8.2?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115582141400100188?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115582141400100188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115582141400100188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115582141400100188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115582141400100188'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/08/traditions-and-testing.html' title='Traditions and Testing'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115445594790234132</id><published>2006-08-01T11:10:00.000-07:00</published><updated>2006-08-01T11:12:27.903-07:00</updated><title type='text'>NIWeek Sessions</title><content type='html'>There are a lot of good NIWeek sessions on LabVIEW Embedded technology.  Here's my cheat-sheet&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;LabVIEW Embedded Birds of a Feather Session - Tuesday 1pm Mezzanine 7 - hosted by me and the LV Embedded engineering team - &lt;span style="font-weight: bold;"&gt;NOTE&lt;/span&gt; - &lt;span style="font-style: italic;"&gt;this is not in the conference program&lt;/span&gt;&lt;br /&gt; &lt;/li&gt;   &lt;li&gt;Hands-On: NI LabVIEW Embedded Module for ADI Blackfin Processors - Tuesday 2:15pm, 4:45pm and Wednesday at 1pm&lt;/li&gt;   &lt;li&gt;Introduction to the LabVIEW Embedded Development Module - Tuesday 2:15pm&lt;/li&gt;   &lt;li&gt;Graphical Design for Multicore Processors - Tuesday 4pm&lt;/li&gt;   &lt;li&gt;Design of the New Handy Board for Robotics - Tuesday 4:45pm&lt;/li&gt;&lt;li&gt;Develop Embedded Systems without Embedded Expertise - Wednesday 3:30pm&lt;/li&gt;   &lt;li&gt;Prototype to Custom Deployment in Hours - Wednesday 4pm&lt;/li&gt;   &lt;li&gt;Developing Optimized LabVIEW Embedded Applications - Thursday 10:30am&lt;/li&gt;   &lt;li&gt;Developing LabVIEW Embedded Applications - Thursday 10:30am&lt;/li&gt;  &lt;/ul&gt;I hope to run into some of you at those sessions.&lt;br /&gt; &lt;ul&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115445594790234132?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115445594790234132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115445594790234132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115445594790234132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115445594790234132'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/08/niweek-sessions.html' title='NIWeek Sessions'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115445582215839113</id><published>2006-08-01T11:09:00.000-07:00</published><updated>2006-08-01T11:15:55.146-07:00</updated><title type='text'>LabVIEW Embedded Chips</title><content type='html'>The LabVIEW Embedded Development Module continues to win awards. A demo with the LabVIEW running on a Freescale ColdFire processor at the &lt;a href="http://www.freescale.com/ftf"&gt;Freescale Technology Forum&lt;/a&gt; won "&lt;a href="http://www.freescale.com/webapp/sps/site/homepage.jsp?nodeId=0525779036"&gt;Best In Class Development Tools&lt;/a&gt;" by a panel of 4 industry folks.  Wow.&lt;br /&gt;&lt;br /&gt;So that brings me to some interesting trivia. I made a list of the various places that the LabVIEW EDM has run on (that I know about). Some are silly, some are amazing, but I find all of it cool&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;     &lt;div&gt;A &lt;a href="http://en.wikipedia.org/wiki/WRT54G"&gt;Linksys WRT54G&lt;/a&gt; Router (Broadcom MIPS/Linux) - my first little project. It did everything, build, run, debug and even TCP/IP I/O. I got it to control a GPIB-Enet box and a scope.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;   &lt;li&gt; Intel &lt;a href="http://www.intel.com/design/network/products/npfamily/ixdp425.htm"&gt;IXP425 Eval Board&lt;/a&gt; (Intel XScale 425/VxWorks) - one of the shipping examples   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://www.axman.com/"&gt;Axiom&lt;/a&gt; CMD565 (Freescale PowerPC 565/eCos)  - one of the shipping examples&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://www.axman.com/"&gt;Axiom&lt;/a&gt; CMD565 (Freescale PowerPC 565/VxWorks) - one of the shipping examples&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://www.axman.com/"&gt;Axiom&lt;/a&gt; CMD566 (PowerPC 566/VxWorks) - This board has Ethernet so we use it for training&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;Xilinx &lt;a href="http://www.xilinx.com/products/boards/ml403/reference_designs.htm"&gt;ML403 Eval Board&lt;/a&gt; - (PowerPC/VxWorks) - This was demoed at NIWeek last year. It uses the PowerPC hard core inside a Xilinx Virtex II Pro.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;   &lt;li&gt;     &lt;div&gt;Embedded Planet &lt;a href="http://www.embeddedplanet.com/products/ep405.asp"&gt;EP405 board&lt;/a&gt; - (PowerPC405/Linux) - This was in the embedded planet booth at NIWeek last year&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://www.freescale.com/"&gt;Freescale &lt;/a&gt;HC08 Eval Board (HC08/no os) - One of our engineers did a power window controller for a car door. He integrated the Freescale ProcessorExpert for I/O and had it all working in a couple k of code (2k?). It didn't debug, do any arrays, or anything fancy but it was neat to see how small we could go.&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://www.freescale.com/"&gt;Freescale&lt;/a&gt; HC12 Eval Board (HC12/no os) - Look for this at NIWeek this year. Get some M&amp;Ms in the process&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.altera.com/products/devkits/altera/kit-Nios-2c35.html"&gt;Altera NIOS II Dev Kit&lt;/a&gt; - (NIOS/eCos) - NIOS is a soft processor that runs in an Altera FPGA&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.phytec.com/products/sbc/ARM-XScale/phyCORE-ARM7-LPC229x.html"&gt;Phytec LPC229x&lt;/a&gt; (ARM7/eCos) - A new example target   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://focus.ti.com/docs/toolsw/folders/print/tmdsdsk6713.html"&gt;TI DSK6713&lt;/a&gt; (TI TMS320C6713/DSP BIOS) - A university professor tried it first but we went and did it again as a new example target for those of you who want to program a DSP&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;      &lt;div&gt;Nintendo Gameboy (Linux) - this was the robot from &lt;a href="http://www.charmedlabs.com/"&gt;Charmed Labs&lt;/a&gt; that you saw on stage at NIWeek two years ago.&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;PC Motherboard (80486/QNX) - your standard PC, but running the QNX operating system. It even can support an M-series DAQ card. Look for it in an NIWeek presentation.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;     &lt;div&gt;A &lt;a href="http://en.wikipedia.org/wiki/WRT54G"&gt;Linksys WRT54G&lt;/a&gt; Router (Broadcom MIPS/Linux) - my first little project. It did everything, build, run, debug and even TCP/IP I/O. I got it to control a GPIB-Enet box and a scope.&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;          &lt;div&gt;Intel &lt;a href="http://www.intel.com/design/network/products/npfamily/ixdp425.htm"&gt;IXP425 Eval Board&lt;/a&gt; (Intel XScale 425/VxWorks) - one of the shipping examples&lt;/div&gt; &lt;/li&gt;&lt;li&gt;     &lt;div&gt;&lt;a href="http://www.axman.com/"&gt;Axiom&lt;/a&gt; CMD565 (Freescale PowerPC 565/eCos)  - one of the shipping examples&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://www.axman.com/"&gt;Axiom&lt;/a&gt; CMD565 (Freescale PowerPC 565/VxWorks) - one of the shipping examples&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://www.axman.com/"&gt;Axiom&lt;/a&gt; CMD566 (PowerPC 566/VxWorks) - This board has Ethernet so we use it for training&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;EP405 (PowerPC405/MontaVista Linux) - Same board as before but running MontaVista Hard Hat Linux rather than the non-deterministic standard Linux distro.&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;PC Motherboard (80486/MontaVista Linux) - Once you have Linux running, LV Embedded works pretty well on any CPU. &lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;Freescale MCF523x (Coldfire/no os) - A customer wanted to give this a try &lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MCF5329&amp;amp;nodeId=0162468rH3YTLC00M99287"&gt;Freescale MCF5329&lt;/a&gt; Eval Board (ColdFire 5329/uCLinux) - The &lt;a href="www.freescale.com/ftf"&gt;winning demo&lt;/a&gt; at Freescale Technology Forum.&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;Freescale 5200LITE (PowerPC/Linux) - A customer had one of these kicking around to try. &lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;Renesas SH7751 (SH4/QNX) - another experiment with our friends at QNX &lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;div&gt;Atmel ATMega 128/no os - Details are sketchy but an academic customer put this together and is writing a paper on it.&lt;/div&gt;   &lt;/li&gt;   &lt;li&gt;The &lt;a href="http://www.bluetechnix.com/rainbow2006/site/software/blackfin/labview_embedded/362/labview_embedded.aspx"&gt;Bluetechnix&lt;/a&gt; tinyboard, the &lt;a href="http://www.cs.uml.edu/blackfin/index.php?n=LabVIEW.LabVIEWEmbedded"&gt;HandyBoard&lt;/a&gt;, Scmidt Engineering &lt;a href="http://zone.ni.com/devzone/conceptd.nsf/webmain/68A45F1A6A817EF3862571810064A996#3"&gt;Z-Brain&lt;/a&gt;, and the &lt;a href="http://www.ni.com/labview/blackfin/"&gt;ADI EZ Kits&lt;/a&gt; using the LabVIEW Embedded Blackfin module.&lt;/li&gt;   &lt;/ul&gt;Whew.  I'll bet there are others kicking around that I forgot or I don't yet know about.  The breadth is fantastic, from 8-bit to 32-bit.  From no-os to Linux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115445582215839113?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115445582215839113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115445582215839113' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115445582215839113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115445582215839113'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/08/labview-embedded-chips.html' title='LabVIEW Embedded Chips'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115445577468390281</id><published>2006-08-01T10:23:00.000-07:00</published><updated>2006-08-01T11:09:34.736-07:00</updated><title type='text'>Doings</title><content type='html'>I know I've been a bad blogger and left you hanging for the last three weeks. It's only two weeks in work time due to a week long vacation in &lt;a href="http://www.prague.cz/"&gt;Prague&lt;/a&gt; in the Czech Republic. Prague is a beautiful city that was not bombed during World War II. You see interesting adornments on the building wherever you go. Everything is cheap by European standards. It was easily half the price of a vacation in London.&lt;br /&gt;&lt;br /&gt;But I digress.. Last week was the &lt;a href="http://www.dac.com/43rd/index.html"&gt;Design Automation Conference&lt;/a&gt;. That conference is for people who make computer chips, the kind that take 10 weeks to bake in the fab before you get them back. It's a completely different world where they have to simulate everything up front because there is no possibility of even doing a component level prototype in the real world. Imagine it costing you a million dollars to fix a bug that you found in your code after your first build. That's the world they live in. However, it is an analog world at the bottom of it and LabVIEW does provide ways to help validate those designs, both in the simulation world and once the chip comes out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115445577468390281?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115445577468390281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115445577468390281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115445577468390281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115445577468390281'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/08/doings.html' title='Doings'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115264372182496682</id><published>2006-07-11T11:03:00.000-07:00</published><updated>2006-07-11T11:48:41.876-07:00</updated><title type='text'>NIWeek is coming</title><content type='html'>In four weeks, &lt;a href="http://ni.com/niweek"&gt;NIWeek&lt;/a&gt; will be here. A post on the LAVA blogs has some good ideas on &lt;a href="http://forums.lavag.org/blog/champions/index.php?showentry=92"&gt;how to get the best out of NIWeek&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you spot me at NIWeek, stop by and say hi. I'd love to chat about Embedded, FPGA, PDA, DSP, and other LabVIEW stuff (assuming I'm not already late to something). If you want to play "where's Joel", I'm publishing &lt;a href="http://calendar.yahoo.com/jsumnertx"&gt;my NIWeek Calendar&lt;/a&gt;. Drop me an email if you want to chat and I'll try and set something up as my schedule firms.&lt;br /&gt;&lt;br /&gt;See you there&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115264372182496682?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115264372182496682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115264372182496682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115264372182496682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115264372182496682'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/07/niweek-is-coming.html' title='NIWeek is coming'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115256491900867523</id><published>2006-07-10T13:45:00.000-07:00</published><updated>2006-07-10T13:55:19.023-07:00</updated><title type='text'>Mourning the passing of LabVIEW Technical Resource</title><content type='html'>This isn't particularly timely but I wanted to belatedly express my gratitude to Karen Pape from the "LabVIEW Technical Resource" magazine.  They closed their doors last year and their site no longer works.   It was a great, no advertisements, periodical jam-packed with LabVIEW techniques from experienced LabVIEW developers. If you ever run across a copy laying on someone's desk, pick it up. You'll probably learn something.&lt;br /&gt;&lt;br /&gt;You can still find some of the articles floating around the Internet.&lt;br /&gt;    * NI's site has some articles. Go to &lt;a href="http://zone.ni.com/zone/jsp/zone.jsp"&gt;DeveloperZone&lt;/a&gt; and search for "labview technical resource"&lt;br /&gt;    * There is a &lt;a href="http://software.idealo.com/prices/P20012724662K3.html"&gt;CD for sale&lt;/a&gt; with 9 years of articles&lt;br /&gt;    * Many articles have been mirrored on the &lt;a href="http://www.google.com/search?q=%22labview+technical+resource%22&amp;sourceid=mozilla-search&amp;amp;start=0&amp;start=0&amp;amp;ie=utf-8&amp;oe=utf-8&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla:en-US:official"&gt;sites of their representative authors&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115256491900867523?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115256491900867523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115256491900867523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115256491900867523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115256491900867523'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/07/mourning-passing-of-labview-technical.html' title='Mourning the passing of LabVIEW Technical Resource'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-115023776798125993</id><published>2006-06-13T15:26:00.000-07:00</published><updated>2006-06-13T15:31:08.026-07:00</updated><title type='text'>Language Challenges for Multi-Core Processors</title><content type='html'>In Jim Turley's recent Silicon Insider, he talked about &lt;a href="http://www.jimturley.com/si/current.htm#link3"&gt;multi-core processors&lt;/a&gt;.&lt;br /&gt;&lt;blockquote&gt;But new compilers and debuggers won't be enough. We're facing a change to new programming languages. Current languages like C don't express parallelism well. Compilers can identify threads of execution or independent constructs and extract some small amounts of parallelism here and there, but the language itself prevents large-scale parallelism. If we're to exploit these new multi-processor chips, we're going to have to swallow hard, roll up our sleeves, and tackle a truly Herculean task.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Hmm. Languages that express parallelism well. I wonder where &lt;a href="http://ni.com/labview"&gt;I can find one of those&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;small&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/Parallelism" rel="tag"&gt;Parallelism &lt;/a&gt;, &lt;a href="http://technorati.com/tag/Multicore" rel="tag"&gt;Multicore&lt;/a&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-115023776798125993?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/115023776798125993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=115023776798125993' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115023776798125993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/115023776798125993'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/06/language-challenges-for-multi-core.html' title='Language Challenges for Multi-Core Processors'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114988109847062239</id><published>2006-06-09T12:24:00.000-07:00</published><updated>2006-06-09T12:24:58.530-07:00</updated><title type='text'>Do you get to talk? Do we really listen?</title><content type='html'>These days, my title is "Senior Product Strategist". I work in engineering and sit with all of the developers but I don't write code any more (ah, the good old days). My focus is on figuring out what we should do next. Did any of you ever watch the original first version of the TV show &lt;a href="http://en.wikipedia.org/wiki/Connections_(TV_series)"&gt;"Connections"&lt;/a&gt;? It was all about how innovation isn't a continuous linear stream. It usually happens when someone who works in one field hears about something being done in a completely unrelated field, puts 2 and 2 together, and comes up with the next big thing in their field. I'd like to be able to do the same but I'll take just coming up with some interesting ideas.&lt;br /&gt;&lt;br /&gt;My goal is to get to talk to you (and I mean "you" in the massively plural sense) and find out what you do, how you use our stuff now, and what would allow you to do things you can't do now. I can see the tagline now: "At NI, we make the impossible a little bit easier".&lt;br /&gt;&lt;br /&gt;There are various things we do to try and figure out what we should be working on. We do visits, call people on the phone, send out web surveys, read comments made by seminar attendees, have meetings at NIWeek, show early concepts of what we are looking to do, read the &lt;a href="http://forums.ni.com/"&gt;NI Forums&lt;/a&gt;, &lt;a href="http://www.info-labview.org/"&gt;Info-LabVIEW&lt;/a&gt;, and your &lt;a href="http://forums.lavag.org/index.php?automodule=blog"&gt;LabVIEW blogs&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;So here's a question: If I were sitting next to you right now, what would you want to talk about? Would you talk about things that you don't talk about now? Or would it just be stuff you already have told us in any of the places mentioned above?&lt;br /&gt;&lt;br /&gt;My job is to listen, how can I best get you to talk?  Comment below or email me at joel.sumner (AT) ni.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114988109847062239?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114988109847062239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114988109847062239' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114988109847062239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114988109847062239'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/06/do-you-get-to-talk-do-we-really-listen.html' title='Do you get to talk? Do we really listen?'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114902574716800204</id><published>2006-05-30T14:49:00.000-07:00</published><updated>2006-05-30T14:49:08.126-07:00</updated><title type='text'>Embedded Podcast</title><content type='html'>&lt;p&gt;We're of course a bunch of techies at NI and we love monitoring what's going on in the world. Hopefully these blogs share some of our interests. We have a beautiful audio room that's used for training and we've gone and made some &lt;a href="http://www.ni.com/podcast/"&gt;podcasts&lt;/a&gt; on current technology. As of today, you can listen to essays on:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Safety and Isolation&lt;/li&gt;&lt;br /&gt;&lt;li&gt;What is Embedded?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A PCI Express Architecture Overview&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Microsoft Vista Overview&lt;/li&gt;&lt;br /&gt;&lt;li&gt;LabVIEW Architecture&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Check em out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114902574716800204?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114902574716800204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114902574716800204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114902574716800204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114902574716800204'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/05/embedded-podcast.html' title='Embedded Podcast'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114783593058734402</id><published>2006-05-16T20:18:00.000-07:00</published><updated>2006-05-16T20:18:50.676-07:00</updated><title type='text'>Personal or Project Scheduling</title><content type='html'>&lt;p&gt;I spent 8 years somehow managing software projects and it took years to discover a few secrets that made life easier. When it comes down to it, the job of a project manager is:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Insure that the (task/product/thing) is delivered on time with the proper level of features and quality &lt;br /&gt;&lt;li&gt;Insure that there is appropriate and correct communication between the team and others&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;That's it. The rest is just details. My best advice for a project manager is...&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;&lt;br /&gt;&lt;H2&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;Do as little work as possible to accomplish those goals&lt;/strong&gt; &lt;br /&gt;&lt;p&gt;&lt;/blockquote&gt;&lt;/H2&gt;&lt;/strong&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;After all, no one ships a project plan or a schedule. If the product ships correctly, you've accomplished your goal. Never get carried away with your own importance.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Some projects actually run themselves. You can do zero work and the project will meet the goals. But, there are cases when you need to do more than nothing. &lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;You have inexperienced or new employees on your team &lt;br /&gt;&lt;li&gt;Your product depends on other products/components in development &lt;br /&gt;&lt;li&gt;Your schedule is dictated by other products (i.e. something else is shipping at the same time and they won't wait for you) &lt;br /&gt;&lt;li&gt;Other products depend upon your product and so a slip in your project will slip them also &lt;br /&gt;&lt;li&gt;You have remote developers &lt;br /&gt;&lt;li&gt;Features get inserted into your schedule midstream &lt;br /&gt;&lt;li&gt;Each time your team crosses a size threshold (10, 50, and 100 developers) you need to change the way your team operates. &lt;br /&gt;&lt;li&gt;The release date of your project has a large monetary affect &lt;br /&gt;&lt;li&gt;Your developers are working on multiple projects at once &lt;br /&gt;&lt;li&gt;Your product must be high quality (high expectations, life critical, is infrastructure other people depend on, etc..)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Many projects have these risk factors. So, you think "I need a tool to help me do this". You look up "Project Management Software" in Google and you get.... Microsoft Project. Let's talk a little about tools for second.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Project management tools are never the magic bullet they are advertised to be. They won't pull in a late project. They don't give you "the answer". They lie to you. They only work in conjunction with your brain.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;They will, however, help you make sense of chaos and they will give you something to blame if you screw up. But I think the first is the only one that is valid.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So, what is the role of your brain here? &lt;br /&gt;&lt;H3&gt;Rule #1 - Never trust a precise date. &lt;/H3&gt;&lt;br /&gt;&lt;p&gt;If someone tells me a product will ship "March 25, 2004". I call BS immediately. No one can pinpoint a ship date down to the day unless that day happens to be tomorrow, and then I'm still suspicious. If you said "March", "First Quarter", or "Sometime in 2004" you would not only be more accurate but you also tell me something important: your level of certainty in the date and that tells me a lot. &lt;br /&gt;&lt;p&gt;So, the number one reason I dislike MS Project is that it only gives you dates with daily (or hourly) precision. It won't tell you "sometime in March" and thus it is lying to you. It's the lie of omission. The lie that makes you overconfident. I'd much prefer MS Project to tell me "I have no idea when your project will ship". That's really good information because it forces you to use your brain and go find out. &lt;br /&gt;&lt;H2&gt;&lt;br /&gt;&lt;H3&gt;Rule #2 - Greater detail does not give you greater accuracy. &lt;/H3&gt;&lt;/H2&gt;&lt;br /&gt;&lt;p&gt;I learned this one the hard way. The schedules I created (in MS Project) for the first two years of my career constantly slipped. I went to training classes looking for the answer. I used to think they were off because I wasn't including enough details. After all, the schedule kept slipping because new tasks kept getting inserted. If I got more detailed, I'd know all of the tasks and my schedules would be more accurate. This happens to be 100% wrong because, at least with software development, you can never know ALL of the tasks. The best you can do is sketch it out and fill in the details later. &lt;br /&gt;&lt;p&gt;Instead, use the law of large numbers to help your accuracy. (The more things you aggregate, the greater your accuracy). I have no idea how long it will take to fix a particular bug. Could be a day, could be a week. However, you may learn from the past patterns of the team that each developer can fix, on average 2 bugs per day. So, if you have 60 bugs and 3 developers, it will probably take 10 work days to fix all of the remaining bugs. You are making an estimate but it will, in my experience, be very accurate. It also saves 60 entries in your project management software. &lt;br /&gt;&lt;H3&gt;Rule #3 - Know the difference between unknown duration of known work and unknown work&lt;/H3&gt;&lt;br /&gt;&lt;p&gt;Most software development projects are late because there's more work to actually be done or more stumbling blocks than you realize at the start. It's not that a particular task took longer to complete than you thought. It's because there was a bunch of other tasks that you never thought of or came up in the middle. &lt;br /&gt;&lt;p&gt;How do you deal with this? First, never make a schedule until you have scoped the work. This is not just because you need something to write down. Scoping the work forces the people involved to actually start figuring out what they need to make and that will force them to figure out how they are going to get it done. Now you have the "known work". I can't overstate how important this is. Upfront work now saves rework or mistakes or schedule slips later. I've seen it and I believe it. You can't have an accurate schedule before you know what you are doing. &lt;br /&gt;&lt;p&gt;The second piece of advice is the rule of 50%. It's my rule and it's based purely on experience. It may vary between projects, styles or whatever but I've found that even for a well specified project, there's about 50% more tasks there than you think there really are. This is the "unknown work". If I hear that there are 20 days worth of known work left, I can bet that they will be done in 30 days (20 days + 50% of 20 days = 30). If there are 6 months of known work left, they will ship in 9 months. And this isn't just a fudge factor. When doing scheduling, I count down the amount of work left, add 50% to it and that becomes my best guess at a ship date. In the past 4 projects, that date has been the closest thing to right. Since it's a percentage rather than an absolute, it stays accurate even as the amount of work decreases (and unfortunately MS Project can't seem to deal with that) &lt;br /&gt;&lt;H3&gt;Rule #4 - No news is rarely good news&lt;/H3&gt;&lt;br /&gt;&lt;p&gt;You can't adjust to problems unless you know about them. Engineers rarely volunteer that there are problems. They are problem solvers and so they try and fix the problem themselves. If you don't ask, they won't tell. Ask. &lt;br /&gt;&lt;H3&gt;&lt;br /&gt;&lt;p&gt;Rule #5 - Nothing is ever 90% (“almost”) done&lt;/p&gt;&lt;/H3&gt;&lt;br /&gt;&lt;p&gt;This rule comes from a senior manager at NI. Progammers love to tell you that they are "almost" done. Internally translate that to "I'm almost feature complete.. That whole bug fixing, testing, integration thing doesn't count toward done.". So that means at best they are 50% done.&lt;/p&gt;&lt;br /&gt;&lt;H3&gt;Making an Accurate Software Schedule&lt;/H3&gt;&lt;br /&gt;&lt;p&gt;I didn't answer how to make a schedule because once you follow these rules, you're pretty much home. Use whatever you want. I use Excel. SW projects are not usually dependency driven. There is a list of tasks, you estimate a particular amount of time for each task, add in the conversion factor for meetings and other overhead (i.e. usually double the task estimate), account for unknown work (the rule of 50%), add it all up and you get a general target date. Don't tell anyone that date because it is wrong (see Rule #1). Give them the date +/- a quarter and you're probably being accurate. Update the task list weekly. Now focus on the harder things :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114783593058734402?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114783593058734402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114783593058734402' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114783593058734402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114783593058734402'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/05/personal-or-project-scheduling.html' title='Personal or Project Scheduling'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114710746607588719</id><published>2006-05-08T09:57:00.000-07:00</published><updated>2006-05-08T09:57:46.120-07:00</updated><title type='text'>Giving Good Presentations</title><content type='html'>&lt;p&gt;Whenever you are in someone's office and you see a stack of magazines, don't hesitate to look at the covers and see if you like the headlines. Call it "desk surfing" rather than "web surfing".&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I stumbled across an article called "&lt;a href="http://csdl2.computer.org/comp/mags/co/2005/09/r9010.pdf"&gt;Presentation Lessons from Comedians&lt;/a&gt;" in the an older issue of &lt;a href="http://www.computer.org/portal/site/computer/index.jsp"&gt;IEEE Computer&lt;/a&gt; magazine. It had a lot of good advice that I think can help people be better presenters. Granted, some people just have "it", that personality feature that allows them to be captivating speakers. Some people don't have "it". But, if you follow some of this advice, you will be less likely to put the audience to sleep even if you don't have "it".&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Have a purpose. Decide what you want to tell them before you make a single Powerpoint slide. Make sure what you want to tell them is only 2-3 things. If you can't summarize what you want to tell them in 2-3 sentences, you're trying to do to much. Most of your talk is purely about supporting those 2-3 things.&lt;/li&gt;&lt;/ul&gt;From the article&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px"&gt;"...if you get your story right, the delivery will follow.... [When] the story isn't clear, the audience has to work too hard to make sense of it, and they will resist it, become irritated, and finally lose confidence in the presenter. Conversely, once the story is clear, the audience will come along for the ride even if the presenter [isn't a gifted orator]."&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Beat them over the head with your purpose. Don't put up a lot of data and expect them to infer what you want them to leave with. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Leave a lot out. There's plenty of neat tidbits of information floating around in the world. Leave it out. Some of your audience will care, most will find the first 3 amusing and then get bored.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Be brief. The worst sin in speaking is to go long. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Know your audience. Know what they are expecting to get out of the talk. If they are expecting you to talk about something else, they will fixate on waiting for a particular piece of information and not focus on what you are trying to tell them&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Never read your slides - not only can the audience read them while sitting there, they will feel like they should just leave and instead get the slides later (which they can read in 5 minutes rather than the hour you are making them sit there). Talk "about" each slide instead.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The article had one I'd never seen before - Look people in the eyes. Don't focus over their heads, look straight at them. As engineers, I know we hate to make eye contact while speaking but this one has merit and I'll give it a try. The article states that you will get a much better read on the audience this way and it will force you to subliminally do things that actually improve your talk.&lt;/li&gt;&lt;/ul&gt;The final one I'll leave you with is&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Know your material. If you know the information, you'll relax. The worst talks I've given have been NITS presentations because someone else made the slides and I didn't know the material like the back of my hand. Please never ask me to give an Advanced DAQ talk again :-)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tag/Speaking"&gt;Speaking&lt;/a&gt; &lt;a href="http://www.technorati.com/tag/Presentations"&gt;Presentations&lt;/a&gt; &lt;a href="http://www.technorati.com/tag/Engineering"&gt;Engineering&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114710746607588719?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114710746607588719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114710746607588719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114710746607588719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114710746607588719'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/05/giving-good-presentations.html' title='Giving Good Presentations'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114558732680617921</id><published>2006-04-20T19:42:00.000-07:00</published><updated>2006-04-20T19:42:06.813-07:00</updated><title type='text'>Danger of preserving conventions</title><content type='html'>&lt;p&gt;Code can be written in many different ways. There are snippets of LabVIEW code that I can look at and know the original author. The way they write their comments, the way they name their variables, and other telltale signs. I say the original author because the person who first writes the code tends to lay down the template for how the code is modified in the future. Mismatching styles in the same file cause complete chaos. You can't have three methods of error checking in the same function or else the code becomes indecipherable and hard to maintain. Therefore, modifications to the code tend to be written to match the original style, even if they are made by a different person.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This preservation can be a problem over time. There may be a technique that is better than the style being used but, since you don't want to mix the styles, you may need to change everything over to the new style rather than just a snippet. That takes work.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Sometimes, the operating environment changes out from under you and the old style is actually incompatible with the new operating environment. Recently, someone found a bug in LabVIEW that I thought was amusing. In the older Unix systems, after you call some system calls you read a variable called "&lt;a href="http://www.mkssoftware.com/docs/man5/errno.5.asp"&gt;errno&lt;/a&gt;" to see if the call succeeded. Windows followed the same convention but you called a function, &lt;a href="http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/getlasterror.asp"&gt;GetLastError&lt;/a&gt;(), instead of reading a global. As developers, we try and keep the style the same so that style got reused in one of our libraries. It had a GetError() function. Wellllll.... &lt;a href="http://www.unix.org/whitepapers/reentrant.html"&gt;errno isn't thread safe&lt;/a&gt; unless you do some special things. Our library didn't do these special things and therefore it wasn't thread safe either. When that library started getting called from multiple threads, bad things happened.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;What's the lesson here? Following style is good, blindly following style is not. Question authority! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114558732680617921?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114558732680617921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114558732680617921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114558732680617921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114558732680617921'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/04/danger-of-preserving-conventions.html' title='Danger of preserving conventions'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114558441828786399</id><published>2006-04-20T18:53:00.000-07:00</published><updated>2006-04-20T18:55:04.300-07:00</updated><title type='text'>My breadcrumbs</title><content type='html'>&lt;p&gt;My wife and I watch people. We'll be at a restaurant and try and figure out the relationship of other patrons. Are the people at that table married? No, they look too interested in each other. Maybe they are on a first date? My wife is much better at it than I am. She always picks up the clues that I miss. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;So it makes me wonder exactly what folks who see my web breadcrumbs in the righthand column think. An article about &lt;a href="http://www.edn.com/article/CA6322654.html?ref=nbsa"&gt;FPGA programming&lt;/a&gt;, one about &lt;a href="http://www.rtcmagazine.com/home/article.php?id=100491"&gt;networking technology&lt;/a&gt;, an &lt;a href="http://www.embedded.com/showArticle.jhtml;jsessionid=5MYEYAQCL4NLSQSNDBCSKHSCJUMEKJVN?articleID=184401072"&gt;ARM core for a dollar&lt;/a&gt;, and one on &lt;a href="http://www.time.com/time/magazine/article/0,9171,1176980,00.html"&gt;global warming&lt;/a&gt;. I guess my wife would have a field day with this. She'd call me a geek.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114558441828786399?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114558441828786399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114558441828786399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114558441828786399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114558441828786399'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/04/my-breadcrumbs.html' title='My breadcrumbs'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114369634858513772</id><published>2006-03-29T21:25:00.000-08:00</published><updated>2006-03-29T21:29:54.306-08:00</updated><title type='text'>Performance Impact of Property Nodes</title><content type='html'>&lt;p&gt;This topic came as a result of a customer question at a NITS session. &lt;a href="http://www.ni.com/techsym/"&gt;NITS&lt;/a&gt; is our travelling version of &lt;a href="http://www.ni.com/niweek/"&gt;NIWeek&lt;/a&gt;. We take the best presentations on the road to a variety of cities to get our technical information out to an even wider audience. We even send our development engineers out to give the presentations because we feel like having direct customer contact is the best way for the people implementing the features to understand what people need. Someone asked what the performance impact was of using &lt;a href="http://zone.ni.com/reference/en-XX/help/371361A-01/glang/property_node/"&gt;property nodes&lt;/a&gt; to set values on controls. I thought I'd share my version of the answer here.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The typical way of setting the value of a LabVIEW control or indicator is to pass data via a data-flow wire to the terminal. Since this is the typical case, we do the most to optimize the performance of this case. When you write to a terminal and the front panel is open, the data gets copied to a temporary holding spot called the transfer buffer. After some interval (around 60 Hz), the UI steals some time from the running program and updates the controls by copying the data from any changed transfer buffers to the control and then redraws the changed controls. So, to summarize&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;If the front panel is in memory (which can happen for a number of reasons - including running a VI that has been edited or &lt;a href="http://ideasinwiring.blogspot.com/2005/05/benchmarking-labview-operation.html"&gt;upgraded to a new version without being saved&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Every time the terminal node or local variable executes, data gets copied once. The diagram immediately continues after the data copy. &lt;br /&gt;&lt;li&gt;Around 60 Hz, the control updates if the data changed&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;A property node for a control or indicator has a property called "Value". It would seem to be the same, right? Not exactly, someone on one of the forums noted that its actually &lt;a href="http://www.codecomments.com/archive273-2005-12-732140.html"&gt;600 times slower&lt;/a&gt; in their test. Why? Because property nodes use a different mechanism and are accomplishing a different thing. Property nodes are typically used to set other options on the control, such as its color or formatting. So when you use a property node, here's what happens&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The front panel will always be forced in memory if there is a property node to it on any diagram (thus slowing down other normal indicator updates as noted above)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The execution of the property node forces the block diagram to pause while LabVIEW wakes up the front panel. (i.e. switches threads to the UI thread)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The front panel then does whatever operation was asked (such as changing the value of the control)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The front panel then forces a redraw of the affected part of the screen (typically if the data changed but sometimes always)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Then LabVIEW switches back to the block diagram and continues&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;So, you get two thread swaps and a screen redraw every time you update the "value" of the control. 600x slowdown is not at all surprising when you know how things actually work&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There are a couple of optimizations that you can do here&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Don't use the value property unless you have no other alternative&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If you are doing more than 1 property update or are doing some sort of looping, take the VI that is doing the updating and set its execution system to "UI Thread". That will move the thread swaps to the boundary of the VI rather than having them happen on each property node call&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Look into the "DeferPanelUpdates" property. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tag/LabVIEW"&gt;LabVIEW&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Performance"&gt;Performance&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Programming"&gt;Programming&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114369634858513772?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114369634858513772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114369634858513772' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114369634858513772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114369634858513772'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/03/performance-impact-of-property-nodes.html' title='Performance Impact of Property Nodes'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114315817965963482</id><published>2006-03-23T15:41:00.000-08:00</published><updated>2006-03-23T15:56:19.660-08:00</updated><title type='text'>Site improvements</title><content type='html'>Back when I was six, I had newfangled handheld computers games that adults couldn't figure out. Between the ages of 12 and 16, it seemed no adult could stop a VCR from flashing "12:00". In the blogging world, I feel like my creaky grandfather.  Someone says "Web 2.0" and I say "what?"&lt;br /&gt;&lt;br /&gt;Anyway, there are some new little widgets that you might find useful&lt;br /&gt;&lt;br /&gt;In the top right, there's a list of articles I've &lt;a href="http://del.icio.us/jsumnerni"&gt;read recently&lt;/a&gt; that you might enjoy. They are updated semi-automagically as I surf so they should stay current. You might find the articles interesting. Hopefully it's more useful information that what I'm playing on my iPod.&lt;br /&gt;&lt;br /&gt;There is now a way to get email whenever I post something for those of you who aren't much for my irregular schedule or don't use an &lt;a href="http://en.wikipedia.org/wiki/News_aggregator"&gt;RSS reader&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For those of you who do use a reader, I'd greatly appreciate it if you change over to my &lt;a href="http://feeds.feedburner.com/IdeasInWiring"&gt;new feed&lt;/a&gt;. Feedburner gives me statistics on who's reading my blog.  The more people I know are reading it, the more incentive I have to write more (is there anybody out there... out there... out there... echo... echo...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114315817965963482?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114315817965963482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114315817965963482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114315817965963482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114315817965963482'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/03/site-improvements.html' title='Site improvements'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114314115061419408</id><published>2006-03-23T11:12:00.000-08:00</published><updated>2006-03-23T13:18:04.536-08:00</updated><title type='text'>It's likely you are an embedded programmer</title><content type='html'>Many of you write code on a desktop computer that is supposed to run on a desktop computer. It may be in LabVIEW, in C, C++, VB, Java, or some other language. That makes you a desktop programmer, right? Well, not so fast. The term "Embedded" is so nebulous that sometimes the definition is "anything that's not a desktop". Wikipedia has a &lt;a href="http://en.wikipedia.org/wiki/Embedded_system"&gt;decent definition&lt;/a&gt; for embedded. It says&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;An embedded system is a computer-controlled system. The core of any embedded system is a microprocessor, programmed to perform a few tasks (often just one task). This is to be compared to other computer systems with general purpose hardware and externally loaded software.&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;The key to being an embedded system is not the hardware it runs on, it's all in the software. Embedded systems have a particular task and they perform that task and nothing else. A Dell PC might be capable of being a desktop computer, but if you put software on it that turns it into something that does a particular task and only that task, it has then become an embedded system. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;NI makes products that get used in a lot of embeded systems. Our customers take our products and turn them into, say, a &lt;a href="http://sine.ni.com/csol/cds/item/vw/p/id/585/nid/124300"&gt;Formula One brake test system&lt;/a&gt;, or a &lt;a href="http://sine.ni.com/csol/cds/item/vw/p/id/616/nid/124300"&gt;centrifuge control system&lt;/a&gt;. The brake test system uses an industrial PC with a Pentium 4 processor, but the application on that PC is designed to performa a particular function. It has a display that shows what the system is doing, and the operator only interacts with that system. The operator would never stick a "&lt;a href="http://www.idsoftware.com/"&gt;Quake&lt;/a&gt;" CD into the drive and start playing a game.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But embedded systems programming is hard, right? Yes and no. It's all about scale. If your embedded application can run on a desktop PC, then embedded programming is rather easy. Get yourself some good tools (which could even be &lt;a href="http://gcc.gnu.org/"&gt;free&lt;/a&gt;), take advantage of all of the thousands of programmer-years that go into Windows or Linux, and you're set. There are different form-factors for PCs, such as rugged chassis like PXI, that allow use in much more harsh environments than you would ever put something you bought from CompUSA.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The trick of embedded programming comes when you can't use PC hardware anymore. That laptop of yours doesn't fit in the pocket very well and weights a ton. The key-fob for unlocking you car has only 4 specially marked buttons rather than 101. But it's all a matter of scale. The more you optimize your hardware to match your application, the more pain you go through. But it doesn't change the type of application you are creating. You're still an "embedded programmer".&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;small&gt;&lt;br /&gt;Technorati Tags&lt;br /&gt;&lt;a href="http://technorati.com/tag/Embedded+Programming" rel="tag"&gt;Embedded Programming&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Dell" rel="tag"&gt;Dell&lt;/a&gt;, &lt;a href="http://technorati.com/tag/GCC" rel="tag"&gt;gcc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114314115061419408?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114314115061419408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114314115061419408' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114314115061419408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114314115061419408'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/03/its-likely-you-are-embedded-programmer.html' title='It&apos;s likely you are an embedded programmer'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114141695200714470</id><published>2006-03-03T12:15:00.000-08:00</published><updated>2006-03-03T12:18:44.723-08:00</updated><title type='text'>How does data flow execution work?</title><content type='html'>&lt;p&gt;The term "&lt;a href="http://en.wikipedia.org/wiki/Data_flow_diagram"&gt;data-flow&lt;/a&gt;" encompasses a lot of different types of execution. You might hear about "&lt;a href="http://www.ece.utexas.edu/%7Ebevans/courses/ee382c/lectures/08_sdf/"&gt;synchronous dataflow&lt;/a&gt;", or "&lt;a href="http://ptolemy.eecs.berkeley.edu/publications/papers/95/processNets/"&gt;process networks&lt;/a&gt;". LabVIEW uses "&lt;a href="http://portal.acm.org/citation.cfm?id=832276.834324"&gt;structured dataflow&lt;/a&gt;". Each node on a LabVIEW diagram has a set of inputs and a set of outputs. LabVIEW schedules each node to execute when one item of data has arrived on all of its inputs. The execution of the node generates all of the outputs which then trigger the following nodes to run. There is no queueing on wires unless you explicitly put a queue primitive node on the diagram. Looping (using structures such as For-loops and while-loops) are explicit rather than being implicit like in some other languages.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6985/26/1600/LVExecOrder1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6985/26/320/LVExecOrder1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;center&gt;&lt;/center&gt;&lt;br /&gt;&lt;center&gt; &lt;/center&gt;So, in this diagram, you can see that everything is a node. Even the constants are nodes. Node 1, 2, 3, and 4 have no inputs, just outputs. So, when the diagram runs, they can go first because they aren't waiting on anything. Node 5 waits until Nodes 1 and 2 have run. Node 6 waits on nodes 3 and 4 to run and then it runs. Node 7 waits until nodes 5 and 6 have run and then it runs. Finally, Node 8 runs. Easy to show.&lt;br /&gt;&lt;p&gt;So how do you implement something like this? First, it depends on the hardware you are running on. As you can see, there are a number of things that can run simultaneously. Nodes 1, 2, 3, and 4 can all run in parallel with each other since they have no dependencies. Nodes 5 and 6 can run in parallel since they don't have any dependencies. In a processing environment that supports parallelism, you could run a lot of the diagram in parallel. Node 7 is a synchronization point. It needs to wait for two different parallel operations (node 5 and node 6) to complete before it can continue. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;How efficiently you can run this diagram will depend on three things&lt;/p&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;How much parallel hardware is available. Can the hardware perform two adds in parallel?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The overhead of scheduling each operation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;The overhead of synchronizing at Node 7&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;Silicon logic is probably the ultimate parallel processing technology. The &lt;a href="http://en.wikipedia.org/wiki/FPGA"&gt;FPGA &lt;/a&gt;makes this technology accessible to those without a semiconductor fab at their disposal and &lt;a href="http://www.ni.com/fpga/"&gt;LabVIEW FPGA&lt;/a&gt; makes it accessible so you don't need a degree in a complex language like VHDL to use it. If you run this diagram on an FPGA via LabVIEW FPGA, it will specify that the FPGA should make two blocks of hardware that perform adds in parallel and then feed the data into node 7 to do the multiply. The scheduling and synchronization overhead will depend upon how you draw this diagram. In the above diagram, LabVIEW FPGA wants to be safe. It will take each output wire and turn it into a register. So, the add at node 5 will occur and the data will go into a register and wait for the clock tick to come in order to pass the data on to node 7. This is how the data is synchronized. The scheduling overhead consists of a signal that travels from node 5 to the register to tell it "data is ready" and the signal that travels to node 7 that says "ok, now you can go". it takes up space but doesn't affect speed.Now, it turns out that this safety is a little paranoid. It turns out that the two parallel adds complete is a very short amount of time. In fact, the two adds can complete in parallel and then perform the multiply all in just one clock cycle. Since you know that, you can put this diagram into what is known as a 'single cycle timed loop'. This tells the FPGA module to remove the overhead of the register between node 5 and node 7. So, FPGAs have a lot of parallel hardware and can nearly eliminate the scheduling and synchronization overhead. What's the downside? Every single operation consumes a little bit of hardware and the FPGAs aren't terribly big. That 100 VI project isn't going to fit. Also, there are some primitives that don't work in the FPGA.So what about microprocessors? A microprocessor is mainly a sequential programming engine. You give it some sequential instructions and it performs them. Some processors (like modern desktop ones) can extract a bit of parallelism from the sequential instructions. A Pentium can run a couple add or multiply instructions in parallel. Now that multicore processors are &lt;a href="http://ideasinwiring.blogspot.com/2005/06/end-of-free-lunch.html"&gt;becoming more common&lt;/a&gt;, they can handle multiple sets of sequential instructions at once. How do you implement a structured dataflow engine in one of them? A basic dataflow scheduler has a big lookup table with a list of all of the nodes. It keeps track of which node feeds data to which and what data each node is waiting for. After each operation, the table gets updated with which nodes are waiting on which data and then which node is ready to run. In a paper I once read (that I can't find any more) this was called "fine grained dataflow". Easy, right? Well, yes but terribly inefficient. An "add" instruction in a microprocessor might take 1 clock cycle but the maintenance of that table may take 50 clock cycles or more. Having a scheduling overhead of 50:1 does not make for an efficient machine. Researchers have some &lt;a href="http://csdl2.computer.org/persagen/DLAbsToc.jsp?resourcePath=/dl/proceedings/&amp;toc=comp/proceedings/hicss/1997/7734/01/7734toc.xml&amp;amp;DOI=10.1109/HICSS.1997.667262"&gt;techniques for reducing this overhead&lt;/a&gt; and some dataflow processors have also reduced the overhead in hardware. In the paper I read published many years ago, they stated that none of these techniques had really been commercially successful.&lt;br /&gt;&lt;p&gt;Now, one thing to notice is that computations are not particularly sensitive to the outside world. For example, if you can't execute node 5 and node 6 in parallel, it really doesn't matter the order in which you execute the instructions. You get the same answer and the operation takes the same amount of time if you do the node 5 add and then the node 6 add or vice versa. Thus, LabVIEW forms "&lt;a href="http://zone.ni.com/devzone/conceptd.nsf/webmain/01f2e634710fb8e486256e2900586d41?opendocument&amp;amp;node=1381_US"&gt;clumps&lt;/a&gt;" of instructions which are all basically sequential and then only does scheduling when a clump of instructions is done (using something more efficient than the table lookup by the way). So, the LabVIEW compiler might emit something like&lt;/p&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;div&gt;Put "4" in register 1&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Put "5" in register 2&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Put "7" in register 3&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Put "8" in register 4&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Add registers 1 and 2 and store it back in register 2&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Add registers 3 and 4 and store it back in register 4&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Multiply registers 2 and 4 and store it back in register 2&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Store register 2 in memory somewhere&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Look for the next clump to run&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;This is all sequential code. While it might have been possible for the "add" in #5 and the "add" in #6 to run in parallel on different processors, the overhead of now trying to send the instruction to a separate processor and keep track of the synchronization and scheduling is so huge that you wouldn't have gotten the benefit of running them in parallel.&lt;br /&gt;&lt;p&gt;Now, it so happens that this example is so small, that the folks at Intel and IBM do give us some parallelism.  A Pentium has &lt;a href="http://arstechnica.com/articles/paedia/cpu/pentium-1.ars/1"&gt;multiple instruction units&lt;/a&gt;. When executing this sequential set of instructions, it sees that the first sets of instructions use different registers. Thus, the operations to put numbers into registers will likely occur in parallel. It might only take 1 clock cycle to execute the first 4 instructions because they don't interfere with each other. Likewise, instructions 5 and 6 operate on different sets of registers and there are multiple adders inside a pentium. Thus, those two instructions will probably be executed in parallel in the next clock cycle. Instruction number 7 is where things get interesting. It can't execute until both 5 and 6 have completed. Thus, it can't execute in parallel with instructions 5 and 6. (In fact, on some older CPUs, there might be a multiple clock delay while it waited for instructions 5 and 6 to complete). Similarly, instruction 8 can't execute until instruction 7 is complete.&lt;/p&gt;So, even on a single CPU machine, you can get some small amount of parallelism.  As always, thank your Intel engineer for this.&lt;br /&gt;&lt;p&gt;Ok, so this article is getting long so I'll stop there. If you're a LabVIEW programmer, you hopefully understand a little better how things work under the hood. If you're a student of computer architecture or parallel programming (as I once was), always pay attention to the overhead of distributing your workload because it may swamp any savings you hope to gain.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114141695200714470?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114141695200714470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114141695200714470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114141695200714470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114141695200714470'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/03/how-does-data-flow-execution-work.html' title='How does data flow execution work?'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-114062347162305656</id><published>2006-02-22T07:51:00.000-08:00</published><updated>2006-04-03T13:31:41.586-07:00</updated><title type='text'>Planning for failure</title><content type='html'>&lt;p align=left&gt;I love my &lt;a href="http://www.tivo.com/0.0.asp"&gt;TiVo&lt;/a&gt;. We have two in our house and they are constantly recording stuff. I never thought I'd see the day when my kids preferred "educational" programs like Junkyard Wars and Mythbusters to cartoons but TiVo did it for us.&lt;/p&gt;&lt;br /&gt;&lt;p align=left&gt;Recently, they have been adding new features to our box by way of automatic upgrades. Given that the TiVo really is an "embedded system", this is a bit novel. Now we have the ability to transfer movies to our PC, to a video iPod, to a DVD (by way of the PC). We can pull music from our iTunes libraries on our machines. Last week, we got a new set of features that provide access to the Internet. It allows us to look up movie times, buy movie tickets, see traffic conditions, and get the weather forecast. All of these options require connecting to the Internet but our TiVo is hooked to our wireless network at home so that's no problem.&lt;/p&gt;&lt;br /&gt;&lt;p align=left&gt;Now, I don't know if these features are worthwhile. Really the bottom line is saving us walking the 35 feet from our couch to one of the computers to look this information up. But, weighing the merits of these features isn't the interesting part. When we found out about these new features, we poked through them to see how they did. Hmm, nice, the weather report seemed accurate. We did look up movie times and descriptions. Then we went to the traffic report and the screen didn't update. I can only assume the TiVo was waiting for something on the network and it wasn't responding. If you or I was looking up this data on a web browser and this happened, we'd mumble something about the site being down, close the browser window, and go on with our lives. Maybe, if it was some evil flash-laden site and closing the browser didn't happen instantaneously, we might have to get out the task manager and kill the browser process. It's painful but you can still be done in 20 seconds and back on to other things.&lt;/p&gt;&lt;br /&gt;&lt;p align=left&gt;Unfortunately, these paradigms don't exist in TiVo world. There's no "cancel" button, no "quit" button, no "task manager". In fact, the TiVo doesn't even have a power button. It's always on, humming along, recording things that it thinks you might like. So what happens when an embedded system designed for unfailing reliability (you have to admit, not having a power button is quite a statement of reliability) meets something unreliable like the Internet? We had to pull the power plug on the TiVo. It took about 6 minutes for the box to come up, since it's very atypical for you to power off the box. Fortunately, it wasn't recording anything in the background or that process would have failed also. But probably the most damaging problem was to our confidence in that feature. Maybe traffic reports are a cool thing, but neither my wife no I will likely ever click on that button again. The "benefit" of not walking 35 feet has been dramatically outwieghed by the "risk" of losing 5-10 minutes of that very favorite show the TiVo might have been recording. The feature is now "too dangerous" to attempt and that's a pity. &lt;/p&gt;&lt;br /&gt;&lt;p align=left&gt;So what's the moral here? If I knew the actual failure mode, there are probably engineering parables about error checking, robustness of coding, or something like that. But to the user, it's really a different story. This was not a coding error, it was a design error. The design fell over when something inherently failable failed. So, I guess my best advice for those amazing people at TiVo is, "plan for failure". Who says pessimism is bad?&lt;/p&gt;&lt;span style="font-size: small"&gt;&lt;span style="font-size: x-small"&gt;&lt;br /&gt;&lt;p align=left&gt;Technocrati tags: &lt;a href="http://www.technorati.com/tag/TiVO"&gt;TiVO&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Embedded%2BProgramming"&gt;Embedded Programming&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/User%2BInterface"&gt;User Interface&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-114062347162305656?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/114062347162305656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=114062347162305656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114062347162305656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/114062347162305656'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/02/planning-for-failure.html' title='Planning for failure'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-113873571098273003</id><published>2006-01-31T11:28:00.000-08:00</published><updated>2006-04-03T13:34:29.030-07:00</updated><title type='text'>Less can be more</title><content type='html'>&lt;p align=left&gt;I admit to spending much more time than seems reasonable reading &lt;a href="http://slashdot.org"&gt;Slashdot&lt;/a&gt;. Is following commentary on Apple’s new &lt;a href="http://www.apple.com/macbookpro/"&gt;MacBook Pro&lt;/a&gt; (horrible name but I want one anyway) really that good a use of my time? Sometimes, your brain just needs a break. Other times, you stumble across really good articles (check out &lt;a href="http://blog.guykawasaki.com/"&gt;Guy Kawasaki’s&lt;/a&gt; new blog). Joel on Software is running an update to the book he wrote years ago on design. In the &lt;a href="http://www.joelonsoftware.com/design/1stDraft/01.html"&gt;introductory article&lt;/a&gt;, he mentions&lt;/p&gt;&lt;br /&gt;&lt;blockquote style="margin-right: 0px"&gt;&lt;br /&gt;&lt;p align=left&gt;Every new feature is a tradeoff, between the people who could really use such a feature and the people who are just going to get overwhelmed by all the options.&lt;/p&gt;&lt;br /&gt;&lt;p align=left&gt;...even if you think your new feature is all good and can't hurt because "people who don't care can just ignore it," you're forgetting that the people who allegedly don't care are still forced to look at your feature and figure out if they need it.&lt;/blockquote&gt;&lt;br /&gt;&lt;p align=left&gt;LabVIEW is running into a bit of this. After 15 years, we’ve added a heck of a lot of things that are useful or even necessary for developers. They hopefully make your job easier or allow you to get things done faster. However, for those of you who are brand new to LabVIEW, all of those cool little options must be overwhelming. Sometimes we get a bit nostalgic for “LabVIEW 2” because it was simple.&lt;/p&gt;&lt;br /&gt;&lt;p align=left&gt;Well, we’ve gotten a chance to think about what LabVIEW would be like if you strip it down to the basics and you can get your hands on it real soon now. My latest secret project is finally starting to reveal itself with the announcement of the &lt;a href="http://www.wired.com/news/culture/0,69946-0.html?tw=wn_tophead_1"&gt;Lego Mindstorms NXT&lt;/a&gt;. There are very few public screenshots of the software, but here are a few&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;a href="http://digital.ni.com/worldwide/bwcontent.nsf/web/all/D73D9C2B4F78BB1B862570E60055CBA0?OpenDocument&amp;node=167080_us"&gt;In NI press release&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div align=left&gt;This &lt;a href="http://nxtbot.com/blog/?p=14"&gt;blog from CES&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p align=left&gt;It will be very interesting to see the difference between a 12-year old using LabVIEW (via RoboLAB) and that same child using the Mindstorms product. I’ll bet we’ll learn how to make your lives easier too.&lt;/p&gt;&lt;span style="font-size: x-small"&gt;&lt;br /&gt;&lt;p align=left&gt;Technocrati Tags: &lt;a href="http://www.technorati.com/tag/User%2BInterface"&gt;User Interface&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/LEGO"&gt;LEGO&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Mindstorms"&gt;Mindstorms&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/LabVIEW"&gt;LabVIEW&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-113873571098273003?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/113873571098273003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=113873571098273003' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/113873571098273003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/113873571098273003'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/01/less-can-be-more.html' title='Less can be more'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-113811990052621587</id><published>2006-01-24T08:25:00.000-08:00</published><updated>2006-04-03T13:35:15.280-07:00</updated><title type='text'>Deploying LabVIEW Code</title><content type='html'>&lt;p&gt;One of the interesting characteristics of LabVIEW is that the source code to the application and the object code of the application are stored in the same file on disk. In languages like C or Java, the text file with the source code is run through a compiler to generate the code that can be executed by the computer. This code is stored in a separate file, an object file (the .o file) on disk. Once the source and the object files exist on disk, there is no real relationship between the source files and the object files any more. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;LabVIEW comes from a different heritage. The code for the VI is stored in the VI file itself. Rather than the object code being a separate representation of the application, it’s more like a cache of the results the last time the VI was run through the compiler. There is no explicit “compile” step in LabVIEW. You hit run and it works, the rest is all magic under the hood. The executing code re-uses the “source code” of the application when it is running. It may open the front panel (which is, after all, part of the source code of the VI) and display it. You can open the block diagram of the application when it is running and probe wires. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;As a LabVIEW user, then, you are only dealing with one file, the .vi file. It contains the ingredients you need to run the application and it contains all of the information LabVIEW needs to rebuild itself if the environment changes. You can give the file to someone else and they can use it. You don’t give someone else an object file and then have them say “but I want to modify it, can I have the source code?” It’s a very collaborative way of providing code.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;However, the ease of distribution of a LabVIEW program does expose you to some interesting phenomenon.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;What if you don’t want to give the person the source code? You don’t want them to see how you made the application.? &lt;br /&gt;&lt;li&gt;What if you want to bundle up the application into one file rather than a collection of files? &lt;br /&gt;&lt;li&gt;What if you want to make an application that can run without LabVIEW? &lt;br /&gt;&lt;li&gt;What if you want to make something small, without all of the source code in it? &lt;br /&gt;&lt;li&gt;What if you want to store the source files in a version control system?&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;As LabVIEW evolves, people want to do more and more with it. Thus, we need to keep up with the times. The current answers to these issues are:&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div align=left&gt;If you don’t want to give the person the source code, you have two options. The first option is to &lt;a href="http://digital.ni.com/public.nsf/websearch/8A9C88569EED14A5862565BC006E591C?OpenDocument"&gt;password protect the VI&lt;/a&gt;. The second is to remove the source code of the VI. In versions of LabVIEW before 8, you could do a “save with options” to do this. In LabVIEW 8, you make a source distribution target and use the “Customize VI Settings” button to tell it to remove the block diagram (and/or front panel)&lt;/div&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div align=left&gt;Normally, an application is a collection of VI files. You can manually take all of the files and put them into some archive such as a ZIP file, or you can save them into a LabVIEW LLB file using a deployment target.&lt;/div&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div align=left&gt;LabVIEW VIs can be built into stand-alone applications. For that, you build an application using the application builder. This used to be a stand-alone tool but is now integrated into the LabVIEW 8 project as a deployment option&lt;/div&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div align=left&gt;Making a small application is the same as items #1 and #3. The application builder will strip out all of the block diagrams and front panels automatically or you can do it manually through the source distribution as described in #1&lt;/div&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;div align=left&gt;Storing files in version control is still the most common question we get around this issue. LabVIEW does &lt;a href="http://zone.ni.com/devzone/conceptd.nsf/webmain/4E211360D196AA7D8625706E0063DC70?opendocument"&gt;integrate with version control systems&lt;/a&gt;. However, a common problem is that the VI files may have to change even if the source code doesn’t change. This means that you have to check out the file and check it back in even though the source code didn’t change. It’s a known issue that we continue to look at.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;span style="font-size: x-small"&gt;&lt;br /&gt;&lt;p&gt;Technocrati Tags: &lt;a href="http://www.technorati.com/tag/LabVIEW"&gt;LabVIEW&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-113811990052621587?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/113811990052621587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=113811990052621587' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/113811990052621587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/113811990052621587'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2006/01/deploying-labview-code.html' title='Deploying LabVIEW Code'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-113381599461500364</id><published>2005-12-05T12:53:00.000-08:00</published><updated>2006-04-03T13:35:59.823-07:00</updated><title type='text'>Untitled</title><content type='html'>&lt;p&gt;As a developer, it's great to hear about new and interesting applications of LabVIEW. I remember a few years ago seeing on ABC news a story by the late Peter Jennings on a researcher giving movement to quadripalegics. The researcher monitored the brainwaves of the patient and used the patterns to send electrical impulses to the muscles of the patient. The patient could think to open or close his hand and the system would essentially be a replacement nervous system. He was able to open and close his hand, move his arm, and write his name.  As the cameras panned across the equipment, LabVIEW was sitting there as the control system.  It's very inspring to know that our efforts are resulting in change in the world.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I just heard about another system today that is impressive, just on sheer scale. The &lt;a href="http://www.salt.ac.za/"&gt;South African Large Telescope's&lt;/a&gt; control system was &lt;a href="http://digital.ni.com/worldwide/southafrica.nsf/web/all/065F8FD28301F5DF86256F3A003ED952?OpenDocument&amp;node=200186_us"&gt;developed in LabVIEW&lt;/a&gt;. It's a system of over 10,000 VIs and allowed them to finish the telescope with many fewer programmers than if they had written the code in C.  That's cool....&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Technocrati Tags: &lt;a href="http://www.technorati.com/tag/SALT"&gt;SALT&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Telescope"&gt;Telescope&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/LabVIEW"&gt;LabVIEW&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-113381599461500364?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/113381599461500364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=113381599461500364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/113381599461500364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/113381599461500364'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/12/as-developer-its-great-to-hear-about.html' title='Untitled'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-113173826244763949</id><published>2005-11-11T11:18:00.000-08:00</published><updated>2006-04-03T13:36:46.400-07:00</updated><title type='text'>Storing and Retrieving Data</title><content type='html'>A few years ago, a colleague and I looked at all of the ways in LabVIEW you can store and retrieve data. The list was not only large but it was a bit embarrassing how incompatible all of the methods were. For example &lt;br /&gt;&lt;H3&gt;Mechanisms for performing data capture&lt;/H3&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Print VI front panel, &lt;a href="http://forums.ni.com/ni/board/message?board.id=170&amp;message.id=147366"&gt;at completion&lt;/a&gt; or manually triggered &lt;br /&gt;&lt;li&gt;Generate screenshot of VI manually and paste into report &lt;br /&gt;&lt;li&gt;&lt;a href="http://zone.ni.com/reference/en-XX/help/lv/71/lvhelp/Front_Panel_Datalogging/"&gt;Log at completion&lt;/a&gt;, Use the &lt;a href="http://dt.fme.vutbr.cz/%7Emeasure/Lv/glang1.htm"&gt;front panel playback feature&lt;/a&gt; &lt;br /&gt;&lt;li&gt;&lt;a href="http://zone.ni.com/reference/en-XX/help/lv/71/lvhelp/Front_Panel_Datalogging/"&gt;Log at completion&lt;/a&gt; and use the &lt;a href="http://zone.ni.com/reference/en-XX/help/lv/71/lvhelp/Retrieving_Logged_FP_Data/"&gt;"enable database access" function&lt;/a&gt; to retrieve the data &lt;br /&gt;&lt;li&gt;Generate report from front panel using &lt;a href="http://sine.ni.com/nips/cds/view/p/lang/en/nid/5769"&gt;reporting toolkit&lt;/a&gt; &lt;br /&gt;&lt;li&gt;Ascii Files - write to spreadsheet file &lt;br /&gt;&lt;li&gt;Binary file - write binary array to file&lt;br /&gt;&lt;li&gt;&lt;a href="http://zone.ni.com/reference/en-XX/help/lv/71/glang/Flatten_To_XML/"&gt;Load/Store XML file&lt;/a&gt; &lt;br /&gt;&lt;li&gt;&lt;a href="http://www.kip.uni-heidelberg.de/fp-computer/LabVIEW/FP_LabView/html/Writing_Datalog_Files.html"&gt;Datalog File&lt;/a&gt; - write and read cluster using file primitives &lt;br /&gt;&lt;li&gt;&lt;a href="http://www.ni.com/toolkits/lv_db_conn.htm"&gt;Database Toolkit&lt;/a&gt; &lt;br /&gt;&lt;li&gt;&lt;a href="http://zone.ni.com/reference/en-XX/help/371361A-01/lvconcepts/using_datasocket_technology/#Specifying_a_URL"&gt;DataSocket to File&lt;/a&gt; &lt;br /&gt;&lt;li&gt;&lt;a href="http://sine.ni.com/nips/cds/view/p/lang/en/nid/10418"&gt;LabVIEW DSC Module&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://cnx.rice.edu/content/m12273/latest/"&gt;LabVIEW Express File Storage VI&lt;/a&gt; &lt;/li&gt;&lt;/ol&gt;Whew. That's a lot. One thing that was frustrating when looking through this list is that there weren't many ways to store structured data. For example, it was difficult to take a lot of values, associate it with a "run" (time, date, location, etc..) and then store multiple "runs" in a particular place. I implemented it to an access database using the Database toolkit once and it was pretty time-consuming. Another observation is that there weren't many ways to browse the data that you had stored. There was the front panel datalogging "retrieve" function and there was the Citadel explorer in DSC but that was about it. You had to write a program in order to view the data you had stored. Various business forces combined to finally do something about this in LabVIEW 7.1 Our acquisition of GFS a number of years ago brought in a whole host of people experienced with storing and retrieving really large datasets. The two most important integrations between the two were &lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;You can open LabVIEW data files (the LabVIEW "measurement file format") in &lt;a href="http://www.ni.com/diadem/"&gt;DIAdem&lt;/a&gt;. It's a configuration based program that lets you retrieve and manipulate data sets. No more writing a program just to get your data back &lt;br /&gt;&lt;li&gt;The &lt;a href="http://zone.ni.com/devzone/conceptd.nsf/webmain/8FC230FC9BC4DE478625707B005E6825"&gt;LabVIEW Data storage VIs&lt;/a&gt;. The object of these VIs was to allow structured data to be stored in multiple different representations. The data could be stored in a measurement file, a DIAdem file, or ASAM-ODS databases. And again, the data could be read from DIAdem without writing a program to do it. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Hopefully, this will give you leg up when you try and implement an application that reads and stores technical data. One day, I'd love to see you have a virtual notebook. Something you can use to store random bits of data but still be able to retrieve it and query it. Find all of the runs of data that gave you the answer "5". Ah, someday...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Technocrati Tags: &lt;a href="http://www.technorati.com/tag/LabVIEW"&gt;LabVIEW&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/XML"&gt;XML&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/Database"&gt;Database&lt;/a&gt;, &lt;a href="http://www.technorati.com/tag/DIAdem"&gt;DIAdem&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-113173826244763949?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/113173826244763949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=113173826244763949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/113173826244763949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/113173826244763949'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/11/storing-and-retrieving-data.html' title='Storing and Retrieving Data'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112974541868235183</id><published>2005-10-19T11:02:00.000-07:00</published><updated>2005-11-21T09:29:57.896-08:00</updated><title type='text'>Stupid LabVIEW Trick - Swap Terminals</title><content type='html'>Quick piece of trivia for those who might find this useful.&lt;br /&gt;&lt;br /&gt;So you wired up a node, maybe even debugged it, and found out DOH! I wired them backwards (especially for a subtract primitive). There is a quick shortcut you can file away.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6985/26/1600/SwapTerminalsBefore.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6985/26/320/SwapTerminalsBefore.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you want to swap the wiring without deleting the wires and rewiring it, hold down the Control key (on Windows or similar key on the other platforms) and click on the top or the bottom wire terminal on the subtract primitive. Voila, the terminals get swapped.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: If you are not using the aut0-tool, you must have the wiring tool selected when you do this.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6985/26/1600/SwapTerminalsAfter.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6985/26/320/SwapTerminalsAfter.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112974541868235183?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112974541868235183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112974541868235183' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112974541868235183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112974541868235183'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/10/stupid-labview-trick-swap-terminals.html' title='Stupid LabVIEW Trick - Swap Terminals'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112932881047975537</id><published>2005-10-14T14:40:00.000-07:00</published><updated>2005-10-14T15:32:32.096-07:00</updated><title type='text'>Shipping Software</title><content type='html'>I became a "professional programmer" when I was 17. "Professional" because a freeware app I made got put in a floppy-disk based periodical and I got paid money for it. How cool. (&lt;a href="http://users.foxvalley.net/%7Ejoko/lib.html"&gt;Holy cow I found it&lt;/a&gt; KeyCapsGS - first published in 1988 I believe).&lt;br /&gt;&lt;br /&gt;So since 1988, I've had to deal with the question of "when the heck is software done?" Well, metaphorically, software is never actually done. There's always 2.0, 3.0. But when you're working on 1.0, when do you decide to ship it?&lt;br /&gt;&lt;br /&gt;As with all art forms, it depends on who's looking at it. I hope the software that controls the brakes of my car has zero bugs in it. Then again, all I really want is that there are no bugs that ever prevent me from stopping. So even safety critical software has some sort of acceptable bug threshold. If my screensaver applet crashes when I change modes, I may not even care.&lt;br /&gt;&lt;br /&gt;So my answer is: you ship it when the quality level is acceptable to your customers (and possibly regulatory bodies that have some sort of say in the matter)&lt;br /&gt;&lt;br /&gt;The concept of "acceptable level of bugs" doesn't &lt;a href="http://www.kmfms.com/whatsbad.html"&gt;sit with some people well&lt;/a&gt;.  But again, it's a matter of perspective.  The article quoted a study that found&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;...two separate people dissected one particular Microsoft program and found out, to their shock, that it was over 2,000% larger than it should have been.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Maybe Microsoft programs are indeed "bloated". But so what? Probably 100 people in the world really care enough not to buy their software. But if Microsoft went and rearchitected some application so that it met those folks' mythical standards, they probably would lose tens of thousands of sales to satisfy those 100 people. So calling software "done" isn't just a technical decision, it's a business one.&lt;br /&gt;&lt;br /&gt;So the key is to understand your customer base. Understand what they need. Understand what they want your software for. Is it being used in a safety critical system? Is it being used in a screensaver? Your biggest risk in software is misunderstanding the quality that the customer expects and giving them something different. If they expect more and you don't give it to them, they'll avoid it like the plague. If they expect less and you give them more, you may have wasted development time that a competitor used to snatch those customers away.&lt;br /&gt;&lt;br /&gt;LabVIEW 7.1 has a great reputation and we're all quite proud of that release.   But not all releases hit the "meet customer expectations" mark. I presided over a version of LabVIEW that had a bug "fix" in it that caused an even bigger bug than the one it fixed. Whoops. (Fortunately we pulled the release and fixed it before anyone noticed)  But in the end, our goal is always to make you happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112932881047975537?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112932881047975537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112932881047975537' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112932881047975537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112932881047975537'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/10/shipping-software.html' title='Shipping Software'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112871556992937036</id><published>2005-10-07T12:39:00.000-07:00</published><updated>2005-10-07T13:06:09.943-07:00</updated><title type='text'>The joys of symmetric multiprocessing</title><content type='html'>In my &lt;a href="http://ideasinwiring.blogspot.com/2005/06/end-of-free-lunch.html"&gt;End of the Free Lunch&lt;/a&gt; post, I mentioned how desktop CPUs are moving toward a multiprocessor architecture that will require major changes in the way programmers write software in order to attain higher performance. Well, this isn't just a trend in the desktop market. The embedded systems market is also seeing a proliferation of multi-CPU devices.  At first, they were exotic boards that used &lt;a href="http://www.entegra.co.uk/data_acq_and_dsp_boards_vme.htm#monaco67"&gt;parallel arrays for signal processing&lt;/a&gt;. Then, you saw hybrid systems with &lt;a href="http://focus.ti.com/general/docs/wtbu/wtbuproductcontent.tsp?templateId=6123&amp;navigationId=11990&amp;amp;path=templatedata/cm/product/data/omap_2420"&gt;two chips&lt;/a&gt; (sometimes in the same package), commonly used in cell phone applications. Now you are seeing rather standard architectures with dual cores, like a recently announced &lt;a href="http://eetimes.com/news/semi/showArticle.jhtml;jsessionid=G3OAY4HVI1EHYQSNDBCCKHSCJUMEKJVN?articleID=47903267&amp;_requestid=232453"&gt;PowerPC chip&lt;/a&gt; for military, telecom, and other embedded markets.&lt;br /&gt;&lt;br /&gt;What does this mean for embedded systems?  Well, opinions seem to vary.  Enea encourages asymmetric multiprocessing (i.e. an OS running on each chip and different programs running on different chips) in their article "&lt;a href="http://eetimes.com/news/semi/showArticle.jhtml;jsessionid=G3OAY4HVI1EHYQSNDBCCKHSCJUMEKJVN?articleID=47903267&amp;_requestid=232453"&gt;Who's afraid of asymmetric multiprocessing&lt;/a&gt;"&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;In addition, SMP is not well suited for many applications that require predictable, real-time response. It does not scale well to very large systems, and it lacks fault-tolerant features.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Firing back in the &lt;a href="http://www.rtcmagazine.com/home/article.php?id=100403"&gt;same magazine, QNX says&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;By running only one copy of the OS, SMP can dynamically allocate resources to specific applications rather than to CPU cores, thereby enabling greater utilization of available hardware. It also lets system tracing tools gather operating statistics and application interactions for the multi-core chip as a whole, giving developers valuable insight into how to optimize and debug applications.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;So whom do you believe? Well, it probably depends upon your application and your viewpoint on the world.  Coming from a developer on a huge code base, I'm firmly in the SMP camp.  Why?  Well, first, LabVIEW already runs well in an SMP system.  We put in a lot of work to make our application nicely multithreaded and I want our customers to be able to take advantage of it.  The second is that moving an application from a multithreaded environment to an asymmetric multiprocessing system (AMP) requires a change in architecture.  Changes in architecture are hard... &lt;a href="http://ideasinwiring.blogspot.com/2005/09/software-thats-built-to-last.html"&gt;Really hard&lt;/a&gt;. So I'm not "afraid" of AMP, but I'm certainly "annoyed" that I'd have to contemplate it.&lt;br /&gt;&lt;br /&gt;Yes, SMP will never work across two different types of processors.  That's what we've got &lt;a href="http://www.ni.com/labview/"&gt;LabVIEW 8 with Distributed Intelligence&lt;/a&gt; for...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112871556992937036?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112871556992937036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112871556992937036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112871556992937036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112871556992937036'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/10/joys-of-symmetric-multiprocessing.html' title='The joys of symmetric multiprocessing'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112802317236389744</id><published>2005-09-29T12:26:00.000-07:00</published><updated>2005-09-29T12:47:11.466-07:00</updated><title type='text'>Software that's built to last</title><content type='html'>An &lt;a href="http://www.windowsitpro.com/windowspaulthurrott/Article/ArticleID/47865/windowspaulthurrott_47865.html"&gt;article &lt;/a&gt;on the Windows Vista release tells the story of how Microsoft realized (belatedly) that their development practices no longer supported the release of their software. Microsoft lost a tremendous amount of time because their software wasn't flexible enough to handle the changes they wanted to put into it.&lt;br /&gt;&lt;br /&gt;Take a look at the applications you use on a daily basis. When was "1.0" of your internet browser released, your email program, the instant messenger program, your music player. In many cases, it's only been around 4-5 years. "Windows", even the NT codebase, has been around since 1992. LabVIEW was first released in 1986. How in the world do you write code that still runs twenty years later?&lt;br /&gt;&lt;br /&gt;Most software products change by the addition of features. We add new capabilities that customers are willing to pay money for. The ease of adding those features is directly related to the architecture of the code. A "good" architecture makes adding features easy, a "bad" architecture makes adding features hard. Unfortunately, it's not really that easy. When NI started writing LabVIEW, "networks" were in their infancy (remember ARCNET and token ring? NI actually used GPIB cables to send data between machines at one point). Who knew that one day we'd be doing data servers, remote panels, and web browsers integrated in to LabVIEW? Feature needs change over time. Unfortunately, architecture is much harder to change and it requires real work, it doesn't just happen on its own.&lt;br /&gt;&lt;br /&gt;So, have you ever bought software with the bullet point "rearchitected for better developer maintanability!" I don't recall that one making it on &lt;a href="http://www.ni.com/labview/"&gt;"LabVIEW Key Benefits" list&lt;/a&gt;. Our customers don't pay for it directly and your customers don't buy your software because you made improvements. But, if you want your software to last, you need to invest in architecture changes. Features pay the bills this year, architecture pays the bills next year. &lt;a href="http://en.wikipedia.org/wiki/Refactor"&gt;Learn &lt;/a&gt;how to &lt;a href="http://martinfowler.com/books.html#refactoring"&gt;refactor&lt;/a&gt;, or else you will end up with a &lt;a href="http://www.joelonsoftware.com/articles/fog0000000069.html"&gt;rewrite&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112802317236389744?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112802317236389744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112802317236389744' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112802317236389744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112802317236389744'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/09/software-thats-built-to-last.html' title='Software that&apos;s built to last'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112664965312951392</id><published>2005-09-13T15:12:00.000-07:00</published><updated>2005-09-13T15:18:34.540-07:00</updated><title type='text'>Remembering your work</title><content type='html'>Whenever you have multiple developers working on the same file, be it a program source file, a graphics file, or even documentation, they are going to start stomping on each other at some point. A team typically turns to a source code management system (SCM) to help with this problem. However, most individual developers don't ever use these systems and that's a shame.  The beauty of an SCM system is that you can still recover from an "oops" after you accidentally hit "Save" instead of "Save As...".  You can get your precious work back if your filesystem corrupts that all important file. And, the way I use it most, you can go back and figure out why your system worked better before you added that last "feature".&lt;br /&gt;&lt;br /&gt;I've used many different systems over the years but there are two packages out there that I recommend most for the personal user.  They are both industrial strength (because you always end up needing it) but are user friendly enough that I think most any developer could figure them out.  They are cross-platform.  And, most importantly, they are both free for personal use.&lt;br /&gt;&lt;br /&gt;The first is &lt;a href="http://www.perforce.com/"&gt;Perforce&lt;/a&gt;. &lt;a href="http://www.perforce.com/perforce/success/ni.html"&gt;We use it internally at NI&lt;/a&gt; and it's quite good. Even though it can handle our more than 5 million files, it really works well for just a few files also. You just &lt;a href="http://www.perforce.com/perforce/loadprog.html"&gt;download the client and the server&lt;/a&gt; and run them on your laptop, desktop machine, or whatever.  It works over the network if you need it to.&lt;br /&gt;&lt;br /&gt;The second is &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;.  It's an open source SCM system that is trying to replace the open source standby CVS. We're using it on the LabVIEW Embedded Development Module public repository and so far it's working nicely. It is much much easier to use than CVS but it has the features that I care about. There's a windows shell extension called &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt; that makes all of the management rather easy.  I found &lt;a href="http://weblogs.asp.net/nleghari/articles/subversion.aspx"&gt;a blog&lt;/a&gt; with some links that are probably useful.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112664965312951392?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112664965312951392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112664965312951392' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112664965312951392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112664965312951392'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/09/remembering-your-work.html' title='Remembering your work'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112541830505845890</id><published>2005-08-30T08:58:00.000-07:00</published><updated>2005-08-30T09:11:45.066-07:00</updated><title type='text'>Behavior Changing Technology</title><content type='html'>5-6 years ago, an &lt;a href="http://ni.com/niweek"&gt;NIWeek&lt;/a&gt; keynote speaker explained how the rise of broadband to the home would change the way people used the Internet. It wasn't due to the increased speed of broadband over dial-up. He said it would be due to the Internet being "always on".  While it only took 60 seconds for the modem to dial, connect, and start passing data, the reduction of this time to 1 second would cause a fundamental usage change.  Today, the Internet has certainly become pervasive and I can't argue with his reasoning.&lt;br /&gt;&lt;br /&gt;I noticed the same thing when I installed my wireless LAN in my house.  Besides learning that Macs were infinitely superior in the "it just works" category, it was amazing to see the difference in how I used my laptop and its networking capabilities. This was not just "cable replacement", it caused a switch in the way I used the technology. I see it every day with people bringing their laptops to meetings so they can look up information during the meeting or "hiding" in a conference room to get real work done.&lt;br /&gt;&lt;br /&gt;These two examples both show that advancing the technology doesn't necessarily mean that you can simply "do more" along the same axis that the technology advanced. Yes, you can download bigger files over broadband, but it's causing bigger changes than just that.&lt;br /&gt;So what technologies are going to change the T&amp;amp;M world? "Wireless sensors" is an emerging technology. Is cutting the cord and reducing wiring costs the only benefit? Or will it cause a shift more substantial? What if you could hook up to a sensor without disturbing the others who are taking that data? What happens when I can "see" the thermostat on the wall, or the car counting sensor in the concrete? Ah the possibilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112541830505845890?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112541830505845890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112541830505845890' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112541830505845890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112541830505845890'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/08/behavior-changing-technology.html' title='Behavior Changing Technology'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112419382951635387</id><published>2005-08-16T05:00:00.000-07:00</published><updated>2005-08-16T05:03:49.523-07:00</updated><title type='text'>Performance Hint</title><content type='html'>Since it's the first day of NIWeek, here's a performance tip for everyone&lt;br /&gt;&lt;br /&gt;The traditional LabVIEW demo is to place a random number generator feeding a chart indicator inside a while-loop and running it. The application merrily generates nice wavy lines on the graph at high speed.  Clone the loops so that there are two in parallel and they update simultaneously. It shows how quickly you can make some sort of interactive application with LabVIEW. Unfortunately, we are showing a bit of bad programming style in this demo.  Luckily, there's an easy way to turn that example from a "huge consumer of CPU time" to an "appropriate programming model". Convert the while-loop into a timed-loop and set the loop speed to 60Hz. There's no reason to update your UI faster than the refresh rate of your monitor. It will save a lot of CPU bandwidth for other things.&lt;br /&gt;&lt;br /&gt;This is a trick you can use at home. Look through your code and see if you have indicator terminals inside loops. Does that indicator really need to be inside that loop? Do you really need to update the indicator more than once? Updating an indicator takes time, especially when the front panel is visible (&lt;a href="http://ideasinwiring.blogspot.com/2005/05/benchmarking-labview-operation.html"&gt;or even just in memory&lt;/a&gt;). If it doesn't need to be updated frequently, pull that indicator terminal out of the loop.&lt;br /&gt;&lt;br /&gt;If the indicator really does need to be updated in that loop, are you waiting at all in the loop, either via the wait primitive or via the timed loop? If not, you should probably add one. Otherwise, you are going to eat a lot of CPU time doing needless work.&lt;br /&gt;&lt;br /&gt;A few years ago, I took a look at a customer's application because it was running differently on a laptop than it did on our embedded controllers. The application had a main loop that was acquiring data and it wasn't running quickly enough. After peeking at it for 30 seconds in the LabVIEW profiler, I saw that it was spending 98 percent of its time in a subVI that wasn't even called in the loop. Huh? It turns out that the application was spawning a hidden dialog box that had no wait in it. As you may remember from my &lt;a href="http://ideasinwiring.blogspot.com/2005/05/55ms.html"&gt;55ms article&lt;/a&gt;, LabVIEW tries to balance the needs of parallel operations. This hidden dialog was eating all of the CPU time and crushing the performance of the application. Simply adding a wait primitive to that one dialog increased the data acquisition loop speed by TEN TIMES. &lt;br /&gt;&lt;br /&gt;Check your waits&lt;br /&gt;Use the profiler&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112419382951635387?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112419382951635387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112419382951635387' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112419382951635387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112419382951635387'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/08/performance-hint.html' title='Performance Hint'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112370087015701865</id><published>2005-08-10T11:48:00.000-07:00</published><updated>2005-08-10T12:07:51.470-07:00</updated><title type='text'>Embedded stuff at NIWeek</title><content type='html'>So if you are an NI customer, you probably know that &lt;a href="http://www.ni.com/niweek/"&gt;NIWeek&lt;/a&gt; is next week. If didn't know NIWeek is next week, let me know and I will give our sales folks and PR department 50 lashes... This is your chance to come see what we've got up our sleeves and talk to the folks that designed and implemented all of these products. It was a lot of fun last year showing LabVIEW programming a Nintendo Gameboy-based robot, which was really a sneak-peak at the Embedded Development Module.&lt;br /&gt;&lt;br /&gt;Embedded, DSP, and PDA presentations are all over NIWeek and, for those of you interested in running LabVIEW off the desktop, I encourage you to catch one or more of the following sessions:&lt;br /&gt;&lt;br /&gt;Intro to the LabVIEW Embedded Development Module - 1:30pm Tuesday&lt;br /&gt;Hands-On LaVIEW PDA Module - 2:45pm Tuesday (also 11:45am Wednesday)&lt;br /&gt;Teaching with LabVIEW DSP - 4pm Tuesday&lt;br /&gt;&lt;br /&gt;Keynote on Wednesday - you don't want to miss that one - 8:30am Wednesday&lt;br /&gt;Embedded Processors and FPGAs as a Target Platform for LV Embedded - 1:30pm Wednesday&lt;br /&gt;Hands On - Using LabVIEW Embedded with Blackfin Processors - 1:30pm Wednesday&lt;br /&gt;&lt;br /&gt;Hands On - Using LabVIEW Embedded with Blackfin Processors - 10:30am Thursday&lt;br /&gt;LabVIEW for Embedded Design - 11:45am Thursday&lt;br /&gt;&lt;br /&gt;I'll be running around constantly for the next week.  Maybe we should have a "meet the bloggers" night with the other &lt;a href="http://www.ni.com/blogs"&gt;bloggers at NI&lt;/a&gt;. There's a good chance I'll be wandering around the expo hall Wednesday after 5pm.&lt;br /&gt;&lt;br /&gt;Speaking of Wednesday night, if you want to see a bunch of 11-year olds outsmarting experienced engineers, check out the &lt;a href="http://digital.ni.com/express.nsf/bycode/exz7gc"&gt;RoboLab challenge&lt;/a&gt;.  It's pretty amazing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112370087015701865?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112370087015701865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112370087015701865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112370087015701865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112370087015701865'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/08/embedded-stuff-at-niweek.html' title='Embedded stuff at NIWeek'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112265801802784517</id><published>2005-07-29T10:12:00.000-07:00</published><updated>2005-07-29T10:26:58.033-07:00</updated><title type='text'>What do you call yourself?</title><content type='html'>I recently was out visiting developers, some who already used LabVIEW and some who don't, taking input on the &lt;a href="http://www.ni.com/labview/embedded_dev_module.htm"&gt;LabVIEW Embedded Development Module&lt;/a&gt;. One thing that we know is that LabVIEW allows engineers to program a system even though they don't have a computer science degree or haven't spent years learning C or C++. Unfortunately, we don't have a catchy phrase to describe this class of person.  In NI's traditional test market, we could call these folks "test engineers" and that was close enough.  Yes, some test engineers knew C and some didn't but it didn't require splitting hairs.&lt;br /&gt;&lt;br /&gt;But what about the embedded programming market?  You can't currently program an embedded system unless you know C or C++. There's nothing else to use except for a tiny bit of Java and some oldschool ADA or assembly folks.  Everyone could probably be defined as a Computer Scientist.&lt;br /&gt;&lt;br /&gt;So who is LabVIEW enabling?  We have taken to calling the folks that the LabVIEW Embedded Development Module enables "domain experts".  After all, they have a lot of valuable knowledge (expertise), even though it isn't in C programming.  They have expertise in their domain, be it control theory, biology, mechanics, chemistry, signal processing, whatever.  Unfortunately, this term doesn't seem to be understood generally.  One person said to me "I saw the word 'domain' and thought you meant the Internet".  Hmm, not quite what we had in mind.  Other suggestions have been "System Architect" though I'm not sure if that resonates. LabVIEW allows people with big picture knowledge to implement the system but we do expect the person to know some low level details of how the thing actually does work. "Application programmers" in my opinion would be assumed to be computer scientists. "Signal processing" engineers certainly like LabVIEW but that's too narrow. &lt;br /&gt;&lt;br /&gt;So, what do you call yourself?  If I called you a "domain expert", would the label fit? Would you be offended?  Does it sound too grand? Not grand enough?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112265801802784517?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112265801802784517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112265801802784517' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112265801802784517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112265801802784517'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/07/what-do-you-call-yourself.html' title='What do you call yourself?'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112181228773059538</id><published>2005-07-19T15:07:00.000-07:00</published><updated>2005-07-19T15:31:27.740-07:00</updated><title type='text'>Poll: Show Buffers?</title><content type='html'>LabVIEW has programming semantics of "by value". Data on a wire represents the "value" of that thing. You don't have "pointers" to data. You don't typically have "references", except when you are referring to certain objects like files or controls. Being a by-value language rather than a by-reference language makes programming in it less error prone and easier for folks to understand. However, for programmers experienced with languages that make extensive use of by-reference semantics (C &amp; C++ come to mind), it requires a mental shift that some of them aren't happy with.&lt;br /&gt;&lt;br /&gt;But I'm not going to start that debate. Instead, I'll talk about the implication of by-value semantics. Let's take the basic case of adding two arrays.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6985/26/1600/addarrays1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6985/26/200/addarrays1.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The semantics are easy, input 1 and input 2 are arrays. They get added together and placed into the output indicator.  Now, a C programmer would look at this and say "aha! After an item in Input 2 is looked at, it isn't needed any more. I can save memory by taking the result of the addition and storing it back in the memory that was used for Input 2".  That is a nice optimization.  Unfortunately for the C developer, they would have to write their algorithm differently in order to do that optimization. They would have to store data back into the array by effectively using references. &lt;br /&gt;&lt;br /&gt;In LabVIEW, there's no way to get a reference back to Input 2 and store the data back there.  We really don't want you to do that anyway.  Instead, we'd rather have LabVIEW figure it out and do it for you.  And that's exactly what we do using something we call "the inplaceness algorithm".  This algorithm figures out what memory locations can be reused to make the application  take less memory and run more efficiently.  Is this algorithm perfect? No.  Does it work? Yes, quite well in fact.&lt;br /&gt;&lt;br /&gt;We added a feature to LabVIEW in 7.0 via DevZone and as a true menu item in 7.1 to let you peek under the hood of LabVIEW and watch the inplaceness algorithm work.  If you select Tools--&gt;Advanced--&gt;Show Buffer Allocations... you can see this tool in operation&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6985/26/1600/showbuffers1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6985/26/200/showbuffers1.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It shows you all of the places that LabVIEW decided that it couldn't reuse memory and had to create another buffer to hold the output data. I will say that this is an advanced tool. It doesn't interpret the location of the buffers, it just shows you where they are.  It is not possible to get rid of all buffers, don't try. :-) You can find out a little more about how to use it by clicking the help button or looking at this &lt;a href="http://zone.ni.com/reference/en-XX/help/lv/71/lvdialog/Show_Buffer_Alloc/"&gt;help link&lt;/a&gt;. The &lt;a href="http://zone.ni.com/devzone/devzoneweb.nsf/opendoc?openagent&amp;2B85FEE11F13194C86256A370054C805&amp;amp;cat=8382DFCE5A73BBDD862567AC005842AB"&gt;LabVIEW Memory Management Application Note&lt;/a&gt; also gives you insight into what is going on.&lt;br /&gt;&lt;br /&gt;So here's a question for the audience.  Have you used this tool?  Is it helpful?  What else would you want to know? (no promises here folks)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112181228773059538?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112181228773059538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112181228773059538' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112181228773059538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112181228773059538'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/07/poll-show-buffers.html' title='Poll: Show Buffers?'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-112008262176774239</id><published>2005-06-29T14:41:00.000-07:00</published><updated>2005-06-30T11:47:53.876-07:00</updated><title type='text'>Writing Parallel Programs in LabVIEW - Part 1</title><content type='html'>In my post about &lt;a href="http://ideasinwiring.blogspot.com/2005/06/end-of-free-lunch.html"&gt;how the CPU business is going to multi-core processors&lt;/a&gt;, I talked about how LabVIEW can help things. Here's the first in an occasional series of things I can think of that help LabVIEW applications run in parallel on multi-CPU machines.&lt;br /&gt;&lt;br /&gt;1) Read the paper about &lt;a href="http://zone.ni.com/devzone/conceptd.nsf/webmain/01f2e634710fb8e486256e2900586d41"&gt;Hyperthreading and LabVIEW&lt;/a&gt;.  That shows you all about the LabVIEW threading model, clumps, and how to write some basic applications that do run in parallel.&lt;br /&gt;&lt;br /&gt;2) Learn about &lt;a href="http://digital.ni.com/public.nsf/allkb/98847B4E4C715E6D86256C59006B57CC"&gt;re-entrant SubVIs&lt;/a&gt;. Normally, a VI that is called from two places in parallel will not actually execute in parallel.  Otherwise, the data from one iteration would stomp on the data running in the other. Therefore, you need to mark the VI as re-entrant.&lt;br /&gt;&lt;br /&gt;There's a hard way and an easy way to do this.  The easy way is to go to the VI properties and mark the VI as re-entrant, then drop down the VI in all of the places you want to use it. This was shown in the &lt;a href="http://zone.ni.com/devzone/conceptd.nsf/webmain/01f2e634710fb8e486256e2900586d41"&gt;Hyperthreading and LabVIEW&lt;/a&gt; paper.&lt;br /&gt;&lt;br /&gt;But what if you don't know how much parallelism you want when you write the program?  What if you don't know how many channels you are going to run in parallel?&lt;br /&gt;&lt;br /&gt;One application note on this is &lt;a href="http://zone.ni.com/devzone/conceptd.nsf/webmain/8AF7C1F462111E5586256E510072B85C"&gt;Multi-Tachometer Processing with the Order Analysis Toolkit&lt;/a&gt;.  Order Analysis is accomplished through a long computation (FFT). If you have multiple channels, you can compute multiple channels in parallel on a multiprocessor machine.  Add more processors, compute more channels in the same amount of time.   This appnote shows you how to dynamically add more parallelism based on the number of channels you are processing.&lt;br /&gt;&lt;br /&gt;3) Make sure you don't get serialized in Call Library Nodes either.  If a Call Library node isn't marked as &lt;a href="http://zone.ni.com/devzone/conceptd.nsf/webmain/B26A875ACA51C567862567CA0055FF24"&gt;threadsafe&lt;/a&gt;, LabVIEW will serialize calls to the DLL. However, unlike a VI, just changing the Call Library Node to reentrant is NOT a good idea unless you are positive the code is really threadsafe.  If it is threadsafe, then it's always a good idea to mark the Call Library Node as reentrant. There is no downside (and there's a big performance boost to marking a Call Library Node reentrant).&lt;br /&gt;&lt;br /&gt;4) Be judicious in your use of re-entrant SubVIs.  If your VI that you want called in parallel calls other VIs, you may need to make those SubVIs you call re-entrant also. However, it's a bad move to mark absolutely everything as re-entrant. When you do that, it causes extra copies of every single VI's dataspace to be created. That can result in a HUGE memory footprint and you won't realize it.  Therefore, be selective. Use the profiler to help determine which VIs should be marked as re-entrant. The VIs that execute for a long time (or have children that execute for a while) should be marked as re-entrant if there is any chance they will be called in parallel.  The short quick VIs can be left as normal since they won't typically get called simultaneously or, even if they do, they won't block for very long.&lt;br /&gt;&lt;br /&gt;There are some other tricks but I'll save those for another time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-112008262176774239?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/112008262176774239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=112008262176774239' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112008262176774239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/112008262176774239'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/06/writing-parallel-programs-in-labview.html' title='Writing Parallel Programs in LabVIEW - Part 1'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-111922483255582496</id><published>2005-06-19T16:39:00.000-07:00</published><updated>2005-06-19T16:51:33.100-07:00</updated><title type='text'>Lessons from other industries</title><content type='html'>You can learn a lot just watching the mistakes of others. Here's one I hope we never make: forgetting the reason for your company's existence.&lt;br /&gt;&lt;br /&gt;I'm a car-nut. I've spent my life pouring through the pages of auto magazines.  I asked my dad to buy a Ferrari when I was age 10 (he didn't go for it). I've been to the Indy 500, drag races, NASCAR at Watkins Glen, and a host of other events.  Today, I watched what happens when a group of folks forget why they're around.  At the US Grand Prix Formula One race, one of the tire manufacturers (Michelin) screwed up.  They brought tires that were unsafe for the track and couldn't fix it in time for the race. The various power players butted heads, couldn't reach an agreement, and so the Michelin teams didn't race.  The "Grand Prix" consisted of a grand total of 6 cars starting and finishing the "race", if you could call it that. The fans were livid.  They changed their schedules and paid anywhere from a few hundred dollars to a few thousand dollars to be there.&lt;br /&gt;&lt;br /&gt;If there were zero fans in the grandstands and zero viewers on TV, the decisions made by all involved were probably correct. Neither Formula One nor the other tire manufacturer (Bridgestone) should have had any reason to accommodate Michelin. Michelin screwed up and the teams that relied on Michelin were wrong by having no fallback position.  Motor racing at its purest is Darwinian. Those that are unprepared should not succeed.&lt;br /&gt;&lt;br /&gt;But, it's obvious that all people involved (Formula 1, Michellin, Bridgestone, the head of the various organizations, the lead team owners, etc..) have forgotten why they pour billions of dollars into the sport, it's for the fans stupid.  Teams won't spend $400 million/year if there's no audience. If they had cared about the fans, they would have forged a real compromise and allowed something that allowed the fans to be happy. Not because it was the proper racing thing to do, because it was the proper way to treat the fans. Instead, they put their competitiveness above all reason on display for the world today. Today I think they killed the golden goose.  They forgot who pays their bills.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-111922483255582496?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/111922483255582496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=111922483255582496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111922483255582496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111922483255582496'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/06/lessons-from-other-industries.html' title='Lessons from other industries'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-111877304859810591</id><published>2005-06-14T11:17:00.000-07:00</published><updated>2005-06-14T11:17:28.603-07:00</updated><title type='text'>The End of the Free Lunch</title><content type='html'>Ok, so there's &lt;a  href="http://www.mgtaylor.com/public/2001/tanstaafl.html"&gt;No Such Thing as a Free Lunch&lt;/a&gt; but in the computing world the processor vendors like Intel were buying lunch for everyone.&amp;nbsp; I headed up the LabVIEW Performance team for about 2 years and had a pretty easy job.&amp;nbsp; All our group had to do to make LabVIEW faster was to wait 18 months and let Intel double the speed of their processors. It almost made cutting 20% off of some array manipulation feel rather worthless.&amp;nbsp; As you've probably been noticing, that 4 Gigahertz Pentium that you were expecting never quite happened.&amp;nbsp; We've been stuck at 3.2ish GHz for quite some time now.&amp;nbsp; So what's going on?&amp;nbsp; CPU vendors have discovered that they can't keep increasing the clock rate the way they used to. In fact, their entire paradigm for extracting more speed has fallen down.&amp;nbsp; Thus, they've all changed course and gone &lt;a  href="http://arstechnica.com/news.ars/post/20050302-4663.html"&gt;dual core&lt;/a&gt;. Now, instead of doubling the speed, they are going to give you two processors next year for the same price as one processor this year.&amp;nbsp; But does your software still get twice as fast?&lt;br&gt; &lt;br&gt; Well.... maybe. Software written in C needs to be specially written in order to take advantage of the second processor. Windows XP, MacOS X, and Linux all support Symmetric Multiprocessing (SMP). This allows chunks of code to run on either processor without the software noticing which processor it is running on.&amp;nbsp; The smallest "chunk" that can run on a different processor is known as a "&lt;a  href="http://en.wikipedia.org/wiki/Thread_%28computer_science%29"&gt;thread&lt;/a&gt;". In C, you split your code into different sequential paths and call some extra libraries that schedule those paths using the separate threads. If you do this, you call your application "multi threaded".&amp;nbsp; LabVIEW became a multi threaded application in &lt;a  href="http://whitepapers.zdnet.co.uk/0,39025945,60005171p-39000404q,00.htm"&gt;version 5.0&lt;/a&gt; and &lt;a  href="http://www.ccur.com/corp_news_pressrelease.asp?pressreleaseid=30"&gt;ran on SMP computers&lt;/a&gt;. In the past 6 years multiprocessor machines have been rather rare. They were typically server machines that were four times more expensive than typical desktop machines.&amp;nbsp; This may have been rather fortunate because it takes a while to get the kinks out of your software. We found all sorts of bizarre bugs (both in hardware and in software) on multiprocessor machines. Once Intel started putting &lt;a  href="http://en.wikipedia.org/wiki/Hyper-threading"&gt;Hyperthreading&lt;/a&gt; in their desktop processors, we saw average users have SMP machines.&lt;br&gt; &lt;br&gt; Now, I mentioned that C code needs to be specially written to take advantage of multiple processors. What about LabVIEW code?&amp;nbsp; Getting code to run &lt;b&gt;correctly&lt;/b&gt; and &lt;b&gt;more quickly&lt;/b&gt; on a multiprocessor machine requires code to be scheduled for correctness and maximum efficiency. In order to get the code to run correctly, the system needs to only schedule chunks of code to run when the data is available. In short, it needs to know the data flow of the program.&amp;nbsp; That's what LabVIEW does. It schedules your code using data flow rules.&amp;nbsp; Thus, on a multiprocessor machine, data flow code will execute correctly. (Note: you've learned all along that globals in LabVIEW can be bad... This is yet another place that they become bad). Using data flow rules, LabVIEW will automatically figure out which code can run independently and start both chunks of code running at the same time.&amp;nbsp; Remember my example about &lt;a  href="http://ideasinwiring.blogspot.com/2005/05/55ms.html"&gt;parallel while loops&lt;/a&gt;? On an SMP system, these loops will run completely in parallel on separate processors.&amp;nbsp; There's no need to share the processor so there's no need to ping-pong back and forth. &lt;br&gt; &lt;br&gt; Thus, LabVIEW programs will &lt;b&gt;automatically&lt;/b&gt; spread themselves across multiple CPUs. You don't need to do anything.&amp;nbsp; There are some NI customers who see the speed of their applications double when adding a second processor (or triple or quadruple when adding a third or fourth).&amp;nbsp; So, does Intel in combination with NI give you a free lunch?&amp;nbsp; Maybe.&amp;nbsp; It turns out that not all programs get that nice speed boost when adding an additional processor.&amp;nbsp; I'll give you some tricks in the next article.&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-111877304859810591?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/111877304859810591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=111877304859810591' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111877304859810591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111877304859810591'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/06/end-of-free-lunch.html' title='The End of the Free Lunch'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-111833063179987043</id><published>2005-06-09T08:23:00.000-07:00</published><updated>2005-06-09T08:23:51.806-07:00</updated><title type='text'>Abstracting the hardware</title><content type='html'>Tuesday was a very big day for my group and the timing is rather interesting. &lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;Monday, Apple announced they were &lt;A href="http://www.apple.com/pr/library/2005/jun/06intel.html"&gt;switching from PowerPC to Intel x86 processors&lt;/A&gt;.  Mac software developers everywhere were both overjoyed that they were getting a faster processor and dismayed that now they have to do some work just so their software keeps working. Software is very sensitive to its operating environment and needs to be modified or recompiled when the environment changes in unanticipated ways.  Fortunately, changing processors is actually less of a problem these days than changing operating systems.  Applications written in C on WindowsCE basically runs on MIPS, X86, or ARM systems. It needs a recompile and it needs to be tested, and tested, and tested (write once, test multiple). Software written in interpreted languages like Java, Javascript, or PHP don't even need to be recompiled. They just need to be tested on the different platforms.  It's the testing, though, that can eat up a lot of time and expense. Why all the testing? There are subtle differences between each implementation of the environment.  Javascript apps run differently in Internet Explorer than in Mozilla.  Java apps have different environments on Sun versus Windows versus Mac. &lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;LabVIEW (the code representing the development or execution environment), over its history, has been shipped on Macintosh (68k and PowerPC for MacOS "Classic" and MacOS X), Win3.1 through WinXP (x86 CPUs), Sun Solaris (on SPARC processors), SCO Unix, Linux, HPUX (on PA-RISC), Concurrent PowerMAX, PalmOS, PocketPC (ARM), Windows CE, RTX, and PharLap. In fact, it has outlived most if not all of the compilers used to create it. Every time we ship LabVIEW, the testing needs to be duplicated across each platform, at least for the places the are different between them. Over time, we've dropped some platforms when the sales we got from that platform no longer covered the cost of testing and support.&lt;BR&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;Sometimes, we do ports of LabVIEW internally to satisfy some curiosity or as a one-off experiment. We did a version of LabVIEW with the Jet Propulsion Laboratory to see whether it made sense to write software for space flight applications in G.  The experiment is still going on but the results look promising.&lt;/DIV&gt;&lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;We have talented developers but at the end of the day, you can only support a limited number of configurations.  We commonly get requests for LabVIEW to run on some hardware that we don't currently run on, be it a military VME controller running VxWorks, an automotive telematics system running QNX, or an engine controller for a train running a custom operating system. Building a new version of LabVIEW to run on these platforms just hasn't been an option. Before today, we always had to say no.  But today we announced the &lt;A href="http://www.ni.com/labview/embedded_dev_module.htm"&gt;LabVIEW Embedded Development Module&lt;/A&gt; and we don't have to say "no" any more.&lt;/DIV&gt;&lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;Over Christmas break, when no one was around, I got a week to play.  I took a development version of the software and found the cheapest embedded target I could: a &lt;A href="http://www.linksys.com/products/product.asp?prid=508&amp;scid=35"&gt;Linksys WRT54G&lt;/A&gt; router.  $69 from Frys. Linksys runs Linux on the box and some enterprising hackers had figured out &lt;A href="http://www.batbox.org/wrt54g-linux.html"&gt;how to write applications that would run on the unit&lt;/A&gt;.  It took me a little bit of time but in about a week I had adapted LabVIEW to run on the unit using the Embedded Development Module.  When I hit the run button on my VI, it would take the VI, convert it to C, script the compiler for the platform (GCC) to build the application, call some scripts to download the code to the router, start the program running, open a TCP/IP connection back to the host, and let me interact with the application just like I was talking to a LabVIEW RT target.  I had a new toy and grinned ear to ear.  LabVIEW running on a router of all things.  Even better, it ran as a multitasked application so my Linksys box actually routed packets while my application was running.  The Linksys box has no real I/O but it has 5 Ethernet ports and a WiFi antenna.  I'm sure someone could do something with it.  The best I could do was write a program to control an ENET-GPIB box connected to an instrument.  $69 instrument control.  How fun.&lt;/DIV&gt;&lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;Linksys also makes a device with an Ethernet connection and a USB master connection.  Wonder what I can do with that USB port....&lt;/DIV&gt;&lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-111833063179987043?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/111833063179987043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=111833063179987043' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111833063179987043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111833063179987043'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/06/abstracting-hardware.html' title='Abstracting the hardware'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-111703584311588738</id><published>2005-05-25T08:19:00.000-07:00</published><updated>2005-05-25T08:44:03.120-07:00</updated><title type='text'>Weak Linked Languages</title><content type='html'>As I watch LabVIEW build.... and build... and build... it reminds me of why C++ is the wrong direction for computer languages.  I stopped getting &lt;a href="http://www.cuj.com/"&gt;C/C++ Users Journal&lt;/a&gt; a few years ago because each issue was more depressing than the previous. The trends shown in that magazine were toward an ever increasing amount of templating.  I don't object to generic programming. I do object to the way that C++ does it. C++ aims for maximum generated code efficiency by trying to include and inline everything. The more the compiler knows during a pass, the better code it can generate. This has two problems. First, C/C++ compilers work on one object file at a time. The only way to give the compiler more information to work with is to put more and more information into each object file (via the #include statement).  More information for each object file means slower compile time for the object file.  In a source base the size of LabVIEW, that adds up to a ton of time.  The second problem is that it couples all of your source files together.  If you make a change to the implementation of your "list" class, the implementation of that class is inlined into every single source file, necessitating a rebuild of every single source file.  The build/fix/debug cycle becomes 30 minutes for every line of code you change.  That's a productivity killer.&lt;br /&gt;&lt;br /&gt;There is a whole class of languages that doesn't work that way.  I call them "weak linked" languages.  These languages try to have minimal dependencies between objects.  They give up a little in run-time efficiency because they have to discover some things at run-time that C++ programs set at compile time but the programmer productivity tradeoff is huge.  Languages like C#, Java, and LabVIEW only make you "compile" the file that you just touched, not the other 5,000 files that may come in contact with the file you touched. Build/fix/debug in LabVIEW is 5 seconds for just about any change.&lt;br /&gt;&lt;br /&gt;Beyond compile time, weak linked languages give you some other cool benefits.  Notice how in LabVIEW, you can open a heirarchy of 200 VIs, go to any one of them, and hit the Run button and run the thing?  A weakly linked language gives you that flexibility.  Java has something a bit like it, though it's IMHO inferior :-) Any class in Java can have a "main()" function.  From the command line, you can just start up the program by calling any classes main(), not just the one big entry point that is supposed to start the program.  The &lt;a href="http://junit.sourceforge.net/"&gt;JUnit framework&lt;/a&gt; takes advantage of that benefit to make a nice unit test system.&lt;br /&gt;&lt;br /&gt;Just as programmers gradually gave up assembly language to get more productivity (and more maintainable code) in spite of a slight loss in run time efficiency, languages like LabVIEW are the way programming will be done in the future.   The folks around me who program in G already know that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-111703584311588738?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/111703584311588738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=111703584311588738' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111703584311588738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111703584311588738'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/05/weak-linked-languages.html' title='Weak Linked Languages'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-111653574901687120</id><published>2005-05-19T13:49:00.000-07:00</published><updated>2005-05-19T14:28:50.186-07:00</updated><title type='text'>Benchmarking a LabVIEW Operation</title><content type='html'>A few years ago, I added an aside to an NI Week presentation about how to benchmark an operation in LabVIEW to see how long it would take.  I wish I had written that information down because it's rather nuanced and you can easily shoot yourself in the foot if you don't have a checklist.  So, for the benefit of my own memory and hopefully something for you, here's how to do a benchmark in LabVIEW.&lt;br /&gt;&lt;br /&gt;1) LabVIEW is not a sequential programming language.  I repeat, LabVIEW is not a sequential programming language. It does not execute left to right. It does not execute top to bottom.  Forget this at your peril.&lt;br /&gt;&lt;br /&gt;2) Therefore, always use a sequence structure.  The recently added flat sequence structure works really well for this.  Do not allow any code to stray beyond the border of the sequence structure because it could easily run in parallel with the thing you are trying to measure.&lt;br /&gt;&lt;br /&gt;3) I recommend the structure shown below.  It has 5 phases: initialization, record the initial timestamp, do the stuff you want to measure, record the ending timestamp, and clean up.  The structure of the 2nd and 4th frames shown are very important. If you put anything else in them, you have no way to know if it ran before or after the timestamping code (re-read rule 1 three more times for good measure)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/51236514@N00/14685265/" title="photo sharing"&gt;&lt;img src="http://photos13.flickr.com/14685265_1624d244d7_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt;  &lt;a href="http://www.flickr.com/photos/51236514@N00/14685265/"&gt;Proper Benchmark Template 1&lt;/a&gt; &lt;br clear="all" /&gt;&lt;br /&gt;&lt;br /&gt;4) Always Save All before running the benchmark.  This is mandatory.  Why? Because any VI in memory that has any modification will have some extra bits loaded that affect performance. For example, a VI that needs to be saved (maybe you changed a connector pane on a different VI and that caused a ripple) will cause LabVIEW to load the front panel of the "dirty" VI into memory, even if it's not visible.  If a front panel is in memory, LabVIEW sees "hey, front panel controls are here, I'd better make sure they stay current" and so when the VI runs, it will force updates to all of the front panel elements, even if the front panel isn't actually visible.  I can say this is the number one reason that I used to have someone tell me that the newest version of LabVIEW was slower.  They loaded their old VIs into a new version of LabVIEW, hit "run" and it ran slower.  They hadn't done a "save all" first and so every VI in their hundred VI heirarchy had the front panel in memory and ran slowly.&lt;br /&gt;&lt;br /&gt;5) Close all front panels.  This bit me and Steve Rogers when we ran a benchmark a month ago.  We couldn't figure out why this new thingy he had added didn't benchmark any faster. We were dumbfounded for 15 minutes until we realized "doh!" the subVI front panel was open and so it was redrawing a few thousand times during the test.&lt;br /&gt;&lt;br /&gt;6) Don't put any controls or indicators in frame 3 of the benchmark template above unless you are trying to benchmark the drawing time of an indicator. Indicators update asynchronously and will have a random effect on your test. &lt;br /&gt;&lt;br /&gt;7) If you are benchmarking the drawing time of an indicator, you will have a trickier time.  We do a lot of stuff to try and keep you from shooting yourself in the foot with drawing.  Sure, you wired that output to the indicator, but did you really mean to redraw the indicator 50,000 times?  Thus, LabVIEW will not stall the diagram waiting for the indicator value to update. It will only transfer the data from the block diagram to the indicator periodically.  It will only redraw the actual indicator every so often (your eye can't see an update rate faster than 60 or so Hertz anyway), etc..  So, read up on "Defer Panel Updates" in LabVIEW help as well as the "Advanced-&gt;synchronous display" option in the context menu for the control. I will tell you that "Synchronous Display" does not (in spite of the tantalizing name) truly lock the diagram to the control.  It just means that if you try and write to the indicator twice, it will stall the diagram the second time around until it has finished updating the indicator the first time.  But, it will then let the diagram continue before it has completed drawing the second time.  If you use the "Value" property for the indicator, it does send the data to the indicator immediately but I'm not sure if it waits until the drawing is done (it very well may, I just can't remember).  Anyway, as with all things, we are always trying to improve LV performance in lots of different use cases without messing up existing code and so it's a very tricky balance.&lt;br /&gt;&lt;br /&gt;As always, I hope this is helpful.  I happed to be working on this type of thing today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-111653574901687120?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/111653574901687120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=111653574901687120' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111653574901687120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111653574901687120'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/05/benchmarking-labview-operation.html' title='Benchmarking a LabVIEW Operation'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-111634448036813142</id><published>2005-05-17T08:26:00.000-07:00</published><updated>2005-05-17T08:41:20.373-07:00</updated><title type='text'>Intro</title><content type='html'>Just a little bit of introduction.  I thought I'd do this blog to give folks some insight into LabVIEW, how to get the most out of it, and interesting things that are going on in my area.  &lt;br /&gt;&lt;br /&gt;I graduated from school 12 years ago, spending 3 years as an application engineer at Motorola Semiconductor (now known as &lt;a href="http://www.freescale.com/"&gt;Freescale&lt;/a&gt;) writing networking microcode, doing customer support, and writing appnotes and documentation.  From Motorola, I moved to Metrowerks to work on computer game development tools and eventually managing all of the &lt;a href="http://www.metrowerks.com/MW/Develop/Games/Default.htm"&gt;game tools development&lt;/a&gt; there.&lt;br /&gt;&lt;br /&gt;I started at NI about 6 years ago, initially working on improving LabVIEW performance. After managing the Performance team for a while, I helped out the NI-DAQ 7.0 effort for a few months and then managed the LabVIEW Real Time and Embedded teams (PDA, FPGA, RT).  Now, I focus exclusively on getting LabVIEW in places it hasn't been before.  PDA is still part of the mix as well as the &lt;a href="http://www.ni.com/dsp/"&gt;LabVIW DSP Module&lt;/a&gt; that was just released today.&lt;br /&gt;&lt;br /&gt;I hope some of this information is of use. Feel free to comment on anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-111634448036813142?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/111634448036813142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=111634448036813142' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111634448036813142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111634448036813142'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/05/intro.html' title='Intro'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12950249.post-111630033029192867</id><published>2005-05-16T20:25:00.000-07:00</published><updated>2005-05-16T20:28:02.376-07:00</updated><title type='text'>55ms</title><content type='html'>&lt;p class="mobile-post"&gt;Each node on a LabVIEW data flow diagram will execute at some point  &lt;br /&gt;after its inputs are valid. That simple specification is sufficient  &lt;br /&gt;to guarantee that the computation for each node is correct. A program is  &lt;br /&gt;a collection of nodes. If all of the computations for all of the  &lt;br /&gt;nodes in your program are correct, can your program be incorrect?  &lt;br /&gt;Yes. When your program is interacting with the real world, it starts  &lt;br /&gt;dealing with another aspect of programming: time. Until LabVIEW 7.1,  &lt;br /&gt;time was not mentioned in the LabVIEW language. Libraries might have  &lt;br /&gt;mentioned it, but the language did not.&lt;/p&gt;&lt;p class="mobile-post"&gt;The way a diagram executes in time has always been a side-effect of  &lt;br /&gt;the way LabVIEW happens to work. LabVIEW uses data flow rules to  &lt;br /&gt;schedule parallel nodes to run in parallel. You notice this most when  &lt;br /&gt;two traditional "for" or "while" loops run in parallel. There is no  &lt;br /&gt;specification on how these loops will run with respect to each other.  &lt;br /&gt;While there is no spec, you probably should know how it actually  &lt;br /&gt;behaves. On the desktop, LabVIEW will ping-pong between loops every  &lt;br /&gt;55ms unless the loops have explicit wait primitives in them.&lt;br /&gt;If you are writing a program that is communicating over the serial  &lt;br /&gt;port and has to respond to an incoming character in 30 ms, you need  &lt;br /&gt;to write your program in a special way to make sure things happen the  &lt;br /&gt;way you want them to.  Here are a few rules to live by&lt;/p&gt;&lt;p class="mobile-post"&gt;1) Desktop operating systems tend to "hiccup" at undesirable times.   &lt;br /&gt;Windows will occasionally steal control for 100ms from applications.  &lt;br /&gt;While drivers like NI-DAQ can take steps against this, applications  &lt;br /&gt;like LabVIEW can only avoid that problem by running on a  &lt;br /&gt;deterministic OS such as the one used in LabVIEW Real-Time.&lt;/p&gt;&lt;p class="mobile-post"&gt;2) In LabVIEW 7.0 and before, run your time critical code in a  &lt;br /&gt;separate VI and set the execution system to a high priority (but not  &lt;br /&gt;subroutine). VIs in higher priority execution systems do not ping- &lt;br /&gt;poing with VIs in lower priority execution systems.  The higher  &lt;br /&gt;priority VI can take all of the time it wants.&lt;/p&gt;&lt;p class="mobile-post"&gt;3) In LabVIEW 7.1, take advantage of the timed loop.  It allows just  &lt;br /&gt;that part of a diagram to run at high priority.&lt;/p&gt;&lt;p class="mobile-post"&gt;4) If you can't use high priority VIs or timed loops, then you need  &lt;br /&gt;to do it the hardest way.  You need to make sure that no element of  &lt;br /&gt;your code can take more time than your minimum response time (30ms)  &lt;br /&gt;in this case.  All library calls, all loops, etc.. must either  &lt;br /&gt;complete in less than 30ms or must yield time by doing a "wait".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12950249-111630033029192867?l=ideasinwiring.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideasinwiring.blogspot.com/feeds/111630033029192867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12950249&amp;postID=111630033029192867' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111630033029192867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12950249/posts/default/111630033029192867'/><link rel='alternate' type='text/html' href='http://ideasinwiring.blogspot.com/2005/05/55ms.html' title='55ms'/><author><name>Joel</name><uri>http://www.blogger.com/profile/01098518591695123037</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://homepage.mac.com/jsumnertx/Misc/Fry.jpg'/></author><thr:total>3</thr:total></entry></feed>
