Strange timer-processing problem (inaccuracy) under QNX 4.25

it takes a while for the web interfaces to get updated..

if you can, please ftp to qnx.com and login as anonymous.
make sure you are running ftp in passive mode (type ‘passive’ at the ftp
prompt if you are not sure).

then get the archive from:
/usr/free/qnx4/os/samples/misc qnx4rtime.tgz
install to cur directory with: zcat qnx4rtime.tgz | pax -rv

some things of note.
if you don’t run higher than Proc in priority then Proc will preempt your
process. you want to be higher.

also… you want to be careful about anything on your machine that can hold
off the cpu.
that is why i usually run these tests on a machine where i can disable all
power management and any smm stuff (turn off usb interrupts etc. in the cmos)
if you are getting smi interrupts then any timing tests will be incorrect.
the rtdsc timer keeps running regardless if qnx or the bios has the cpu.

i believe both you and mario that you are seeing something. but i honestly
don’t see a failure with your program here using the versions [I-K]

i’d be interested if running my test app on your system there (with Proc
at lower priority) shows the same problem.
the README in the archive discusses the timing issue in great length.

thanks again for your patience and deliberation in helping to work this
out.


Tamasi Gyorgy <gtamasi@freemail.hu> wrote:

Previously, Randy Martin wrote in qdn.public.qnx4:
i’ll try to trim the posting a bit …

(was successful.)


yes, i did try both your code and my code (that i use for analysis) on various
versions of Proc, starting with i and moving to the latest ‘k’, which is
in internal beta right now. i guess i assumed that you knew i would do
this.

running your code i do not see the ‘elapse’ problems that you see there.

(Hm…) And do you believe, that Mario - as an independent - has
also seen it?

and i’ve been through the cvs logs to see if there is a difference in the
timer handling code and there is none.

(((This can be a side effect of an other change, too.)))

the caveats as mentioned earlier by me apply to all versions of Proc.

there are other issues here. interrupt load, cpu holdoff from other
peripherals (like video etc.)

my tests all run from text console. i do not run them in graphics mode.

let’s try the following:

use 425J
use text mode only
Proc at prio 26

i was running my tests with Proc at (default) prio 30.

(maybe it is helpful: we experienced the symptom on intel
processors (Pentium MMX at 250MHz/TX chipset, CeleronA at ~410 &
466MHz/ZX chipset); i will try to test it on a newer AMD on
monday, too, because some unconfirmed info says, that it can be
un-affected by the symptom.)

i posted my test code to /usr/free … it was part of a series of notes that
i put together on using qnx4 for realtime work. that code in there uses
Trace calls for analysis so it shouldn’t be blocked on any system service
(a Trace call is a kernel call)

usr/free/qnx4/os/samples/misc/ called qnx4rtime.tgz

hm, I don’t know how can i announce it: currently (09:00 PM,
Budapest) there is no file ‘qnx4rtime.tgz’ in the referenced
directory on QUICS, and it is not mentioned in ls-lR, nor find-ls
of /usr/free. (dot)

please try either your original test again and/or my sample code in the
above scenario.

i’ll try my test in your scenario.

would it be possible to temporarily repost somewhere (compiled)
executable version of my test-code, running in your environment
(and producing no symptoms) - e.g. together with qnx4rtime.tgz?


Randy Martin randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579

Sorry, I just forgot to explicitly mention, that the applied
timing in the current test was the following (however you can
detect it browsing the attached source):

ticksize: 1999695 ns
timer cycle: 4 * 1999695 ns.

One more comment (however I can not attach now the test results, I left
the office, but no we both have some practice already in just believing
it :slight_smile:, if i raise back prio of Proc to 30, and run my test app
according to your scenario again, under 4.25J Proc: the ‘elapse’
messages will arrive again, at a not higher, not lower rate, than in the
test with Proc at prio 26…

Tamasi Gyorgy <gtamasi@freemail.hu> wrote:

“ proxy(()) triggers ()”

identifies this event, if proxy is connected to the affected timer?

yes. this is an event from the kernel.

On ‘poll period’ you mean the timer-cycle interval here?

yes.

If yes, do not forget, please, that in my original posting i
described the problem with the following time constraints:

  • ticksize: 2ms (1999695ns)
  • timer-cycle interval (‘poll-period’?): (4, 8, or 10) *
    (ticksize -e) (7998780ns, etc.)

If you modify the demo to use this timing, you will still see
the difference between Proc32 4.25I & 4.25J…

If you increase or decrease N*(ticksize -e) cycle time with
1ns, everything works correctly even under 4.25J, but if the
cycle is the exact multiple of ticksize -e, 4.25J (just like
me:-) is going to be getting crazy… (‘Just test it…’)

this was already discussed. and the code in the kernel was highlighted.
you can’t sit on this boundary condition.

also… you want to be very careful about how the timers are created.
please remember that the kernel calculates when your timer should fire.
so the the kernel is preempted by other apps, then the final timer
period may not be what you had wanted for.
keep yourself away from the boundary.

only the 8254 timing resolution is used by the kernel, the rdtsc is only
used by monitor/trace and not by any of the timer routines.

i reran your code with the above timing conditions and i do not see any
elapse messages.


  • You can change the base ticksize & timer-cycle values, as you
    want (keeping them consistent, especially with the hardcoded
    value of ‘ticksize -e’, even if you use a multiple of it, as a
    cycle-time): do you still see differences between behaviour
    under Proc32 4.25I & 4.25J (because i constantly see)?

unfortunately no.


Randy Martin randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579

Tamasi Gyorgy <gtamasi@freemail.hu> wrote:

but your file ‘qnx4rtime.tgz’ is still missing.

options:

(a) you plan to make me crazy.
(b) you currently does not check yourself, what you state here (regarding
location of ‘qnx4rtime.tgz’, strictly).

sorry.

my apologies. it was stuck between firewalls. i could see it fine from home as
well as from here, but it was not propogated to you. please try it now
from that same directory.
/usr/free/qnx4/os/samples/misc/qnx4rtime.tgz*

yes, but our current discussion tries to address a different symptom (please,
belive me, finally, just take a look at the attached test-results)…

you MUST run your app higher than Proc, and you MUST not run in any
fashion which will force your app to block on anyone else. that includes
blocking on Dev.con or DEv.pty/pterm.

i can easily create inconsistent timer fires by not doing this on any
version of the OS. also please remember that ‘monitor’ does the time
stamping of the events from Proc, so if it is not at high priority then
it can itself be preempted… much of monitor’s work is done at interrupt
time (soft int fabricated by kernel when event logging is enabled) but there
is still a fair bit of work it does at process time.

also… you want to be careful about anything on your machine that can hold
off the cpu.
that is why i usually run these tests on a machine where i can disable all
power management and any smm stuff (turn off usb interrupts etc. in the cmos)
if you are getting smi interrupts then any timing tests will be incorrect.
the rtdsc timer keeps running regardless if qnx or the bios has the cpu.

ok. i tried to disable everything yesterday (maybe correctly, maybe not).

but its clear: 4.25I & 4.25J behaves differently somehow…

!!!
(just a question - was trimmed out unanswered earlier: which system component
produces the following monitor-log entry?

“ proxy(()) triggers ()”

is it the event-log, when “the kernel itself will trigger the proxy when
needed”, if that proxy is the one attached to the timer???

the is logged by the ‘monitor’ process as part of its int handler. the
time is snapped when the even occurs in the kernel.
the data is then stored by the ‘monitor’ program


because if yes, then i can confirm (and you can beleive me) that i can see
those abnormal relative times comparing timestamps of this monitor-log
entries (logged as rdtsc-cycles!)… so we could be sure, that the abnormal
delay happens far before my silly app could receive that proxy tick at all,
and then producing its silly output, otherwise consistently…
!!!

i believe both you and mario that you are seeing something. but i honestly
don’t see a failure with your program here using the versions [I-K]

i honestly believe.

i’d be interested if running my test app on your system there (with Proc
at lower priority) shows the same problem.

(me to…just post your app > :slight_smile:

the README in the archive discusses the timing issue in great length.

thanks again for your patience and deliberation in helping to work this
out.

thank you, too, honestly…

AND NOW: the test results (of my app, only > :frowning:> …

i’ve done everything according to your scenario, at
the lowest possible system load, in a single text console.

the most important thing, that the ‘elapse’ lines still will be
produced, but it is also important that the rate of them seems to
be system load dependent: if i run the same test at a heavy
system load, i get abnormal expirations at a much higher rate.

you get everything attached: all of the dumps (‘ps’ and ‘sin ver’
outputs also included) + the current source of my test app + the
test app as an executable + the script, how i run the app.

(just ask me if you have further questions about the results…)

i’ll take a look at your app later today.
i do need to emphasize though as strongly as i can, that doing anything
of this nature with timers when you are not higher in priority than Proc
or if you have any potential to block on any other application (through
calls to stdout/disk or anything else) will cause incorrect results.
so if by ‘system load’ you mean the above, then this is expected behaviour.

in my code you will see that i write my logging data to the trace buffer
which are kernel calls (sftware interrupts).. therefore avoiding even the
potential block on Proc. (Proc32 itself is a single threaded resource
manager, so you do not want to block on it for high resolution work either..
in other words, malloc all your memory first to your own heap so that you
don’t need to go to Proc for more memory, create all your timers first etc.

thanks for yourt patience and your sense of humour.
i know you are frustrated on this..

good luck.

PS: i would (kindly) ask it again: is it possible to post your
current executable of my test app, used in tests in your
environment?

i will put it in /usr/free/tmp on our firewall node so you can get it
with anonymous ftp.

i put your code compiled on my machine along with src in /usr/free/tmp

look for gtamasi* and gq4* files.

Tamasi Gyorgy <gtamasi@freemail.hu> wrote:

—559023410-2078917053-979347226=:1354
Content-Type: TEXT/PLAIN; CHARSET=ISO-8859-1

Previously, Randy Martin wrote in qdn.public.qnx4:
it takes a while for the web interfaces to get updated..

i wasn’t using the web interface (that did not work at all).
i was using direct (‘textual’) ftp…

if you can, please ftp to qnx.com and login as anonymous.
make sure you are running ftp in passive mode (type ‘passive’ at the ftp
prompt if you are not sure).

then get the archive from:
/usr/free/qnx4/os/samples/misc qnx4rtime.tgz
install to cur directory with: zcat qnx4rtime.tgz | pax -rv

…and i’m still using direct ftp.

but your file ‘qnx4rtime.tgz’ is still missing.

options:

(a) you plan to make me crazy.
(b) you currently does not check yourself, what you state here (regarding
location of ‘qnx4rtime.tgz’, strictly).

sorry.

i would suggest to put it directly into the the home-dir of ‘rklossek’
(my colleague), or email to me directly, in order to spare some further
useless cycles…

sorry, again, but it makes me a bit overheated…
…but you can be sure, I always cool down within a very limited period of
time > :slight_smile:> , as you may have been already detected it…

some things of note.
if you don’t run higher than Proc in priority then Proc will preempt your
process. you want to be higher.

yes, but our current discussion tries to address a different symptom (please,
belive me, finally, just take a look at the attached test-results)…

also… you want to be careful about anything on your machine that can hold
off the cpu.
that is why i usually run these tests on a machine where i can disable all
power management and any smm stuff (turn off usb interrupts etc. in the cmos)
if you are getting smi interrupts then any timing tests will be incorrect.
the rtdsc timer keeps running regardless if qnx or the bios has the cpu.

ok. i tried to disable everything yesterday (maybe correctly, maybe not).

but its clear: 4.25I & 4.25J behaves differently somehow…

!!!
(just a question - was trimmed out unanswered earlier: which system component
produces the following monitor-log entry?

“ proxy(()) triggers ()”

is it the event-log, when “the kernel itself will trigger the proxy when
needed”, if that proxy is the one attached to the timer???

because if yes, then i can confirm (and you can beleive me) that i can see
those abnormal relative times comparing timestamps of this monitor-log
entries (logged as rdtsc-cycles!)… so we could be sure, that the abnormal
delay happens far before my silly app could receive that proxy tick at all,
and then producing its silly output, otherwise consistently…
!!!

i believe both you and mario that you are seeing something. but i honestly
don’t see a failure with your program here using the versions [I-K]

i honestly believe.

i’d be interested if running my test app on your system there (with Proc
at lower priority) shows the same problem.

(me to…just post your app > :slight_smile:

the README in the archive discusses the timing issue in great length.

thanks again for your patience and deliberation in helping to work this
out.

thank you, too, honestly…

AND NOW: the test results (of my app, only > :frowning:> …

i’ve done everything according to your scenario, at
the lowest possible system load, in a single text console.

the most important thing, that the ‘elapse’ lines still will be
produced, but it is also important that the rate of them seems to
be system load dependent: if i run the same test at a heavy
system load, i get abnormal expirations at a much higher rate.

you get everything attached: all of the dumps (‘ps’ and ‘sin ver’
outputs also included) + the current source of my test app + the
test app as an executable + the script, how i run the app.

(just ask me if you have further questions about the results…)

good luck.

PS: i would (kindly) ask it again: is it possible to post your
current executable of my test app, used in tests in your
environment?



Tamasi Gyorgy <> gtamasi@freemail.hu> > wrote:
Previously, Randy Martin wrote in qdn.public.qnx4:
i’ll try to trim the posting a bit …

(was successful.)


yes, i did try both your code and my code (that i use for analysis) on various
versions of Proc, starting with i and moving to the latest ‘k’, which is
in internal beta right now. i guess i assumed that you knew i would do
this.

running your code i do not see the ‘elapse’ problems that you see there.

(Hm…) And do you believe, that Mario - as an independent - has
also seen it?

and i’ve been through the cvs logs to see if there is a difference in the
timer handling code and there is none.

(((This can be a side effect of an other change, too.)))

the caveats as mentioned earlier by me apply to all versions of Proc.

there are other issues here. interrupt load, cpu holdoff from other
peripherals (like video etc.)

my tests all run from text console. i do not run them in graphics mode.

let’s try the following:

use 425J
use text mode only
Proc at prio 26

i was running my tests with Proc at (default) prio 30.

(maybe it is helpful: we experienced the symptom on intel
processors (Pentium MMX at 250MHz/TX chipset, CeleronA at ~410 &
466MHz/ZX chipset); i will try to test it on a newer AMD on
monday, too, because some unconfirmed info says, that it can be
un-affected by the symptom.)

i posted my test code to /usr/free … it was part of a series of notes that
i put together on using qnx4 for realtime work. that code in there uses
Trace calls for analysis so it shouldn’t be blocked on any system service
(a Trace call is a kernel call)

usr/free/qnx4/os/samples/misc/ called qnx4rtime.tgz

hm, I don’t know how can i announce it: currently (09:00 PM,
Budapest) there is no file ‘qnx4rtime.tgz’ in the referenced
directory on QUICS, and it is not mentioned in ls-lR, nor find-ls
of /usr/free. (dot)

please try either your original test again and/or my sample code in the
above scenario.

i’ll try my test in your scenario.

would it be possible to temporarily repost somewhere (compiled)
executable version of my test-code, running in your environment
(and producing no symptoms) - e.g. together with qnx4rtime.tgz?



\

Randy Martin > randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems > www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579



—559023410-2078917053-979347226=:1354
Content-Type: APPLICATION/OCTET-STREAM
Content-Transfer-Encoding: BASE64
Content-Disposition: attachment; filename=“test.tgz”

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
KYwEfHruH8xis1wiPtu1nt++GblZvIr05kz73fZEB+ha3fKFDzTNm7PwnoYl
deODXhwEvPObWUfALOXeetoONWX0f4T1d0eL69OMe60usDtHsu9NzbxDpfTY
mw6N8Y0D4X7V/w1NpJ4mdRRmCP4dk35VWq6z/qCeiFT/G8tfmPzo2F7ljWfm
X3ZF3XtSqYvwaNvq5g2g69RMRKRx0c/siHJ19cxXJMOCiSBrOcysiJlpzNKA
bMoEaNEaoiDcMKZpMb0quQUMGb2J9oGFtYvYS5yrCL3Z3tKq/xSMQ1icpvzN
2yMzIuT2b/5JWoETRroq86Zf3/gGlaVfqtJhHNN8d1RP557n71WsqpuF24Qf
XnvzH6hWmUw+RpfQYcKF2Rz8NUqIRzuUrjsIqig/HBlGepUXp1FxRWrgf/z3
tGlpZnP7R54H0EydWxggzFaON46NvMVdq5a481Y9C9WquHm/jQFPT7vybiBX
PT3tqrt6lU2MU8oyI2lrU53dcZmdt5r5KOtjPMqEQGZNRyuzaBHwdtoidC0q
dzOz42Y6g1EPoJb9qsrp67nLWrdlIyM8Mk26yRdPV3usu14wTG/QRQwAvK+2
znFjnK1PmbaFNZm6z50drZ46dNKLv2L0RuPI4+s621C8NWAMvRmAWeMsqHZ6
9zP42/Sm69/nOjO1de/DhqnUJ8EZmWsU0NSM5QdclpmrGCC89owYK6OIraPd
Rsun+/pselaFNTiXFHHm6g6wCFVVDffcd+986o9HpkVIJofVkWklEew/hr1m
na8x2V2dIWbWo+208z27D+G7JsW62Dor7QAazfCytlaqoJlUmNJwzu+I0FcZ
WFpk82bv0Z30kSlpkeosrKcE1l02qm4Wri4HAzSdU5ueYThmuLbEJ8ItJePf
xvXav0IkjSNl9AZ1qH3rUr9n6Xo6szP1netaFDmizpS1u9nsSLJGU9qkzQKJ
SlJ17oEC8W2spY3ZPGqHWKjzeJdf2LmCBbGczyokc57NDuT+qODh964yYN2I
3jafPZeM9xUbaaK8lN8jL5AM08tHm9MB4/+epOT/T0hKRiXlLROtiXWtjqyL
RWH6yDaFrKSqK9oKhVkS5uM+I5LfUrLlzxvaGe//mtEcnbG6Y9XqGWAsZ9CX
Bvw75n+Mv//dMNj7PzVVIX9+//v/2f7PfB3cn2z/X+x/ohFVIun+1zTQBWLI
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
7sl4WY4ifOy0h5b7h2InT5Cc8iFj/+DjTLQrIyNSTqrTHlm29unADbhivz6I
Dc8dRGVYHhm0bIlloehsZ/RJcq+tO3SylVAKXNCVp5oWqCvXsfbJ6Tb3nIf3
EYoSqAra9fIoygVIUbtObvPMqZXBdpWX+0fyFIuMCN5hQV2N/cOpTgEgp6A0
8bgt4qBAVvb4w7iC1DIiUXmlfRr1GEdLXJXmyFqkoeM4yDgsDRY6CIqbAMm5
+LrDsOYOwtPMEnQV1HgUvyd5NMFHSbvVa2l8bAMNLs7jMAhTyZJHShwHcpQl
pNzmWSkn0jBWIt7OWKwsOe/pA8Kn2GsPJ9PgAllAox7YiogyWMq263XHdrkw
iMMw2hhERGlEK8rBM5l9RK05qWTJvdMiwosCbjlaYwtGJ+uKC6OXH35bXsOn
5emnxdnTQV9thn8qr53Dc+2tki83fPl3/79ft4vN7bxMG383O7mdfVxefJyd
3tzNLlcnZ/ObzZPV3e3/AI22Z+WG79oOjtr/Xxczi0OZgptYXX7LcFInWsW8
v1N/CwXcbW5P1oWV9Wr1oKzf+n1fuP8lr2F4+/p5efvh3dvh7bvXw/H7o/cv
hmF49uO/DO31/vWb+vn7n9+8Ofrp+aP6lR7GdxPOh3cvjp7/YZheSj217mkZ
5t6uV6dlfj27HMrb25pEs/5shvFdq/VQoN//fgTtII8vlx+saZe7YXx/6PKX
m6+bdrEfxnetH774yWJ5tmiINNB7uX1Pjr9fnl0u/qFeXh799RUH4847BOzw
fPF5mF0PKVWEUYzo8t8QT06uN8th9q8N2YDmQOBmsR5mr8vgVmbIs6vBnqfH
bph9GMrEsdjg7M1gyje2/bRIj2P9w5Q/fCNiiciQVw8SuTlZt+tba+hvM3Vz
+7VKoluTm0BUtOpTeb1Z1fXNOTWlSVO79zGtKc8vVzc3XyvGTrp2fe7eLm9a
y1s76bdP4PrkanG5Om3X+63r3714++MfvnH9jtC/HL1+Xz/O9M71t8vr5e0w
ez/Mzxaf56eraz39Zaa/7PSXm/7y019h+itOf6Vhdnt/y8ZNPKAJXp7csvqd
Opz70+Fqdba42rK55fCbk9v/+s0w+3GYrQc7cVNMtXVq12zbmXZ3WZdauGm5
J9/y0WBqgqgiWOmfg9uWiXms/9ywuVwsbgqdBqhkbVneykK1f8P8w/J6vvlY
xbrZDLPF+fDb8SHY7uC27nDP+O4dRliRMzSDrO8mSFpX7mmZmJzdXd3ULnw2
zD+urhbz24uv8+PjH+Yfzzfz9y/+/f3rH39+Xycy88WXxfHy6m7+4+ri5fJy
sWkUJh1YafwaKTyZn378dPzxqgEMAYw977JUACfr9Zvlen38ed1QllHhIdTV
4urN9UUDOAak80lRtTj0juTnp282F89v1nVMmt3UPj/bnA/zVy+P51XS72/X
l/VmzRhtVab4sKk3S5XnSyLu9Nb1Mrf1+suzMwaYgwCNwPsyWSp/cyPMv9T2
azdhHQ1pPYlcD5J2b3Jxt/z+8rp0my9DWZqphmRladVDxsbvuiIfsSKbemOP
4YrYbCsxMXt5/QCksHe8Hhvds0DaPESksFURw8nd7ar22QZN210Te1qDck+b
z82Bll/l+eVs1dos2G9aPqvg7cmyKJy0Ha2f2kkUyz4tK/8Ke3f2+nZRlgim
odLD5Brq+bNnJ6ef7m4aIG8BmEx0epfM182z00//1gCjlVeAnwBa2V2+lqvR
ZKMzD/fIdvXtejU0mZ395tWhXa3b1e7Aq5tm7m3xG1fbdnU48GrXro4HXu3b
1enAq0O7Oh94daxXe3Xg1aldrQ+8OrerzaH6rmKaZkP1fechNE5N6+Whzlln
m4/tWjOM7/1rqSNeri6W12UUbgwd2qRtSl/zWh94+ajKQxvVjLo8tFVtM15/
aLO29UUNrT/w8ma+4dCGtc1+w6Eta5sBh0O7qW16D4f2U9cGgXBoq7qqyPH5
U9/llVcxnfI8e/txdbu6bnc/tJn8yMyhzeRHZtIwvj/ETH2Q/PH6i5vfNK6a
Wd98PF9d396cr+uEzij1qRKPUyu6B4kfn55U2UwwWz1Opl56USN9sT65+bg8
3czP1svPi/VmvrEflqvNk/IcmS3VF63KAuxIfVFKHbU9gtlx+6DHD2/ah/zY
P1aPzeP6wYxbCbN3rxojjhkx4kyhMBJ6jLy9eLIpU/FXP5Wf56frMgO5qI/E
wpJxX1LjqrH0uH7VaP7yrF5Q/u+x1VhKE0s93YTh9fXN3e3w6cNZEWQ4L+9n
bT1Qv7jarM5vt74rawQ9rBeXw+wHU1ZGug15sXaM+t5vgDDc/OmqXRu/2Vh/
PUOpSZ3Szri62xB+uDlrDOXWaNk9wFBZNNwu1uPVjf3cW3mNV9PUqV2fvnW9
SjtTrbvNugz2pyeX7cur0yd0n7x9H+LSKrVzn3L1h/qUmJ2uLlfrzVAmZqd3
t4t/vlgvFtePP1ze1dmfVW0oUKkvsPKTwHU19eCqrF19L3A9FPrW9WXZN17q
vnmpOUA31R0U7kPLyfv7HKYbMz5vVE83/mlZ0jXdlBVC6Xtfa/ccZh9rfZPZ
n2rSpdkf2zbR8XKY/UddWf/dT8Owua0T1uFTEYP+pNmuNeNQpw+iF/MWxbrB
P/tTzfs9e6XbeHA+3JzWK0sLVA62qF/eLR/R5JUWMqK+GzGBScsLvIdwWyYw
LfC615v0lywvqhzD6aOhFd64X79Ok3G394S4auvj/8v7/5vl9X+Wp8dffwjw
8P6/KuZttvb/41C+qZn+f93//xu83r77+Yd3R2+G/ddPR23bf3z9/sW749c/
/zQ8P3r/4lFZt85pd3/nVb+bPrgnxaTK/8eLm6H0J51z7gLrhr8O90D7Q/n/
59PboYzlBRgacDwVQOD0XQG6Z+X/o7uLMrZUYHzUhoG6UbwnXP1qB1gHxpeL
D0OZSNbZTR/Y9pslinmPYjtluAfufKrKOSKKRTkjxTJSVezzxecdMXc+S8rZ
AY4nCfdA/lyBr2qrrj4P9XmAwHqSsA2kzxX4uvz/u7vrMrsiGXeANydbwPtP
BdiatMpYHikoYzsm2KZInx+SceucoAF3Plfg8/Llm8JCecbuUKwb/zu2uv25
Ark5CtM7FGlb/N4Atj9XGY+YYryn+I/bi5BxlUSLJbqLfqKb5bTeYcfeMQJ3
ly2N1RH4snw1Al9Rc5SZUaP43a+vX1+/vn59/UWv/wYsn9bcAN4BAA==

—559023410-2078917053-979347226=:1354–


Randy Martin randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579

you’re a tough cookie. :slight_smile:

yes i compiled your original code and ran it. but i did not see the same
behaviours as you saw on either I or J.
so i was tweaking the time a bit to see if i could cause the condition to occur.

the binary just sends the data to Proc who does the calculations for the
timer so it shouldn’t factor into it.

but you’re right, i will put the original binary back in /usr/free/tmp and
call it gtamasi-orig so you can run the same component.

please let me know the results of looking at the code archive i posted.
and thanks for staying away from the boundary condition. i gather from your
post below that by staying underneath the boundary in both I and J and by
dropping Proc down in priority, and by not calling any functions in your
realtime loop that will block, that you are seeing correct behaviour?
this is good…

i agree that i would like to know if and why there is a difference between
I and J.

Tamasi Gyorgy <gtamasi@freemail.hu> wrote:

—559023410-143302914-979605342=:18583
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII

Previously, Randy Martin wrote in qdn.public.qnx4:
i put your code compiled on my machine along with src in /usr/free/tmp

look for gtamasi* and gq4* files.

I’ve downloaded them all, and I’ve a problem (or in other words:
you’ve a problem):

[I assume, objects & binaries are based on the sources with
identical names, respectively.]

The problem is the following: none of these sources (nor gq4.c,
nor gtamasi.c) are the ‘genuine’ ones, what I’ve ever posted to
execatly demonstrate my problem.

Let’s see the details (and ‘details are always incarnations of
Evil’, as the Bible of (pathetical) beta-testers could state to
us, ‘if You run away, afraid of Evil, and miss to find Him behind
a detail, you miss to ever have a share in Grace’…> :slight_smile:> :

  • gq4.c: it is a ‘deeply’ modified form of the original posting
    (to Mario).

  • Neutrino-specific code has been clipped out entirely, but not
    correctly. Updating vars ‘is_first_cycle’ & ‘last_cycles’
    has also been clipped out (incorrectly), so the
    problem-testing ‘if’ will never be executed, so any possible
    symptom will be successfully suppressed…

  • Timing, has also been changed: timer-cycle = 3999390ns = 2 *
    1999695ns (imitating ticksize=2ms), however ticksize is set
    to 999847ns (1ms).

Limit-checks for ‘elapse’ are coded to test an ~1ms cycle,
not a ~4ms cycle, the coded cycle time.

(Otherwise, it’s really a ‘vital’ app…> :slight_smile:

  • gtamasi.c:

It is identical to my original posting (to Mario) except one
little change: cycle-time of the timer is set to 999847+1ns
(not 999847ns).

I’ve described earlier, that I can only (‘safely’) reproduce
the symptoms, if cycle-time of the timer is set to an exact
multiple of ticksize -ens… and not with +/-1ns…

(Here i’m extensively pressed to use my ‘enourmous sense of
humour’ again: my assumption can be, that we could blame the
firewall, again, in charge of these ‘ignorable’ differences…As
you can see now (and i hope: assumed previously), none of ‘those
options’ (listed in my previous posting - as an argument in the
‘ftp flame war’) can be applied on me…> :slight_smile:

I really do not know, whether when you say: ‘i can not reproduce
your problem’, you are using gq4 & gtamasi exactly in their
posted form or not, but i would suggest to use my latest code
(posted at Friday, in the attached test.tgz) in an unmodified
form, when you try to reproduce the problem…

I want to make it clear: I absolutely accept your ‘bottom line’
about the danger of sitting on boundary conditions, as a general
guideline - i will not do it in my real-world apps…

…BUT: my current goal exactly to show, that in that specific
boundary condition (timer-cycle = multiple of ticksize) different
versions of Proc32s will behave slightly differently, and the
newer one (4.25J) shows possibly unexpected (by Mario, by me,
possibly by you & others, or even by QSSL) symptoms, which are
possibly not intended to be shown (at least not shown by 4.25I
Proc)…

I will try your test-code (from qnx4rtime.tgz) as soon, as
possible (finally, i’ve downloaded it)…

Good luck,
-Gyorgy

PS: The uncomfirmed info, mentioned earlier, that the problem can
not be reproduced on an AMD processor, seems to be false now.
I’ve personally reproduced it on a machine with AMD proc. today -
using my ‘genuine’ test app; ok, Mario will get some royalty > :slight_smile:
… some > :slight_smile:> …

PS2: I’ve attached the results of testing my app in your
scenario, except Proc was running at prio 30 (you will not see
significant differences comparing with the case when Proc was
running at prio 26…)



—559023410-143302914-979605342=:18583
Content-Type: APPLICATION/OCTET-STREAM
Content-Transfer-Encoding: BASE64
Content-Disposition: attachment; filename=“test2.tgz”

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
9mz/vuzLvuzLU5W/AVNn+0MAKAAA

—559023410-143302914-979605342=:18583–


Randy Martin randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579

success.

using the timing parameters that you passed to me: -u7998780 which is an
exact multiple of the ticksize (at 1999695) then i can see different behaviour
between I and J.

but from the code i cannot see how it can be different. the boundary condition
should show +/- a timer tick in both os versions.

this raises a question. i can modify the code for 425K so that timers will
fire if time is <= rather than < the curtime.

i think this is the way it should be anyway.

we will be introducing a 425K in short order to address a few other things.
i will talk with the group to see if we should make this change.

bottom line is that the boundary should be avoided anyway in case of
overflow/rounding so maybe it is better to document the behaviour and move
on, but i think we shoul change the timer algorithm.

Randy Martin <randy@qnx.com> wrote:

you’re a tough cookie. > :slight_smile:

yes i compiled your original code and ran it. but i did not see the same
behaviours as you saw on either I or J.
so i was tweaking the time a bit to see if i could cause the condition to occur.

the binary just sends the data to Proc who does the calculations for the
timer so it shouldn’t factor into it.

but you’re right, i will put the original binary back in /usr/free/tmp and
call it gtamasi-orig so you can run the same component.

please let me know the results of looking at the code archive i posted.
and thanks for staying away from the boundary condition. i gather from your
post below that by staying underneath the boundary in both I and J and by
dropping Proc down in priority, and by not calling any functions in your
realtime loop that will block, that you are seeing correct behaviour?
this is good…

i agree that i would like to know if and why there is a difference between
I and J.

Tamasi Gyorgy <> gtamasi@freemail.hu> > wrote:
—559023410-143302914-979605342=:18583
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII

Previously, Randy Martin wrote in qdn.public.qnx4:
i put your code compiled on my machine along with src in /usr/free/tmp

look for gtamasi* and gq4* files.

I’ve downloaded them all, and I’ve a problem (or in other words:
you’ve a problem):

[I assume, objects & binaries are based on the sources with
identical names, respectively.]

The problem is the following: none of these sources (nor gq4.c,
nor gtamasi.c) are the ‘genuine’ ones, what I’ve ever posted to
execatly demonstrate my problem.

Let’s see the details (and ‘details are always incarnations of
Evil’, as the Bible of (pathetical) beta-testers could state to
us, ‘if You run away, afraid of Evil, and miss to find Him behind
a detail, you miss to ever have a share in Grace’…> :slight_smile:> :

  • gq4.c: it is a ‘deeply’ modified form of the original posting
    (to Mario).

  • Neutrino-specific code has been clipped out entirely, but not
    correctly. Updating vars ‘is_first_cycle’ & ‘last_cycles’
    has also been clipped out (incorrectly), so the
    problem-testing ‘if’ will never be executed, so any possible
    symptom will be successfully suppressed…

  • Timing, has also been changed: timer-cycle = 3999390ns = 2 *
    1999695ns (imitating ticksize=2ms), however ticksize is set
    to 999847ns (1ms).

Limit-checks for ‘elapse’ are coded to test an ~1ms cycle,
not a ~4ms cycle, the coded cycle time.

(Otherwise, it’s really a ‘vital’ app…> :slight_smile:

  • gtamasi.c:

It is identical to my original posting (to Mario) except one
little change: cycle-time of the timer is set to 999847+1ns
(not 999847ns).

I’ve described earlier, that I can only (‘safely’) reproduce
the symptoms, if cycle-time of the timer is set to an exact
multiple of ticksize -ens… and not with +/-1ns…

(Here i’m extensively pressed to use my ‘enourmous sense of
humour’ again: my assumption can be, that we could blame the
firewall, again, in charge of these ‘ignorable’ differences…As
you can see now (and i hope: assumed previously), none of ‘those
options’ (listed in my previous posting - as an argument in the
‘ftp flame war’) can be applied on me…> :slight_smile:

I really do not know, whether when you say: ‘i can not reproduce
your problem’, you are using gq4 & gtamasi exactly in their
posted form or not, but i would suggest to use my latest code
(posted at Friday, in the attached test.tgz) in an unmodified
form, when you try to reproduce the problem…

I want to make it clear: I absolutely accept your ‘bottom line’
about the danger of sitting on boundary conditions, as a general
guideline - i will not do it in my real-world apps…

…BUT: my current goal exactly to show, that in that specific
boundary condition (timer-cycle = multiple of ticksize) different
versions of Proc32s will behave slightly differently, and the
newer one (4.25J) shows possibly unexpected (by Mario, by me,
possibly by you & others, or even by QSSL) symptoms, which are
possibly not intended to be shown (at least not shown by 4.25I
Proc)…

I will try your test-code (from qnx4rtime.tgz) as soon, as
possible (finally, i’ve downloaded it)…

Good luck,
-Gyorgy

PS: The uncomfirmed info, mentioned earlier, that the problem can
not be reproduced on an AMD processor, seems to be false now.
I’ve personally reproduced it on a machine with AMD proc. today -
using my ‘genuine’ test app; ok, Mario will get some royalty > :slight_smile:
… some > :slight_smile:> …

PS2: I’ve attached the results of testing my app in your
scenario, except Proc was running at prio 30 (you will not see
significant differences comparing with the case when Proc was
running at prio 26…)



—559023410-143302914-979605342=:18583
Content-Type: APPLICATION/OCTET-STREAM
Content-Transfer-Encoding: BASE64
Content-Disposition: attachment; filename=“test2.tgz”

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
9mz/vuzLvuzLU5W/AVNn+0MAKAAA

—559023410-143302914-979605342=:18583–


Randy Martin > randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems > www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579


Randy Martin randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579

Previously, Randy Martin wrote in qdn.public.qnx4:

you’re a tough cookie. > :slight_smile:

(IMHO: only - possibly - tougher than you - possibly - originally expected,
and, in general, these kind of false assumptions can bring discussions to an
unnecessarily wrong direction…:slight_smile:

yes i compiled your original code and ran it. but i did not see the same
behaviours as you saw on either I or J.

I would like to (kindly) ask it again: test my app posted in an attachment
at Friday…

Here is cksum for my Proc32 4.25J:

3465706260 130615 Proc32

so i was tweaking the time a bit to see if i could cause the condition to occur.

(No comment.)

the binary just sends the data to Proc who does the calculations for the
timer so it shouldn’t factor into it.

but you’re right, i will put the original binary back in /usr/free/tmp and
call it gtamasi-orig so you can run the same component.

04:59 PM, Budapest: I just can’t see it in /usr/free/tmp/… If it should be
there, check your firewall, again.

please let me know the results of looking at the code archive i posted.

You mean gtamasi-orig here?

(Or qnx4rtime.tgz?: those results had been posted already…)

and thanks for staying away from the boundary condition. i gather from your
post below that by staying underneath the boundary in both I and J and by
dropping Proc down in priority, and by not calling any functions in your
realtime loop that will block, that you are seeing correct behaviour?
this is good…

i agree that i would like to know if and why there is a difference between
I and J.

I’m finally happy, that it seems to be successful to get my point (at least
the question; not the answer) cleared…

(So I can cancel my plain-ticket to Canada…and cancel my optional plans to
become a serial killer in the - hopefully beautiful - town of Kanata…instead
of choosing the other option of permanently using my sense of humour,
especially, if i have nothing more to do…:slight_smile:

Previously, Randy Martin wrote in qdn.public.qnx4:

success.

I’m - definitely - happy.
(So we can avoid to ping-pong with gtamasi-orig…)

using the timing parameters that you passed to me: -u7998780 which is an
exact multiple of the ticksize (at 1999695) then i can see different behaviour
between I and J.

but from the code i cannot see how it can be different. the boundary condition
should show +/- a timer tick in both os versions.

See case where (timer-cycle == 1ticksize), will be loaded with overruns,
“differently wrong”, as case (timer-cycle == N
ticksize; N > 1)…

this raises a question. i can modify the code for 425K so that timers will
fire if time is <= rather than < the curtime.

i think this is the way it should be anyway.

we will be introducing a 425K in short order to address a few other things.
i will talk with the group to see if we should make this change.

bottom line is that the boundary should be avoided anyway in case of
overflow/rounding so maybe it is better to document the behaviour and move
on, but i think we shoul change the timer algorithm.

Back to an already discussed issue (as a suggestion only):

IMHO: difference of behaviour of Proc 4.25I & 4.25J (in the same
environment) can only be caused by the following things,

(a) a source-level difference in Proc (I->J) itself can cause
this symptom, OR
(b) [understated, as much as possible:] an other change in an
other part of QNX 4.25C & 4.25D patches interfering with a
change of Proc (I->J) can cause this symptom.

You’ve said that you’ve already checked cvs-logs related to
timer-processing code, and you’ve seen no difference.

I would suggest (as earlier) to make a global check on Proc
changes, because other changes can also have side-effects, but
anyway (as a bottom line): you MUST SEE THE EXACT ANSWER either
(a) in the cvs-log of Proc32 (I->J) itself, or (b) at least in
cvs-log of an other, possibly interfering app changed in 4.25C &
D patches (sorry, if it sounds ‘too obvious to miss by default’
for you)…

(I haven’t ever seen any official posting about differences of I
& J Proc, it is not mentioned in the official qnx425 history
file, at all…)

Just a list of ideas (loosely coupled to timer-processing, if at
all; without too deep consistency-control :slight_smile:

  • correctness of implementation of ‘-F (timer-frequency)’ option
    processing (->default case) (introduced in the near past,
    changed in 4.25I, too)?
  • periodical burst in scheduling / interrupt processing?
  • coprocessor setup / rounding error?

I’ve done all, what i can. Good luck.

  • Gyorgy “The Tough Cookie” Tamasi
    (as a nominee in the “Bg of the Year" section, or, at least,
    in "The Longest Discussion About a Possible B
    g of the Year”
    section :wink:

PS: Thank You for Your ‘very special appereance’ in this
discussion.

(And thanks to Mario…and my wife, my son, my mother & father,
my cat…oops, it should come later…:wink:

([informal material:] As You can - otherwise correctly - expect,
I do not know too much about the private history & hierarchy of
QSSL. However, browsing the newgroups, I can detect: you seem to
be ‘rare bird’ (and not a ‘general purpose answering machine’:-).
So You can be sure, I really appreciate this appereance. Adding
an intuitive heuristics to it: your user-id is simply ‘randy’
(just like ‘steve’!, and not ‘rmartin’ or ‘randym’:-), so
following this silly, but possibly operable heuristics, you can
even be a ‘rarer bird’ than I can expect…not to mention:
user-id ‘steve’ seems to be retired to the ‘hall of
fame’(?!)…[:end of informal material])

[clip]

thanks for your help on this.
i will followup with more info as i find it.

Tamasi Gyorgy <gtamasi@freemail.hu> wrote:

Previously, Randy Martin wrote in qdn.public.qnx4:
success.

I’m - definitely - happy.
(So we can avoid to ping-pong with gtamasi-orig…)

using the timing parameters that you passed to me: -u7998780 which is an
exact multiple of the ticksize (at 1999695) then i can see different behaviour
between I and J.

but from the code i cannot see how it can be different. the boundary condition
should show +/- a timer tick in both os versions.

See case where (timer-cycle == 1ticksize), will be loaded with overruns,
“differently wrong”, as case (timer-cycle == N
ticksize; N > 1)…

this raises a question. i can modify the code for 425K so that timers will
fire if time is <= rather than < the curtime.

i think this is the way it should be anyway.

we will be introducing a 425K in short order to address a few other things.
i will talk with the group to see if we should make this change.

bottom line is that the boundary should be avoided anyway in case of
overflow/rounding so maybe it is better to document the behaviour and move
on, but i think we shoul change the timer algorithm.

Back to an already discussed issue (as a suggestion only):

IMHO: difference of behaviour of Proc 4.25I & 4.25J (in the same
environment) can only be caused by the following things,

(a) a source-level difference in Proc (I->J) itself can cause
this symptom, OR
(b) [understated, as much as possible:] an other change in an
other part of QNX 4.25C & 4.25D patches interfering with a
change of Proc (I->J) can cause this symptom.

You’ve said that you’ve already checked cvs-logs related to
timer-processing code, and you’ve seen no difference.

I would suggest (as earlier) to make a global check on Proc
changes, because other changes can also have side-effects, but
anyway (as a bottom line): you MUST SEE THE EXACT ANSWER either
(a) in the cvs-log of Proc32 (I->J) itself, or (b) at least in
cvs-log of an other, possibly interfering app changed in 4.25C &
D patches (sorry, if it sounds ‘too obvious to miss by default’
for you)…

(I haven’t ever seen any official posting about differences of I
& J Proc, it is not mentioned in the official qnx425 history
file, at all…)

Just a list of ideas (loosely coupled to timer-processing, if at
all; without too deep consistency-control > :slight_smile:

  • correctness of implementation of ‘-F (timer-frequency)’ option
    processing (->default case) (introduced in the near past,
    changed in 4.25I, too)?
  • periodical burst in scheduling / interrupt processing?
  • coprocessor setup / rounding error?

I’ve done all, what i can. Good luck.

  • Gyorgy “The Tough Cookie” Tamasi
    (as a nominee in the “Bg of the Year" section, or, at least,
    in "The Longest Discussion About a Possible B
    g of the Year”
    section > :wink:

PS: Thank You for Your ‘very special appereance’ in this
discussion.

(And thanks to Mario…and my wife, my son, my mother & father,
my cat…oops, it should come later…> :wink:

([informal material:] As You can - otherwise correctly - expect,
I do not know too much about the private history & hierarchy of
QSSL. However, browsing the newgroups, I can detect: you seem to
be ‘rare bird’ (and not a ‘general purpose answering machine’:-).
So You can be sure, I really appreciate this appereance. Adding
an intuitive heuristics to it: your user-id is simply ‘randy’
(just like ‘steve’!, and not ‘rmartin’ or ‘randym’:-), so
following this silly, but possibly operable heuristics, you can
even be a ‘rarer bird’ than I can expect…not to mention:
user-id ‘steve’ seems to be retired to the ‘hall of
fame’(?!)…[:end of informal material])

[clip]


Randy Martin randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579

Yet another detail (can help to isolate the problem, possibly):

I’ve extended my silly app (on Monday, before I’ve finally
downloaded your test app; but i hope, currently you can already
believe the results produced by this -whatever- silly app) to
test 2 (cyclic) timers in the following test-case:

Environment: as ‘usual’ (Proc 4.25J at prio 26, text-mode,
ticksize = 1999695ns, timer-cycle = 4 * ticksize = 7998780ns)

  1. create 2 timers (with proxy notification)
  2. start timer0 [timer_settime()]
  3. check accuracy of timer-proxy ‘ticks’ in a for cycle;
    somewhere in the middle try to apply the ‘ticksize setting
    trick’.
    !3. restart timer0 (on the fly, with the same cycle)
    [timer_settime()]
  4. start timer1 [timer_settime()]
  5. check accuracy of timer-proxy ‘ticks’ of both(!) timers in a
    for cycle; somewhere in the middle apply the ‘ticksize
    setting trick’.

[The original version of the silly app contained steps 0;1;2
only, as you can remember, in order to show that after executing
the ticksize setting trick, the inaccuracy disappears…so these
steps will work now, as you’ve seen earlier…]

What are the results in step 5 (2nd test-loop), and what is
strange with them?

Enabling/disabling step 3 in this test case will force the
app (& timers) to behave differently!!!

  • If step 3 is disabled (so timer0 IS NOT restarted before
    starting timer1 and starting the 2nd test-loop):

→ In step 5 (2nd test-loop) both timers will perform
correctly from the very beginning(!): no (periodical)
overrun/underrun can be detected before and/or after
executing the ‘ticksize setting trick’)!!!

  • If step 3 is enabled (so timer0 IS restarted -on the fly-
    before starting timer1 and starting the 2nd test-loop):

→ In step 5 (2nd test-loop) both timers will produce
(periodical) overruns/underruns before before executing the
‘ticksize setting trick’, but after resetting the ticksize
overruns/underruns of both timers disappear!!!

[You can find the source of the app & test-results attached…]

I hope, it helps…

Good luck,

  • Gyorgy (the “yet another detail” guy)

Tamasi Gyorgy <gtamasi@freemail.hu> wrote:

Is there any news regarding this issue?

Randy is out of town on business until Friday, he probably won’t see
this query until at least Monday.

Is there any fix available? (Proc32 4.25K?)

I know he was talking about releasing a new Proc with some fixes. I THINK
it included a fix for this, but I don’t know. (I just fixed another timer
problem that somebody flagged with alarm() call, and I’m currently running
it on my system as an initial test. But, I don’t currently know the status
of this particular problem.)

-David

QNX Training Services
dagibbs@qnx.com

Is there any news regarding this issue?
Is there any fix available? (Proc32 4.25K?)

Gyorgy Tamasi


Previously, Randy Martin wrote in qdn.public.qnx4:

thanks for your help on this.
i will followup with more info as i find it.

Tamasi Gyorgy <> gtamasi@freemail.hu> > wrote:
Previously, Randy Martin wrote in qdn.public.qnx4:
success.

I’m - definitely - happy.
(So we can avoid to ping-pong with gtamasi-orig…)

using the timing parameters that you passed to me: -u7998780 which is an
exact multiple of the ticksize (at 1999695) then i can see different behaviour
between I and J.

but from the code i cannot see how it can be different. the boundary condition
should show +/- a timer tick in both os versions.

See case where (timer-cycle == 1ticksize), will be loaded with overruns,
“differently wrong”, as case (timer-cycle == N
ticksize; N > 1)…

this raises a question. i can modify the code for 425K so that timers will
fire if time is <= rather than < the curtime.

i think this is the way it should be anyway.

we will be introducing a 425K in short order to address a few other things.
i will talk with the group to see if we should make this change.

bottom line is that the boundary should be avoided anyway in case of
overflow/rounding so maybe it is better to document the behaviour and move
on, but i think we shoul change the timer algorithm.

Back to an already discussed issue (as a suggestion only):

IMHO: difference of behaviour of Proc 4.25I & 4.25J (in the same
environment) can only be caused by the following things,

(a) a source-level difference in Proc (I->J) itself can cause
this symptom, OR
(b) [understated, as much as possible:] an other change in an
other part of QNX 4.25C & 4.25D patches interfering with a
change of Proc (I->J) can cause this symptom.

You’ve said that you’ve already checked cvs-logs related to
timer-processing code, and you’ve seen no difference.

I would suggest (as earlier) to make a global check on Proc
changes, because other changes can also have side-effects, but
anyway (as a bottom line): you MUST SEE THE EXACT ANSWER either
(a) in the cvs-log of Proc32 (I->J) itself, or (b) at least in
cvs-log of an other, possibly interfering app changed in 4.25C &
D patches (sorry, if it sounds ‘too obvious to miss by default’
for you)…

(I haven’t ever seen any official posting about differences of I
& J Proc, it is not mentioned in the official qnx425 history
file, at all…)

Just a list of ideas (loosely coupled to timer-processing, if at
all; without too deep consistency-control > :slight_smile:

  • correctness of implementation of ‘-F (timer-frequency)’ option
    processing (->default case) (introduced in the near past,
    changed in 4.25I, too)?
  • periodical burst in scheduling / interrupt processing?
  • coprocessor setup / rounding error?

I’ve done all, what i can. Good luck.

  • Gyorgy “The Tough Cookie” Tamasi
    (as a nominee in the “Bg of the Year" section, or, at least,
    in "The Longest Discussion About a Possible B
    g of the Year”
    section > :wink:

PS: Thank You for Your ‘very special appereance’ in this
discussion.

(And thanks to Mario…and my wife, my son, my mother & father,
my cat…oops, it should come later…> :wink:

([informal material:] As You can - otherwise correctly - expect,
I do not know too much about the private history & hierarchy of
QSSL. However, browsing the newgroups, I can detect: you seem to
be ‘rare bird’ (and not a ‘general purpose answering machine’:-).
So You can be sure, I really appreciate this appereance. Adding
an intuitive heuristics to it: your user-id is simply ‘randy’
(just like ‘steve’!, and not ‘rmartin’ or ‘randym’:-), so
following this silly, but possibly operable heuristics, you can
even be a ‘rarer bird’ than I can expect…not to mention:
user-id ‘steve’ seems to be retired to the ‘hall of
fame’(?!)…[:end of informal material])

[clip]


\

Randy Martin > randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems > www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579

internally we have been testing with this new Proc that corrects the
behaviour that Tamasi was seeing.
there are a few other things we want to check out with this Proc before we
post to beta.
It will be Proc32.425L (most likely if current numbering holds)

our server has been soaking in the new Proc for about a month now, and all
looks quite good so far.
when we go to beta we will post some info on the changes made..


David Gibbs <dagibbs@qnx.com> wrote:

Tamasi Gyorgy <> gtamasi@freemail.hu> > wrote:
Is there any news regarding this issue?

Randy is out of town on business until Friday, he probably won’t see
this query until at least Monday.

Is there any fix available? (Proc32 4.25K?)

I know he was talking about releasing a new Proc with some fixes. I THINK
it included a fix for this, but I don’t know. (I just fixed another timer
problem that somebody flagged with alarm() call, and I’m currently running
it on my system as an initial test. But, I don’t currently know the status
of this particular problem.)

-David

QNX Training Services
dagibbs@qnx.com


Randy Martin randy@qnx.com
Manager of FAE Group, North America
QNX Software Systems www.qnx.com
175 Terence Matthews Crescent, Kanata, Ontario, Canada K2M 1W8
Tel: 613-591-0931 Fax: 613-591-3579