{"id":834,"date":"2010-04-19T10:31:55","date_gmt":"2010-04-19T09:31:55","guid":{"rendered":"https:\/\/blogs.mentor.com\/colinwalls\/?p=834"},"modified":"2026-03-26T16:32:17","modified_gmt":"2026-03-26T20:32:17","slug":"vintage-multi-core-the-ipc","status":"publish","type":"post","link":"https:\/\/blogs.sw.siemens.com\/embedded-software\/2010\/04\/19\/vintage-multi-core-the-ipc\/","title":{"rendered":"Vintage multi-core &#8211; the IPC"},"content":{"rendered":"<p>Last week, I <a href=\"https:\/\/blogs.mentor.com\/colinwalls\/blog\/2010\/04\/12\/vintage-multi-core-introduction\/\" target=\"_blank\" rel=\"noopener noreferrer\">wrote<\/a> about a &#8220;multi-core&#8221; project that I was working on 30 years ago. To be fair, it was actually &#8220;multi-CPU&#8221; rather than &#8220;multi-core&#8221;, but many of the challenges were similar, as was the initial design decision to take the approach of distributing the processing capacity. It is interesting to draw a comparison between the system we were developing all those years ago and modern ideas for multi-core design. A common approach, which I mentioned <a href=\"https:\/\/blogs.mentor.com\/colinwalls\/blog\/2009\/11\/02\/multi-core-multi-os-confusion\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>, for example, is to use one core for real time functionality [running an RTOS like <a href=\"http:\/\/www.mentor.com\/products\/embedded_software\/nucleus_rtos\" target=\"_blank\" rel=\"noopener noreferrer\">Nucleus<\/a> perhaps] and another for non-real-time activity [maybe running <a href=\"http:\/\/www.mentor.com\/products\/embedded_software\/android-linux-multicore\/\" target=\"_blank\" rel=\"noopener noreferrer\">Android or Linux<\/a>].<\/p>\n<p>Using multiple CPUs [or cores] presents a variety of challenges. One is the division of labor, which was reasonably straightforward in this case. Another is communication between the processors &#8230;<!--more--><\/p>\n<p>In designing the UPO, we considered a number of means by which the two CPUs might be connected. As they were separate boxes, serial and parallel connections were considered. Nowadays, I am sure that <a href=\"http:\/\/www.mentor.com\/products\/embedded_software\/nucleus_rtos\/nucleus_usb\" target=\"_blank\" rel=\"noopener noreferrer\">USB<\/a> would have been an option too. But we were very concerned about any possible compromise of the real-time performance of the console microprocessor. Also, we did not want the user to be faced with the UPO freezing while it waited for attention from the console. So, clearly a buffering mechanism was needed and shared memory seemed to be a good option.<\/p>\n<p>A small memory board was designed. I have no idea of the hardware architecture, except that I seem to recall that the TI-9900 had priority over the SB-11, as it could not afford to be delayed by slow memory access. If I remember correctly, the board was 2K [words, probably].<\/p>\n<p>It was down to us to define a protocol for communication, so we aimed to produce something that was simple and reliable. We divided the memory into two halves; one was a buffer for communication from the UPO to the console and the other for the opposite direction. The first word of each buffer was for a command\/status code, which was simply a non-zero value. We did not use interrupts. The receiving CPU just polled the first word when appropriate, awaiting a non-zero value. When a command was found, any data could be copied and the command word cleared to zero indicating that the processing was complete. So, the UPO sending a command to the console might go through a sequence like this:<\/p>\n<ul>\n<li>Write data to the buffer [second word onwards].<\/li>\n<li>Write a command to the first word.<\/li>\n<li>Poll the word, waiting for it to become zero.<\/li>\n<\/ul>\n<p>If it was expecting a response, it would then start monitoring the other buffer.<\/p>\n<p>Of course, there were other facilities to handle a situation where one CPU did not respond after a timeout period.<\/p>\n<p>Nowadays, multi-core and multi-chip systems have a variety of interconnection technologies, but shared memory is still very common. A number of standardized protocols have been developed over the years, including derivatives of TCP\/IP. In recent years, the Multicore Association produced MCAPI, which is rapidly gaining broad acceptance in multi-core embedded system designs. This will be the subject of another future blog posting.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last week, I wrote about a &#8220;multi-core&#8221; project that I was working on 30 years ago. To be fair, it&#8230;<\/p>\n","protected":false},"author":71677,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spanish_translation":"","french_translation":"","german_translation":"","italian_translation":"","polish_translation":"","japanese_translation":"","chinese_translation":"","footnotes":""},"categories":[1],"tags":[324,300,365,366,307,367,328,304],"industry":[],"product":[],"coauthors":[],"class_list":["post-834","post","type-post","status-publish","format-standard","hentry","category-news","tag-android","tag-embedded-software","tag-interprocessor-communication","tag-ipc","tag-linux","tag-mcapi","tag-multi-core","tag-nucleus"],"_links":{"self":[{"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/posts\/834","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/users\/71677"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/comments?post=834"}],"version-history":[{"count":1,"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/posts\/834\/revisions"}],"predecessor-version":[{"id":9848,"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/posts\/834\/revisions\/9848"}],"wp:attachment":[{"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/media?parent=834"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/categories?post=834"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/tags?post=834"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/industry?post=834"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/product?post=834"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/embedded-software\/wp-json\/wp\/v2\/coauthors?post=834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}