On 08/28/2014 11:57 AM, Asier Tamayo wrote: > Dear Philippe, > > Thank you for your support. > >> - moving to Yocto means changing the whole environment, unless you go >> for Denx's ELDK, which is Yocto-based _and_ Xenomai-enabled, in which >> case you would not have to port your application. >> > Sadly, ELDK doesn't have x86 among its support architectures. Surely, they > can add it, but at a cost.
Any option will have a cost, it just depends where you want to invest the money in. An intermediate option would be to build your x86 image from Yocto's poky integration environment you would have extended with a couple of additional recipes for Xenomai. There are recipes/meta already floating around for this (I never tested them though). > >> - moving to straight preempt-rt means changing your programming model >> from dual kernel to single kernel, porting your application from >> Xenomai's "native" API to POSIX, and porting your drivers to a single >> kernel system. A native incarnation of RTDM does exist, but we did not >> receive any feedback since it was released (many) years ago, so rough >> edges may exist. >> > Which are the "philosophical" changes in changing my programming model from > dual kernel to single kernel? Moving from "I may only trust a small set of real-time capable APIs served by 1% of the embedded kernel code base" to "I have to trust the common set of libc calls served by an undefined though certainly much larger percentage of the embedded kernel code base". The 1% is fully dedicated to real-time, the other percentage is part of a multi-purpose kernel dealing with real-time issues among other things. This has to change the way you consider which API and drivers are safe with respect to real-time behavior. > Should I expect many problems in porting the native API to POSIX? The original intent of the "native" API (now called "alchemy" in Xenomai 3.x) was to provide services which looked familiar to users of traditional RTOS APIs (i.e. non-POSIX). For this reason, it provides constructs and mechanisms you won't find in POSIX. For instance: - specifying the queuing policy (i.e. FIFO/PRIO) for waiting on resources is not available with POSIX, actually the standard explicitly says that it's wrong to do so, and enforces wait by priority always. So if your application only uses the PRIO mode, then ok. If it depends on the FIFO mode on purpose, then the application logic has to be revisited. - you won't find any support for forcibly suspending/resuming a thread in POSIX, the mechanism based on signals is process-scoped. Although depending on such feature is not recommended (for the same reason than async thread cancellation should not be used), some legacy apps may need it. YMMV. - the ugly "scheduler lock" feature is not present in POSIX, by design. Once again, it's present in the native Xenomai 2.x API to cope with legacy constructs used by applications ported from traditional RTOSes. - some IPCs won't be there, like event flag groups or buffers. Instead, POSIX gives you mutexes and condvars basically for building whatever synchronization mechanism you may think of. But you have to build them by yourself. Many applications based on the native API can be ported to POSIX easily, some will require more thought. It boils down to how much an application depends on ... non-POSIX constructs, obviously. But only you can assess this. The reason Xenomai 3.x has a complete implementation of the former native 2.x API which also works over a single kernel configuration, is precisely to deal with those dependencies in a generic way, without switching APIs. > Should I try another solution instead of using the native incarnation of RTDM in preempt-rt? Which one? I don't think anyone but you can reasonably answer this question, there is no recipe. If you don't go for the upcoming RTDM native, then you will have to convert your RTDM-based drivers to regular linux drivers. > >> - upgrading Elinos to Xenomai 2.6.x means updating your kernel - which >> is something you have to do for other reasons anyway - and building a >> drop in replacement of the Xenomai libraries and tools in user-space, >> for replacing the legacy ones shipped with Elinos. Kernel-wise, the >> requirement is to have an I-pipe patch available for your kernel version >> of choice. The upcoming Xenomai 2.6.4 supports kernel 3.14. >> > If I'm not confused, applying the I-pipe patch to the ELinOS kernel would add > the Xenomai support, but I'm not sure if the ELK tool (Embedded Linux > Konfigurator) will show me that option. I'll ask Sysgo about this. While they > answer, has anyone got any experience doing something similar? > >> Mercury (i.e. single kernel Xenomai 3 configuration) would allow you to >> move to preempt-rt without having to switch APIs from Xenomai 2.x >> "native" to POSIX. >> > Is the real-time performance (latency, jitter...) different in the single and > in the double kernel approaches? Yes the figures are different depending on the hardware capabilities. The dual kernel involves less overhead to deliver real-time, but the single kernel scales better with more CPUs thanks to a finer locking model. In short, the co-kernel only deals with real-time issues with no interaction with the host kernel in the time-critical paths, which is simpler and usually faster. Once the interrupt pipeline is in place, the dual kernel only has to cope with hardware latencies for the most part (e.g. cache effects, bus locking etc). On the other hand, a single kernel configuration still has to cope with both software-generated and hardware-generated latencies (e.g. solving priority inversions due to the ongoing non-rt work, in addition to hardware latencies). This said, the higher the hardware capabilities you have (more efficient cores, faster caches, faster DDR, faster buses etc), the better the figures in single kernel configuration despite the extra overhead, up to the point where dual kernel has no real upside over single kernel with preempt-rt for a large class of applications and requirements on high end platforms. On the other hand, on low end up to mid-range hardware in the embedded space, a dual-kernel generally performs significantly better at a smaller cost. x86 is special: modern x86 platforms are often on the highest end of the embedded space, there the difference between single and dual kernel performances may not be large. Again, it only depends on your requirements with respect to the acceptable latency. Many questions, answered by many options. There is no one-fits-it-all solution I'm afraid. I'm certainly beating a dead horse, but the conversation should start with the real-time requirements. > If the performance depends on the RT approach (i.e., preempt-rt performance in the Mercury architecture and Xenomai v2 performance in the Cobalt one), are there any benchmarks comparisons between them? The ones I have found are quite outdated. The Cobalt implementation differs significantly from Xenomai 2 in many aspects, although they do share the dual kernel approach. You can find recent benchmarks for dual kernel configurations at our web site, we intend to add more of them in the future: http://xenomai.org/knowledge-base-index/ You can compare the "latency" (-t0, user-space) test by running this same program unmodified in a Mercury setup, or implement your own test if you want to be free from any supposed Xenomai interaction (actually, there is none with this test for Mercury). > > If I use the Mercury architecture, do I need to patch my ELinOS distribution > (already with PREEMPT_RT patch) in any way? From the documentation, I assume > I don't have to, but I need to be sure about this point. Correct, you don't need any I-pipe patch for Mercury, since the former is a dual kernel enabling layer. > > Best regards, > > Asier Tamayo > > >> -----Mensaje original----- >> De: Philippe Gerum [mailto:[email protected]] >> Enviado el: miƩrcoles, 27 de agosto de 2014 13:15 >> Para: Asier Tamayo; [email protected] >> Asunto: Re: [Xenomai] Migrating from Xenomai to PREEMPT_RT >> >> On 08/27/2014 10:45 AM, Asier Tamayo wrote: >> >>> Full story: >>> I have been using Xenomai for some time and must say I am really happy >> with the results (latencies, ease of programming, clear separation between >> the RT and non-RT parts...). My board is an Atom N270 based one, and runs >> a kernel 2.6.34 compiled with Sysgo's ELinOS 5.2 tool. I have mainly used >> the native skin, as well as some RTDM drivers. >>> >>> Now, I have to start using a new AMD G-Series T52R based board, and >> kernel 2.6.34 shows some problems with it. Therefore, I have to update the >> kernel to a newer one, but ELinOS has dropped the Xenomai support. As far >> as I can think, I now have three options: try to install Xenomai in ELinOS >> by myself, start using another tool or leave Xenomai and use the >> PREEMPT_RT patch. The first option may be very error prone (in fact, I >> have already updated once the Xenomai version in ELinOS, but the tool had >> Xenomai support integrated previously in it). The second solution would >> surely put me in the Yocto path, which I think can be the correct one, but >> the learning step might require too much time from me. >>> >> >> Actually, updating your Elinos base to Xenomai 2.6.x would likely be >> much less error prone than any other option, although I agree that >> moving to Yocto is likely the best long term option. >> >> Looking at the involved components: >> >> - moving to Yocto means changing the whole environment, unless you go >> for Denx's ELDK, which is Yocto-based _and_ Xenomai-enabled, in which >> case you would not have to port your application. >> >> - moving to straight preempt-rt means changing your programming model >> from dual kernel to single kernel, porting your application from >> Xenomai's "native" API to POSIX, and porting your drivers to a single >> kernel system. A native incarnation of RTDM does exist, but we did not >> receive any feedback since it was released (many) years ago, so rough >> edges may exist. >> >> - upgrading Elinos to Xenomai 2.6.x means updating your kernel - which >> is something you have to do for other reasons anyway - and building a >> drop in replacement of the Xenomai libraries and tools in user-space, >> for replacing the legacy ones shipped with Elinos. Kernel-wise, the >> requirement is to have an I-pipe patch available for your kernel version >> of choice. The upcoming Xenomai 2.6.4 supports kernel 3.14. >> >>> So, maybe the right solution would be to leave Xenomai and embrace the >> PREEMPT_RT patch, which is already supported by ELinOS. Has anyone got any >> experience with it? Which difficulties should I expect to find in the >> migration process? Any special problems with RTDM, shared memory...? >>> >>> Has anyone got information about latencies and performance comparison >> between Xenomai and PREEMPT_RT patch? I have found some in >> https://www.osadl.org/fileadmin/dam/rtlws/12/Brown.pdf, but would like to >> have as much as possible to make the choice. >>> >>> Is Xenomai 3 changing my situation in any way? Maybe using the Mercury >> architecture, in which I do not need to patch the kernel? >> >> Mercury (i.e. single kernel Xenomai 3 configuration) would allow you to >> move to preempt-rt without having to switch APIs from Xenomai 2.x >> "native" to POSIX. >> >>> >>> What do you think about the issue? >>> >>> [From Xenomai 3 FAQ - http://xenomai.org/introducing-xenomai-3/: >>> Q: I can run POSIX based applications directly over a PREEMPT_RT >> kernel on my target system, so what is the point of running Xenomai 3? >>> A: If your application is already fully POSIXish, and the >> performances requirements are met, then there is likely no point.(...)] >>> >> >> This is fairly straightforward: >> >> Xenomai 3 can either supplement the host kernel with a small co-kernel >> for delivering real-time performances (aka "Cobalt" configuration), or >> fully rely on the underlying kernel if it is deemed real-time already >> (aka "Mercury"). >> >> In the latter case, if preempt-rt is available on your hardware/kernel >> combo, meets your real-time performance requirements, then you do not >> need Xenomai 3 to write POSIX apps, since the glibc provides for this API. >> >> However, if your app is not POSIXish but based on an API Xenomai >> emulates/implements, then you may want to use Xenomai 3 compared to >> converting this app to POSIX, which is quite often an error prone >> process. Xenomai 2.x "native" API is available with Xenomai 3, including >> for a single kernel configuration (e.g. preempt-rt). >> >> -- >> Philippe. > -- Philippe. _______________________________________________ Xenomai mailing list [email protected] http://www.xenomai.org/mailman/listinfo/xenomai
