Symbian3/PDK/Source/GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita
changeset 14 578be2adaf3e
parent 12 80ef3a206772
equal deleted inserted replaced
13:48780e181b38 14:578be2adaf3e
     7     Nokia Corporation - initial contribution.
     7     Nokia Corporation - initial contribution.
     8 Contributors: 
     8 Contributors: 
     9 -->
     9 -->
    10 <!DOCTYPE concept
    10 <!DOCTYPE concept
    11   PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
    11   PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
    12 <concept id="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC" xml:lang="en"><title>Interrupt
    12 <concept id="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC" xml:lang="en"><title>Interrupt Dispatcher</title><shortdesc>The ASSP/Variant part of the base port must implement an
    13 Dispatcher</title><shortdesc>An interrupt is a condition that causes the CPU to suspend normal
    13 interrupt dispatcher to manage interrupts. </shortdesc><prolog><metadata><keywords/></metadata></prolog><conbody>
    14 execution, enter interrupt handling state and jump to a section of code called
    14 <p>An interrupt source is a hardware device or software action that
    15 an interrupt handler. The ASSP/variant part of the base port must implement
    15 can force the CPU to suspend normal execution, enter interrupt handling
    16 an interrupt dispatcher to manage interrupts. </shortdesc><prolog><metadata><keywords/></metadata></prolog><conbody>
    16 state and jump to a section of code called an interrupt handler. </p>
    17 <p>An interrupt source is a hardware device or software action that can force
       
    18 the CPU to enter interrupt handling state. </p>
       
    19 <p>Typically, a number of interrupt sources are monitored by an interrupt
    17 <p>Typically, a number of interrupt sources are monitored by an interrupt
    20 controller. This is hardware that generates a single interrupt notification
    18 controller. This is hardware that generates a single interrupt notification
    21 to the CPU, and provides information about which interrupts are pending, i.e.
    19 to the CPU, and provides information about which interrupts are pending,
    22 which interrupts require action to be taken. </p>
    20 i.e. which interrupts require action to be taken. </p>
    23 <section id="GUID-1FAA26F5-BFB2-55A0-977C-1538EBF3C82A"><title>ISR</title> <p>An
    21 <section id="GUID-1FAA26F5-BFB2-55A0-977C-1538EBF3C82A"><title>ISR</title> <p>An interrupt service routine, or ISR, is code that deals with
    24 interrupt service routine, or ISR, is code that deals with a pending interrupt.
    22 a pending interrupt. The Symbian platform kernel responds to an interrupt
    25 The Symbian platform kernel responds to an interrupt notification by calling
    23 notification by calling an ISR for each pending interrupt. The process
    26 an ISR for each pending interrupt. The process of calling ISRs is called interrupt
    24 of calling ISRs is called interrupt dispatch. </p> <p>The ISR is a
    27 dispatch. </p> <p>The ISR is a single bare function. It is not a class member. </p> <p>Each
    25 single bare function. It is not a class member. </p> <p>Each ISR takes
    28 ISR takes a single 32-bit parameter that is, typically, a pointer to an owning
    26 a single 32-bit parameter that is, typically, a pointer to an owning
    29 class, although it can be any value that is appropriate. The parameter is
    27 class, although it can be any value that is appropriate. The parameter
    30 defined as a <xref href="GUID-6D079976-9119-31FA-8E21-C3B815F94648.dita"><apiname>TAny</apiname></xref> * type, so a cast is almost always necessary. </p> <p>ISRs
    28 is defined as a <xref href="GUID-6D079976-9119-31FA-8E21-C3B815F94648.dita"><apiname>TAny</apiname></xref> * type, so a cast is almost
    31 are usually kept in an ISR table. </p> </section>
    29 always necessary. </p> <p>ISRs are usually kept in an ISR table. </p> </section>
    32 <section id="GUID-8E58F4C9-0290-55E0-A4FD-B6C2361BE205"><title>Interrupt ID</title> <p>An
    30 <section id="GUID-8E58F4C9-0290-55E0-A4FD-B6C2361BE205"><title>Interrupt
    33 interrupt source is identified by number, defined as a <xref href="GUID-7A2A43EC-6125-3BFE-834B-23C37F7B40D5.dita"><apiname>TInt</apiname></xref> type.
    31 ID</title> <p>An interrupt source is identified by number, defined
    34 Typically, the ASSP layer defines this number for each interrupt in a header
    32 as a <xref href="GUID-7A2A43EC-6125-3BFE-834B-23C37F7B40D5.dita"><apiname>TInt</apiname></xref> type. Typically, the ASSP layer defines
    35 file and exports it so that it can be included and used by device drivers. </p> <p>Where
    33 this number for each interrupt in a header file and exports it so
    36 the ASSP layer is split into a common layer and a variant (device specific)
    34 that it can be included and used by device drivers. </p> <p>Where
    37 layer, then the variant layer may also define its own set of interrupt IDs. </p> <p>This
    35 the ASSP layer is split into a common layer and a variant (device
    38 number is usually referred to as the interrupt ID. </p> </section>
    36 specific) layer, then the variant layer may also define its own set
    39 <section id="GUID-A8C9C079-D043-5A5F-9F08-CD8656F6702A"><title>Binding and
    37 of interrupt IDs. </p> <p>This number is usually referred to as the
    40 unbinding</title> <p>Only one ISR can be associated with each possible interrupt
    38 interrupt ID. </p> </section>
    41 source. Making this association is known as binding. ISRs can be bound and
    39 <section id="GUID-A8C9C079-D043-5A5F-9F08-CD8656F6702A"><title>Binding
    42 unbound during normal operation, but only one ISR can be bound to an interrupt
    40 and unbinding</title> <p>Only one ISR can be associated with each
    43 source at any one time. </p> <p>A device driver binds an ISR by calling <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-4E3CB472-3525-32F8-9BC4-8ECFEE931E7B"><apiname>Interrupt::Bind()</apiname></xref>,
    41 possible interrupt source. Making this association is known as binding.
    44 passing the interrupt source ID; similarly, the device driver can unbind the
    42 ISRs can be bound and unbound during normal operation, but only one
    45 ISR by calling <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-CCC9A397-608C-3EAF-830F-A59800C2E8E5"><apiname>Interrupt::Unbind()</apiname></xref>, also passing the <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-8E58F4C9-0290-55E0-A4FD-B6C2361BE205">interrupt
    43 ISR can be bound to an interrupt source at any one time. </p> <p>A
    46 ID</xref>. </p> </section>
    44 device driver binds an ISR by calling <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-4E3CB472-3525-32F8-9BC4-8ECFEE931E7B"><apiname>Interrupt::Bind()</apiname></xref>, passing the interrupt source ID; similarly, the device driver can
       
    45 unbind the ISR by calling <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-CCC9A397-608C-3EAF-830F-A59800C2E8E5"><apiname>Interrupt::Unbind()</apiname></xref>,
       
    46 also passing the <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-8E58F4C9-0290-55E0-A4FD-B6C2361BE205">interrupt ID</xref>. </p> </section>
    47 <section id="GUID-DDA62ABB-9CC6-44DC-B08D-FEE5AC505858"><title>Dispatching
    47 <section id="GUID-DDA62ABB-9CC6-44DC-B08D-FEE5AC505858"><title>Dispatching
    48 interrupts</title> <p>At its simplest, this is the process of deciding which
    48 interrupts</title> <p>At its simplest, this is the process of deciding
    49 interrupts are pending and calling the ISR for each. </p> <p>The following
    49 which interrupts are pending and calling the ISR for each. </p> <p>The following pseudo code shows the general principle: </p> <codeblock id="GUID-9C971C66-BB26-5A07-9373-3542B95A16FD" xml:space="preserve">
    50 pseudo code shows the general principle: </p> <codeblock id="GUID-9C971C66-BB26-5A07-9373-3542B95A16FD" xml:space="preserve">
       
    51     {
    50     {
    52        FOREVER
    51        FOREVER
    53               {
    52               {
    54         Get next pending interrupt;
    53         Get next pending interrupt;
    55         if None
    54         if None
    57                return;
    56                return;
    58             }
    57             }
    59         call ISR for the pending interrupt;
    58         call ISR for the pending interrupt;
    60         }
    59         }
    61     }
    60     }
    62 </codeblock> <p>In practice the dispatcher may have to do some more work to
    61 </codeblock> <p>In practice the dispatcher may have to do some more
    63 communicate with the interrupt controller hardware. </p> </section>
    62 work to communicate with the interrupt controller hardware. </p> </section>
    64 <section id="GUID-9026A4AC-57AF-545D-887C-AF43E0B37EDC"><title>Chained interrupts</title> <p>A
    63 <section id="GUID-9026A4AC-57AF-545D-887C-AF43E0B37EDC"><title>Chained
    65 system may have multiple interrupt controllers to handle a large number of
    64 interrupts</title> <p>A system may have multiple interrupt controllers
    66 interrupt sources. These are usually prioritised by connecting the interrupt
    65 to handle a large number of interrupt sources. These are usually prioritised
    67 output of a lower-priority controller to an interrupt input of a higher-priority
    66 by connecting the interrupt output of a lower-priority controller
    68 controller. This is called chaining. </p> <fig id="GUID-49264B94-DF6D-5F11-8815-D42CDBF94E39">
    67 to an interrupt input of a higher-priority controller. This is called
    69 <image href="GUID-0DB79535-E4E6-50BD-852D-B2F177202C9C_d0e381454_href.png" placement="inline"/>
    68 chaining. </p> <fig id="GUID-49264B94-DF6D-5F11-8815-D42CDBF94E39">
    70 </fig> <p>An interrupt from a lower priority controller will appear as an
    69 <title>Chained interrupts</title>
    71 interrupt on the highest-priority controller. </p> <p>When the interrupt dispatcher
    70 <image href="GUID-0DB79535-E4E6-50BD-852D-B2F177202C9C_d0e379292_href.png" placement="inline"/>
    72 of the higher-priority controller detects that it is the chained interrupt
    71 </fig> <p>An interrupt from a lower priority controller will appear
    73 that is pending, the usual way of dealing with this is to run a secondary
    72 as an interrupt on the highest-priority controller. </p> <p>When the
    74 dispatcher to determine which interrupt on the chained controller is pending. </p> <p>There
    73 interrupt dispatcher of the higher-priority controller detects that
    75 may be further levels of chaining before the true source of the interrupt
    74 it is the chained interrupt that is pending, the usual way of dealing
    76 has been identified. </p> </section>
    75 with this is to run a secondary dispatcher to determine which interrupt
    77 <section id="GUID-ED6F2F47-7A16-5AE6-8E5B-B2475F6EDEAA"><title>Multiple interrupt
    76 on the chained controller is pending. </p> <p>There may be further
    78 sources and pseudo interrupt sources</title> <p>It is possible that a single
    77 levels of chaining before the true source of the interrupt has been
    79 input to an interrupt controller is shared by several interrupt sources. </p> <fig id="GUID-DC96E3A8-9820-5CD4-8020-3B55398388D9">
    78 identified. </p> </section>
    80 <image href="GUID-DCBBDFA7-1E6C-5B00-A13E-A25794668E12_d0e381476_href.png" placement="inline"/>
    79 <section id="GUID-ED6F2F47-7A16-5AE6-8E5B-B2475F6EDEAA"><title>Multiple
       
    80 interrupt sources and pseudo interrupt sources</title> <p>It is possible
       
    81 that a single input to an interrupt controller is shared by several
       
    82 interrupt sources. </p> <fig id="GUID-DC96E3A8-9820-5CD4-8020-3B55398388D9">
       
    83 <title>Multiple interrupt sources</title>
       
    84 <image href="GUID-DCBBDFA7-1E6C-5B00-A13E-A25794668E12_d0e379317_href.png" placement="inline"/>
    81 </fig> <p>It appears necessary to bind multiple ISRs to the same interrupt.
    85 </fig> <p>It appears necessary to bind multiple ISRs to the same interrupt.
    82 However, this is not possible. There are two ways of dealing with this: </p> <ul>
    86 However, this is not possible. There are two ways of dealing with
    83 <li id="GUID-0D954444-C2C3-51CC-8E1D-7EB063CDACAA"><p>Maintain a list of all
    87 this: </p> <ul>
    84 ISRs that are bound to this single interrupt source, and call all the ISRs
    88 <li id="GUID-0D954444-C2C3-51CC-8E1D-7EB063CDACAA"><p>Maintain a list
    85 in the list when the interrupt is dispatched. This is most conveniently implemented
    89 of all ISRs that are bound to this single interrupt source, and call
    86 by binding a single ISR to the interrupt, which then calls all the real ISRs
    90 all the ISRs in the list when the interrupt is dispatched. This is
    87 bound to this interrupt </p> </li>
    91 most conveniently implemented by binding a single ISR to the interrupt,
    88 <li id="GUID-C5EFE907-26A5-568D-8CF0-DE5E89ED5CBB"><p>Create pseudo interrupts.
    92 which then calls all the real ISRs bound to this interrupt </p> </li>
    89 These are extra interrupt IDs that do not exist in the interrupt controller,
    93 <li id="GUID-C5EFE907-26A5-568D-8CF0-DE5E89ED5CBB"><p>Create pseudo
    90 but represent each of the interrupt sources connected to the single shared
    94 interrupts. These are extra interrupt IDs that do not exist in the
    91 interrupt source. An ISR can then be bound to each pseudo interrupt. The interrupt
    95 interrupt controller, but represent each of the interrupt sources
    92 dispatcher can then determine which of the sources are actually signalling
    96 connected to the single shared interrupt source. An ISR can then be
    93 and call the appropriate ISR via that pseudo interrupt ID. This is effectively
    97 bound to each pseudo interrupt. The interrupt dispatcher can then
    94 an implementation of a <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-9026A4AC-57AF-545D-887C-AF43E0B37EDC">chained
    98 determine which of the sources are actually signalling and call the
    95 interrupt</xref>, and assumes that the interrupt dispatcher can identify which
    99 appropriate ISR via that pseudo interrupt ID. This is effectively
    96 of the sources is signalling. </p> </li>
   100 an implementation of a <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-9026A4AC-57AF-545D-887C-AF43E0B37EDC">chained interrupt</xref>, and assumes that the interrupt dispatcher
       
   101 can identify which of the sources is signalling. </p> </li>
    97 </ul> </section>
   102 </ul> </section>
    98 <section id="GUID-A87DE0F9-2095-5CA6-BE88-3A2EAABB0D33"><title>Interrupts
   103 <section id="GUID-A87DE0F9-2095-5CA6-BE88-3A2EAABB0D33"><title>Interrupts
    99 in the split ASSP/Variant Configuration</title> <p>When a common ASSP extension
   104 in the split ASSP/Variant Configuration</title> <p>When a common ASSP
   100 is used, a device may have additional peripherals external to the ASSP, and
   105 extension is used, a device may have additional peripherals external
   101 there needs to be a way of allowing extra interrupt binding and dispatch functions
   106 to the ASSP, and there needs to be a way of allowing extra interrupt
   102 to be added later by the variant layer. This must be handled by the port as
   107 binding and dispatch functions to be added later by the variant layer.
   103 Symbian platform does not provide any additional API to support this. </p> <p>Device
   108 This must be handled by the port as Symbian platform does not provide
   104 drivers should be able to use the <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita"><apiname>Interrupt</apiname></xref> class functions
   109 any additional API to support this. </p> <p>Device drivers should
   105 without having to know where the interrupt is actually implemented. This implies
   110 be able to use the <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita"><apiname>Interrupt</apiname></xref> class functions without
   106 that all requests should go to the core implementation of functions like <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-4E3CB472-3525-32F8-9BC4-8ECFEE931E7B"><apiname>Interrupt::Bind()</apiname></xref>, <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-BB169E6E-D8F9-3762-899D-6DBA4B29CF87"><apiname>Interrupt::Enable()</apiname></xref> etc. </p> <p>To enable the core implementation of these functions to decide
   111 having to know where the interrupt is actually implemented. This implies
   107 whether an interrupt ID refers to a core interrupt or device specific interrupt,
   112 that all requests should go to the core implementation of functions
   108 a common technique is to "tag" the interrupt ID. A simple way is to use positive
   113 like <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-4E3CB472-3525-32F8-9BC4-8ECFEE931E7B"><apiname>Interrupt::Bind()</apiname></xref>, <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-BB169E6E-D8F9-3762-899D-6DBA4B29CF87"><apiname>Interrupt::Enable()</apiname></xref> etc. </p> <p>To enable the core implementation of these functions
   109 numbers to identify core interrupts and negative numbers to identify device
   114 to decide whether an interrupt ID refers to a core interrupt or device
   110 specific interrupts. The ISRs for device specific interrupts are not stored
   115 specific interrupt, a common technique is to "tag" the interrupt ID.
   111 in the core ISR table, instead the device specific layer provides its own
   116 A simple way is to use positive numbers to identify core interrupts
   112 ISR table. </p> <p>The general pattern for creating the core-device specific
   117 and negative numbers to identify device specific interrupts. The ISRs
   113 split is that the core derives an implementation from class <xref href="GUID-A83A7C3C-7DC0-3B9C-842F-70FCC751365D.dita"><apiname>Asic</apiname></xref>,
   118 for device specific interrupts are not stored in the core ISR table,
   114 and the device specific part further derives from this core implementation.
   119 instead the device specific layer provides its own ISR table. </p> <p>The general pattern for creating the core-device specific split
   115 The usual technique is to add a set of virtual functions to the core class
   120 is that the core derives an implementation from class <xref href="GUID-A83A7C3C-7DC0-3B9C-842F-70FCC751365D.dita"><apiname>Asic</apiname></xref>, and the device specific part further derives from this core implementation.
   116 that can be derived by the device specific part. The core can provide default
   121 The usual technique is to add a set of virtual functions to the core
   117 implementations for these functions that would just return <xref href="GUID-0BEA3647-7888-3612-A2D3-7E27AC405E29.dita"><apiname>KErrArgument</apiname></xref> to
   122 class that can be derived by the device specific part. The core can
   118 trap illegal ID numbers. This API would need functions equivalent to each
   123 provide default implementations for these functions that would just
   119 of the functions defined by the <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita"><apiname>Interrupt</apiname></xref> class. </p> <p>As
   124 return <xref href="GUID-0BEA3647-7888-3612-A2D3-7E27AC405E29.dita"><apiname>KErrArgument</apiname></xref> to trap illegal ID numbers.
   120 an example, the core layer for the template reference board defines a class <codeph>TemplateAssp</codeph> that
   125 This API would need functions equivalent to each of the functions
   121 is derived from <xref href="GUID-A83A7C3C-7DC0-3B9C-842F-70FCC751365D.dita"><apiname>Asic</apiname></xref>. <codeph>TemplateAssp</codeph> defines
   126 defined by the <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita"><apiname>Interrupt</apiname></xref> class. </p> <p>As an example,
   122 the pure virtual functions: <codeph>InterruptBind()</codeph>, <codeph>InterruptUnbind()</codeph>, <codeph>InterruptEnable()</codeph> etc,
   127 the core layer for the template reference board defines a class <codeph>TemplateAssp</codeph> that is derived from <xref href="GUID-A83A7C3C-7DC0-3B9C-842F-70FCC751365D.dita"><apiname>Asic</apiname></xref>. <codeph>TemplateAssp</codeph> defines the pure virtual functions: <codeph>InterruptBind()</codeph>, <codeph>InterruptUnbind()</codeph>, <codeph>InterruptEnable()</codeph> etc, all with signatures that are the
   123 all with signatures that are the same for the comparable functions defined
   128 same for the comparable functions defined by <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita"><apiname>Interrupt</apiname></xref>, and which are implemented by the <codeph>Template</codeph> class. </p> <fig id="GUID-458C7825-5B35-583C-BDF6-7DCD21DAE670">
   124 by <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita"><apiname>Interrupt</apiname></xref>, and which are implemented by the <codeph>Template</codeph> class. </p> <fig id="GUID-458C7825-5B35-583C-BDF6-7DCD21DAE670">
   129 <title>Interrupt binding</title>
   125 <image href="GUID-B7E7E6D6-7824-505C-BA0B-B7861897E78F_d0e381570_href.png" placement="inline"/>
   130 <image href="GUID-B7E7E6D6-7824-505C-BA0B-B7861897E78F_d0e379414_href.png" placement="inline"/>
   126 </fig> </section>
   131 </fig> </section>
   127 <section id="GUID-9D98586F-AD1D-5C50-9AD8-F81D72135382"><title>Spurious interrupts</title> <p>In
   132 <section id="GUID-9D98586F-AD1D-5C50-9AD8-F81D72135382"><title>Spurious
   128 the Kernel Architecture 2, it is a convention that unbound interrupts should
   133 interrupts</title> <p>In the Kernel Architecture 2, it is a convention
   129 be bound to a "spurious" interrupt handler, i.e. an interrupt handler that
   134 that unbound interrupts should be bound to a "spurious" interrupt
   130 faults the system indicating the number of the interrupt. This aids debugging
   135 handler, i.e. an interrupt handler that faults the system indicating
   131 by identifying interrupts that are enabled without corresponding ISRs. </p> </section>
   136 the number of the interrupt. This aids debugging by identifying interrupts
   132 <section id="GUID-109C6250-DC5B-48EC-B1A0-24E2E9731B38"><title>Interrupt priority</title> <p>The
   137 that are enabled without corresponding ISRs. </p> </section>
   133 interrupt architecture supports the concept of adjustable interrupt priorities.
   138 <section id="GUID-109C6250-DC5B-48EC-B1A0-24E2E9731B38"><title>Interrupt
   134 Symbian platform defines the <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-FA4CFED7-D694-399C-8F84-FA9FE3C3A171"><apiname>Interrupt::SetPriority()</apiname></xref> function
   139 priority</title> <p>The interrupt architecture supports the concept
   135 that can implement this. The function is passed the ID of the interrupt source
   140 of adjustable interrupt priorities. Symbian platform defines the <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita#GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3/GUID-FA4CFED7-D694-399C-8F84-FA9FE3C3A171"><apiname>Interrupt::SetPriority()</apiname></xref> function that can implement this.
   136 to be adjusted together with a priority value. The meaning of the priority
   141 The function is passed the ID of the interrupt source to be adjusted
   137 value is hardware and implementation dependent, and is defined by the port. </p> </section>
   142 together with a priority value. The meaning of the priority value
   138 <section id="GUID-77E83634-BBF6-5190-9434-9FB700547CD0"><title>The ISR table</title> <p>The
   143 is hardware and implementation dependent, and is defined by the port. </p> </section>
   139 Variant must provide a table where each entry defines which <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-1FAA26F5-BFB2-55A0-977C-1538EBF3C82A">ISR</xref> is bound to which interrupt source. The table must have enough
   144 <section id="GUID-77E83634-BBF6-5190-9434-9FB700547CD0"><title>The
   140 space for entries for each interrupt source that is known to the Variant. </p> <p>When
   145 ISR table</title> <p>The Variant must provide a table where each entry
   141 the Variant is split into an ASSP layer and a Variant layer, the ISR table
   146 defines which <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-1FAA26F5-BFB2-55A0-977C-1538EBF3C82A">ISR</xref> is bound to which interrupt source. The table must have
   142 is put in the ASSP layer and will not normally include ISRs for the Variant
   147 enough space for entries for each interrupt source that is known to
   143 interrupt sources - these will be handled by separate chained dispatchers
   148 the Variant. </p> <p>When the Variant is split into an ASSP layer
   144 in the Variant layer. </p> <p>Symbian platform provides the <xref href="GUID-2C9B6510-D045-3FA1-AD65-B544E30D34C7.dita"><apiname>SInterruptHandler</apiname></xref> structure,
   149 and a Variant layer, the ISR table is put in the ASSP layer and will
   145 defined in the header file <filepath>...\e32\include\kernel\arm\assp.h</filepath> to
   150 not normally include ISRs for the Variant interrupt sources - these
   146 encapsulate the entry for an ISR. The ISR table is, therefore, just an array
   151 will be handled by separate chained dispatchers in the Variant layer. </p> <p>Symbian platform provides the <xref href="GUID-2C9B6510-D045-3FA1-AD65-B544E30D34C7.dita"><apiname>SInterruptHandler</apiname></xref> structure, defined in the header file <filepath>...\e32\include\kernel\arm\assp.h</filepath> to encapsulate the entry for an ISR. The ISR table is, therefore,
   147 of <xref href="GUID-2C9B6510-D045-3FA1-AD65-B544E30D34C7.dita"><apiname>SInterruptHandler</apiname></xref> items. For example, if a system has
   152 just an array of <xref href="GUID-2C9B6510-D045-3FA1-AD65-B544E30D34C7.dita"><apiname>SInterruptHandler</apiname></xref> items. For example,
   148 32 possible interrupt sources, then the ISR table would be defined as: </p> <codeblock id="GUID-6C95C2EF-A882-565A-8718-07BF7E4A7AC5" xml:space="preserve">...
   153 if a system has 32 possible interrupt sources, then the ISR table
       
   154 would be defined as: </p> <codeblock id="GUID-6C95C2EF-A882-565A-8718-07BF7E4A7AC5" xml:space="preserve">...
   149 const TInt KInterruptSourceCount = 32;
   155 const TInt KInterruptSourceCount = 32;
   150 SInterruptHandler IsrHandlers[KInterruptSourceCount];
   156 SInterruptHandler IsrHandlers[KInterruptSourceCount];
   151 ...</codeblock> <p>Interrupts are identified in the system by their interrupt
   157 ...</codeblock> <p>Interrupts are identified in the system by their
   152 ID number, which is used to index into the ISR table. You are free to allocate
   158 interrupt ID number, which is used to index into the ISR table. You
   153 these numbers any way that is convenient for you. </p> <p>On the template
   159 are free to allocate these numbers any way that is convenient for
   154 reference board, for example, the ISR table is defined as a static data member
   160 you. </p> <p>On the template reference board, for example, the ISR
   155 of the <codeph>VariantASSPInterrupt</codeph> class, which is derived from <xref href="GUID-5E593C59-BA22-3B70-AAFB-BFE19E22538A.dita"><apiname>TemplateInterrupt</apiname></xref>.
   161 table is defined as a static data member of the <codeph>VariantASSPInterrupt</codeph> class, which is derived from <xref href="GUID-5E593C59-BA22-3B70-AAFB-BFE19E22538A.dita"><apiname>TemplateInterrupt</apiname></xref>. The class is defined in <filepath>...\template_assp\template_assp_priv.h</filepath>. </p> <codeblock id="GUID-59D7A629-353C-5117-84B7-15CD425481C6" xml:space="preserve">class TemplateInterrupt : public Interrupt
   156 The class is defined in <filepath>...\template_assp\template_assp_priv.h</filepath>. </p> <codeblock id="GUID-59D7A629-353C-5117-84B7-15CD425481C6" xml:space="preserve">class TemplateInterrupt : public Interrupt
       
   157     {
   162     {
   158     ... // functions
   163     ... // functions
   159 public:
   164 public:
   160     static SInterruptHandler Handlers[KNumTemplateInts];
   165     static SInterruptHandler Handlers[KNumTemplateInts];
   161     ...
   166     ...
   162     };</codeblock> <p>where KNumTemplateInts is defined in the same header
   167     };</codeblock> <p>where KNumTemplateInts is defined in the same
   163 file. </p> <p><b>Factors
   168 header file. </p> <p><b>Factors that decide the size of the ISR table</b> </p> <p>The number of entries to be reserved in the ISR table depends
   164 that decide the size of the ISR table</b> </p> <p>The number of entries to
   169 on the following factors: </p> <ul>
   165 be reserved in the ISR table depends on the following factors: </p> <ul>
   170 <li id="GUID-05AE4B19-AA29-56E4-842A-CC65546EFB54"><p>Where the ASSP
   166 <li id="GUID-05AE4B19-AA29-56E4-842A-CC65546EFB54"><p>Where the ASSP is targeted
   171 is targeted at only a single device, the number of possible interrupts
   167 at only a single device, the number of possible interrupts is usually known,
   172 is usually known, and the table can include an entry for each one. </p> </li>
   168 and the table can include an entry for each one. </p> </li>
   173 <li id="GUID-C62B31BD-FAD7-5A76-9E43-2387FD8AFCC8"><p>If any <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-ED6F2F47-7A16-5AE6-8E5B-B2475F6EDEAA">pseudo sources</xref> exist, they should be included in the main
   169 <li id="GUID-C62B31BD-FAD7-5A76-9E43-2387FD8AFCC8"><p>If any <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-ED6F2F47-7A16-5AE6-8E5B-B2475F6EDEAA">pseudo sources</xref> exist, they should be included in the main table for
   174 table for efficiency, but note that this is not strictly necessary. </p> </li>
   170 efficiency, but note that this is not strictly necessary. </p> </li>
   175 </ul> <p><b>Other factors affecting the ISR table</b> </p> <p>IRQs
   171 </ul> <p><b>Other
   176 and FIQs may need to be distinguished, although the exact requirement
   172 factors affecting the ISR table</b> </p> <p>IRQs and FIQs may need to be distinguished,
   177 is hardware dependent. Although the table has one entry for each possible
   173 although the exact requirement is hardware dependent. Although the table has
   178 interrupt source, a possible scheme may be to group IRQs at the start
   174 one entry for each possible interrupt source, a possible scheme may be to
   179 of the table, and FIQs at the end of the table. If the hardware has
   175 group IRQs at the start of the table, and FIQs at the end of the table. If
   180 separate interrupt controller hardware for IRQs and FIQs (or at least,
   176 the hardware has separate interrupt controller hardware for IRQs and FIQs
   181 different registers) then you will need to arrange the table so that
   177 (or at least, different registers) then you will need to arrange the table
   182 you can determine from the <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-8E58F4C9-0290-55E0-A4FD-B6C2361BE205">interrupt ID</xref> whether the interrupt is an IRQ or FIQ. </p> <p>For example: </p> <fig id="GUID-9DD2CC92-A5DB-5C78-A9A6-64402FF04FE2">
   178 so that you can determine from the <xref href="GUID-76A30EC4-4B99-5471-9E80-F853C91485BC.dita#GUID-76A30EC4-4B99-5471-9E80-F853C91485BC/GUID-8E58F4C9-0290-55E0-A4FD-B6C2361BE205">interrupt
   183 <title>ISR table</title>
   179 ID</xref> whether the interrupt is an IRQ or FIQ. </p> <p>For example: </p> <fig id="GUID-9DD2CC92-A5DB-5C78-A9A6-64402FF04FE2">
   184 <image href="GUID-60949ACD-AAA9-540E-85AE-BB173382D548_d0e379533_href.png" placement="inline"/>
   180 <image href="GUID-60949ACD-AAA9-540E-85AE-BB173382D548_d0e381686_href.png" placement="inline"/>
       
   181 </fig> </section>
   185 </fig> </section>
   182 <section id="GUID-EACCBDFD-46CD-4D67-B60C-D705867C9116"><title>Location of
   186 <section id="GUID-EACCBDFD-46CD-4D67-B60C-D705867C9116"><title>Location
   183 interrupt handling code</title> <p>Most of the interrupt dispatching code
   187 of interrupt handling code</title> <p>Most of the interrupt dispatching
   184 is implemented in the ASSP layer. This includes a list of ISRs, code for adding
   188 code is implemented in the ASSP layer. This includes a list of ISRs,
   185 and removing ISRs, enabling and disabling interrupt sources, and dispatching
   189 code for adding and removing ISRs, enabling and disabling interrupt
   186 ISRs. The kernel only provides a pre-amble and post-amble. </p> <p>The kernel
   190 sources, and dispatching ISRs. The kernel only provides a pre-amble
   187 defines, but does not implement, a class called <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita"><apiname>Interrupt</apiname></xref> that
   191 and post-amble. </p> <p>The kernel defines, but does not implement,
   188 exports interrupt functionality to device drivers and other kernel code. The
   192 a class called <xref href="GUID-E7A7083C-97B9-39B9-A147-4A6E314EE3A3.dita"><apiname>Interrupt</apiname></xref> that exports interrupt
   189 class provides the public API for using interrupts (but not for dispatching
   193 functionality to device drivers and other kernel code. The class provides
   190 them). The port must provide an implementation for each function defined by
   194 the public API for using interrupts (but not for dispatching them).
   191 the class. </p> <p>The class is defined in the header files <filepath>...\e32\include\kernel\arm\assp.h</filepath>,
   195 The port must provide an implementation for each function defined
   192 which is exported to <filepath>...\epoc32\include\kernel\arm</filepath>. </p><p>See
   196 by the class. </p> <p>The class is defined in the header files <filepath>...\e32\include\kernel\arm\assp.h</filepath>, which is exported to <filepath>...\epoc32\include\kernel\arm</filepath>. </p><p>See <b>Symbian OS
   193 Symbian OS Internals Book, Chapter 6  - Interrupts and Exceptions</p> </section>
   197 Internals Book, Chapter 6  - Interrupts and Exceptions</b></p> </section>
   194 </conbody></concept>
   198 </conbody></concept>