{"id":3315,"date":"2025-04-18T04:48:40","date_gmt":"2025-04-18T04:48:40","guid":{"rendered":"https:\/\/webprojects.cloud\/wordpress\/splatco\/?post_type=spl_knowledgebase&#038;p=3315"},"modified":"2025-06-10T09:24:16","modified_gmt":"2025-06-10T09:24:16","slug":"multitrack-advanced-transient-tasks","status":"publish","type":"spl_knowledgebase","link":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/","title":{"rendered":"MultiTrack (Advanced): Transient tasks"},"content":{"rendered":"\n<p>It is not necessary for a task to live forever. There can only be a finite number of tasks in the queue at any point time (how many depends on the model of SPLat board), so it may sometimes pay to make a task that is launched when required and terminates itself when it has done its job. That way you not only save on the finite capacity of the queue, but you also make your program run faster because no processor time is wasted processing idle tasks.<\/p>\n\n\n\n<p>The instruction&nbsp;<code>KillTask<\/code>&nbsp;causes a task to yield without being placed back into the task queue, effectively killing itself. It is not possible for one task to kill another task. However, tasks may&nbsp;<code>LaunchTask<\/code>&nbsp;each other.<\/p>\n\n\n\n<p>You must take care not to launch multiple copies (called&nbsp;<em>instances<\/em>) of a task unless that is your exact intention.<\/p>\n\n\n\n<p>Let&#8217;s make a push on\/push off light switch that flashes a pilot light on output 1 three times each time the button is pressed.<\/p>\n\n\n\n<p>Here&#8217;s the main toggle function:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Toggle:         WaitOnK         0\n                On              0\n                LaunchTask      Blink3\n                WaitOnK         0\n                Off             0\n                LaunchTask      Blink3\n                GoTo            Toggle\n<\/pre>\n\n\n\n<p>;Toggle assumes the existence of another task called Blink3.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">BlinkCount      defBYTE\nBlink3:         SetMem          BlinkCount,3\nBlink3Loop:     On              1\n                Pause           1\n                Off             1\n                Pause           1\n                YieldTask\n                DecMGoIfNZ      BlinkCount,Blink3Loop\n                KillTask<\/pre>\n\n\n\n<h6 class=\"wp-block-heading\">Exercise:<\/h6>\n\n\n\n<p><a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/glossary-of-terms\/#o5366\">Build<\/a>\u00a0a program around the two tasks listed, with the necessary\u00a0<code>LaunchTask<\/code>\u00a0and\u00a0<code>RunTasksForever<\/code>\u00a0instructions.<\/p>\n\n\n\n<p>Hint:&nbsp;<code>Blink3<\/code>&nbsp;is launched from inside&nbsp;<code>Toggle<\/code>, so you don&#8217;t need to launch it again.<\/p>\n\n\n\n<p>Hint: In simulation you can speed up execution a lot by minimizing the editor window.<\/p>\n\n\n\n<p>Watchit: When you test your program, be careful not to activate the &#8220;button&#8221; (input 0) while&nbsp;<code>Blink3<\/code>&nbsp;is active. This would cause multiple&nbsp;<em>instances<\/em>&nbsp;(copies) of&nbsp;<code>Blink3<\/code>&nbsp;to be launched concurrently. This will produce unexpected results.<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">Exercise:<\/h6>\n\n\n\n<p>Watch the\u00a0<code>BlinkCount <\/code>counter in the\u00a0<a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/glossary-of-terms\/#o415\">Data Memory<\/a>\u00a0window. It will normally be allocated to location 19. You will see it go to 3 and then count down to 0 each time\u00a0<code>Blink3<\/code>\u00a0is launched.<\/p>\n\n\n\n<p>Now try clicking the &#8220;button&#8221; many times, and watch&nbsp;<code>Blink3<\/code>&nbsp;playing up. Observe what happens to&nbsp;<code>BlinkCount<\/code>. Try and explain what you see (but don&#8217;t stress if you can&#8217;t!)<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">Exercise:<\/h6>\n\n\n\n<p>Use a semaphore in&nbsp;<code>Blink3<\/code>&nbsp;to protect against multiple instances being launched and attempting to co-exist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>It is not necessary for a task to live forever. There can only be a finite number of tasks in the queue at any point&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":3299,"menu_order":12,"template":"","class_list":["post-3315","spl_knowledgebase","type-spl_knowledgebase","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MultiTrack (Advanced): Transient tasks - SPLat Controls<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MultiTrack (Advanced): Transient tasks - SPLat Controls\" \/>\n<meta property=\"og:description\" content=\"It is not necessary for a task to live forever. There can only be a finite number of tasks in the queue at any point...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/\" \/>\n<meta property=\"og:site_name\" content=\"SPLat Controls\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-10T09:24:16+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/\",\"name\":\"MultiTrack (Advanced): Transient tasks - SPLat Controls\",\"isPartOf\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website\"},\"datePublished\":\"2025-04-18T04:48:40+00:00\",\"dateModified\":\"2025-06-10T09:24:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorials, application notes and white papers\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Tutorial: MultiTrack\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"MultiTrack (Advanced): Transient tasks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/\",\"name\":\"SPLat Controls\",\"description\":\"OEM Embedded Machine Controllers\",\"publisher\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization\",\"name\":\"SPLat Controls\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg\",\"contentUrl\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg\",\"caption\":\"SPLat Controls\"},\"image\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MultiTrack (Advanced): Transient tasks - SPLat Controls","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"MultiTrack (Advanced): Transient tasks - SPLat Controls","og_description":"It is not necessary for a task to live forever. There can only be a finite number of tasks in the queue at any point...","og_url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/","og_site_name":"SPLat Controls","article_modified_time":"2025-06-10T09:24:16+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/","name":"MultiTrack (Advanced): Transient tasks - SPLat Controls","isPartOf":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website"},"datePublished":"2025-04-18T04:48:40+00:00","dateModified":"2025-06-10T09:24:16+00:00","breadcrumb":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/multitrack-advanced-transient-tasks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/"},{"@type":"ListItem","position":2,"name":"Tutorials, application notes and white papers","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/"},{"@type":"ListItem","position":3,"name":"Tutorial: MultiTrack","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-multitrack\/"},{"@type":"ListItem","position":4,"name":"MultiTrack (Advanced): Transient tasks"}]},{"@type":"WebSite","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/","name":"SPLat Controls","description":"OEM Embedded Machine Controllers","publisher":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/webprojects.cloud\/wordpress\/splatco\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization","name":"SPLat Controls","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg","contentUrl":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg","caption":"SPLat Controls"},"image":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/spl_knowledgebase\/3315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/spl_knowledgebase"}],"about":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/types\/spl_knowledgebase"}],"author":[{"embeddable":true,"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/users\/1"}],"up":[{"embeddable":true,"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/spl_knowledgebase\/3299"}],"wp:attachment":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/media?parent=3315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}