<div dir="ltr"><div class="gmail_default" style="font-size:x-small">Murray,</div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">You can find a Pi3 compatible real-time kernel at <a href="https://github.com/nettercm/timing">https://github.com/nettercm/timing</a>   </div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">Just drill into the rt_kernel/pi3 directory for files and instructions and important notes specific to the Pi 3.  I plan to also populate the pi4 direction with corresponding files for the Pi 4.</div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">The "nice" API or  command line utility is not the right way to adjust priorities.  Nice doesn't actually deal with real priorities.  It simply tells the "completely fair scheduler" to give certain processes more or less preference.  You must use the chrt utility or in python the os.sched_setscheduler() API.   Both require special privileges so the easiest way to try this out, before you aim for elegance inside your python scripts, is via the command line examples below.</div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">If you launch your threaded python application in this fashion, all python threads will be at the same (elevated) priority.  There is a way to adjust them individually, but there is no advantage to be gained, because as you know there are inherent limitations to the python "threading" module (keyword GIL).   So it's not possible for python "threading" to meet all nuances of "prerequisite #1" from my other e-mail.  Don't worry about it for now.  Just make sure none of your python threads are CPU hogs.  </div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">The following bash command line transcript illustrates how to display and change affinity and priority for the instance of bash that you are in. By default, child processes such as the instance of python that you run when you start your script, inherit all this.   Just be sure to only launch your time critical processes from this bash instance.</div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">pi@raspberrypi:~ $ echo $$<br>6174<br><br></div><div class="gmail_default" style="font-size:x-small">pi@raspberrypi:~ $ ps -ef | grep 6174<br>pi        5713  6174  0 11:45 pts/3    00:00:00 ps -ef<br>pi        5714  6174  0 11:45 pts/3    00:00:00 grep --color=auto 6174<br>pi        6174  1581  0 Feb19 pts/3    00:00:01 bash<br></div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">pi@raspberrypi:~ $ taskset -c -p $$<br>pid 6174's current affinity list: 0-2<br></div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">pi@raspberrypi:~ $ sudo taskset -c -p 3 $$<br>pid 6174's current affinity list: 0-2<br>pid 6174's new affinity list: 3<br></div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">pi@raspberrypi:~ $ chrt -p $$<br>pid 6174's current scheduling policy: SCHED_OTHER<br>pid 6174's current scheduling priority: 0<br></div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">pi@raspberrypi:~ $ sudo chrt -v -p -f 60 $$<br>pid 6174's current scheduling policy: SCHED_OTHER<br>pid 6174's current scheduling priority: 0<br>pid 6174's new scheduling policy: SCHED_FIFO<br>pid 6174's new scheduling priority: 60<br></div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small">pi@raspberrypi:~ $ python3 some_time_sensitive_python_script.py<br></div><div class="gmail_default" style="font-size:x-small"><br></div><div class="gmail_default" style="font-size:x-small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Feb 20, 2021 at 5:00 PM Murray Altheim <<a href="mailto:murray18@altheim.com">murray18@altheim.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Chris,<br>
<br>
I just wanted to tease out one thing that would help me and potentially<br>
anyone else using Python on a robot.<br>
<br>
On 21/02/21 6:43 am, Chris N wrote:<br>
[...]<br>
> If you are not doing ALL of the following, then you are simply wasting your time:<br>
> <br>
> 1. Run your application – and all its threads - at elevated priority. Not<br>
>    only that, be sure to run your real-time threads at higher priority than <br>
>    your non-real-time threads.    The same would be true when one is using a  <br>
>    RTOS. The OS can’t magically know which activity is most important.  You <br>
>    have to tell it. <br>
<br>
Can you do this from within your Python code, or is it done when you call<br>
the Python interpreter on the command line? I'm currently starting my ros.py<br>
(main application) up from the command line (it uses argparse internally),<br>
or from a rosd.py systemctl daemon triggered by listening to a GPIO-wired<br>
toggle switch on the robot, so I can turn my ROS on and off with a switch.<br>
<br>
So I can either do something inside ros.py or inside rosd.py, since the<br>
latter creates the command line that calls the former. If its possible<br>
to do so inside ros.py that'd be easier and more consistent as I normally<br>
just type "ros.py -s" to start things up.<br>
<br>
I'm currently doing this using psutil* to set thread priority from within<br>
the ros.py file** (line 93):<br>
<br>
     import psutil<br>
     ...<br>
     proc = psutil.Process(os.getpid())<br>
     proc.nice(10)<br>
<br>
Is that correct? Or perhaps, is that what you're doing? Or something else?<br>
<br>
I'm currently hoping to whittle my application down to three threads:<br>
<br>
   1. main ros.py application<br>
   2. system Clock<br>
   3. gamepad (when used)<br>
   4. ballistic behaviours (run individually then quit)<br>
<br>
You're suggesting running all my application threads at an elevated<br>
priority. Do you suggest running them all at the same elevated priority,<br>
or perhaps prioritising, say, my Clock thread even higher?<br>
<br>
Cheers,<br>
<br>
Murray<br>
<br>
* <a href="https://psutil.readthedocs.io/en/latest/" rel="noreferrer" target="_blank">https://psutil.readthedocs.io/en/latest/</a><br>
** <a href="https://github.com/ifurusato/ros/blob/master/ros.py" rel="noreferrer" target="_blank">https://github.com/ifurusato/ros/blob/master/ros.py</a><br>
...........................................................................<br>
Murray Altheim <murray18 at altheim dot com>                       = =  ===<br>
<a href="http://www.altheim.com/murray/" rel="noreferrer" target="_blank">http://www.altheim.com/murray/</a>                                     ===  ===<br>
                                                                    = =  ===<br>
     In the evening<br>
     The rice leaves in the garden<br>
     Rustle in the autumn wind<br>
     That blows through my reed hut.<br>
            -- Minamoto no Tsunenobu<br>
<br>
</blockquote></div>