30.12.2013 Views

T-Kernel Specification (1.B0.02)

T-Kernel Specification (1.B0.02)

T-Kernel Specification (1.B0.02)

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

136 CHAPTER 4. T-KERNEL/OS FUNCTIONS<br />

[Additional Notes]<br />

The ability to queue tasks accepting rendezvous is useful when multiple servers perform the same<br />

processing concurrently. This capability also takes advantage of the task-independent nature of ports.<br />

If a task accepting a rendezvous terminates abnormally for some reason before completing its rendezvous<br />

(before issuing tk rpl rdv), the task calling for the rendezvous by issuing tk cal por will continue<br />

waiting indefinitely for rendezvous completion without being released. To avoid such a situation, tasks<br />

accepting rendezvous should execute a tk rpl rdv or tk rel wai call when they terminate abnormally,<br />

as well as notifying the task calling for the rendezvous that the rendezvous ended in error.<br />

rdvno contains information designating the calling task in the rendezvous, but unique numbers should<br />

be assigned to the extent possible. Even if different rendezvous are conducted between the same tasks,<br />

a different rdvno value should be assigned to the first and second rendezvous to avoid problems like the<br />

following.<br />

• Rather than entry A, entry B, and entry C each corresponding to one rendezvous port, the entire select<br />

statement corresponds to one rendezvous port.<br />

• entry A, entry B, and entry C correspond to calptn and acpptn bits 2^0, 2^1, and 2^2.<br />

• A select statement in a typical ADA program looks like the following.<br />

ptn := 0;<br />

if condition_A then ptn := ptn + 2^0 endif;<br />

if condition_B then ptn := ptn + 2^1 endif;<br />

if condition_C then ptn := ptn + 2^2 endif;<br />

tk_acp_por(acpptn := ptn);<br />

• If the program contains in addition to the select statement a simple entry A accept with no select,<br />

tk_acp_por(acpptn := 2^0);<br />

can be executed. If it is desired to have entry A, entry B, and entry C wait unconditionally by OR logic,<br />

tk_acp_por(acpptn := 2^2+2^1+2^0);<br />

can be executed.<br />

• If the call on the rendezvous calling side is for entry A,<br />

tk_cal_por(calptn := 2^0);<br />

can be executed; and if the call is for entry C,<br />

tk_cal_por(calptn := 2^2);<br />

can be executed.<br />

Figure 4.7: Using Rendezvous to Implement ADA select Function<br />

If a task that called tk cal por and is waiting for rendezvous completion has its WAIT state released<br />

by tk rel wai or by tk ter tsk + tk sta tsk or the like, conceivably it may execute tk cal por a<br />

second time, resulting in establishment of a rendezvous. If the same rdvno value is assigned to the first<br />

rendezvous and the subsequent one, then if tk rpl rdv is executed for the first rendezvous it will end up<br />

terminating the second one. By assigning rdvno numbers uniquely and having the task in WAIT state<br />

for rendezvous completion remember the number of the expected rdvno, it will be possible to detect the<br />

error when tk rpl rdv is called for the first rendezvous.<br />

One possible method of assigning rdvno numbers is to put the ID number of the task calling the<br />

rendezvous in the low bits of rdvno, using the high bits for a sequential number.<br />

Copyright c○ 2002, 2003 by T-Engine Forum<br />

T-<strong>Kernel</strong> <strong>1.B0.02</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!