NVIC advanced features in ARM Architecture - Time & Space Complexity
We want to understand how the time to handle interrupts grows when using NVIC's advanced features.
Specifically, how does the system's response time change as the number of interrupts or priorities increases?
Analyze the time complexity of the following NVIC interrupt handling code snippet.
// Example: Handling multiple interrupts with priority grouping
LDR R0, =NVIC_IPR_BASE ; Load base address of priority registers
MOV R1, #NUM_INTERRUPTS ; Number of interrupts
MOV R2, #0 ; Index
loop:
LDRB R3, [R0, R2, LSL #0] ; Load priority of interrupt R2
CMP R3, CURRENT_PRIORITY ; Compare with current priority
BHI skip ; If lower priority (higher value), skip
BL Handle_Interrupt ; Call interrupt handler
skip:
ADD R2, R2, #1 ; Next interrupt
CMP R2, R1
BLT loop
This code checks each interrupt's priority and handles it if it meets the priority condition.
Look for repeated actions in the code.
- Primary operation: Looping through all interrupts to check priorities.
- How many times: Once for each interrupt, so the number of interrupts (n).
As the number of interrupts increases, the code checks each one in turn.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 priority checks |
| 100 | About 100 priority checks |
| 1000 | About 1000 priority checks |
Pattern observation: The number of operations grows directly with the number of interrupts.
Time Complexity: O(n)
This means the time to handle interrupts grows linearly as the number of interrupts increases.
[X] Wrong: "Handling interrupts with NVIC advanced features is always constant time regardless of number of interrupts."
[OK] Correct: The code must check each interrupt's priority, so more interrupts mean more checks and longer handling time.
Understanding how interrupt handling time grows helps you design efficient embedded systems and shows you can reason about system performance.
What if the NVIC used a hardware priority encoder to select the highest priority interrupt instantly? How would the time complexity change?
Practice
Solution
Step 1: Understand NVIC priority grouping
Priority grouping allows dividing interrupt priority into pre-emption priority and subpriority.Step 2: Identify the purpose of balancing priorities
This balance controls which interrupts can pre-empt others and which are handled in order if priorities are equal.Final Answer:
To balance between pre-emption priority and subpriority levels -> Option BQuick Check:
Priority grouping = Balancing priorities [OK]
- Confusing priority grouping with disabling interrupts
- Thinking it changes processor speed
- Assuming it resets the device
Solution
Step 1: Identify function to enable interrupts
The function NVIC_EnableIRQ(IRQn) is used to enable a specific interrupt.Step 2: Differentiate from other NVIC functions
NVIC_DisableIRQ disables interrupts, SetPriority sets priority, ClearPendingIRQ clears pending flags.Final Answer:
NVIC_EnableIRQ(IRQn); -> Option CQuick Check:
Enable interrupt = NVIC_EnableIRQ [OK]
- Using NVIC_DisableIRQ to enable interrupts
- Confusing priority setting with enabling
- Clearing pending interrupts instead of enabling
NVIC_SetPriorityGrouping(3);
NVIC_SetPriority(IRQn, NVIC_EncodePriority(3, 1, 2));
What does this code do?
Solution
Step 1: Analyze NVIC_SetPriorityGrouping(3)
This sets the priority grouping to 3, defining how many bits are for pre-emption and subpriority.Step 2: Decode NVIC_SetPriority call
NVIC_EncodePriority(3, 1, 2) encodes pre-emption priority 1 and subpriority 2 according to grouping 3, then assigns it to IRQn.Final Answer:
Sets priority grouping to 3 and assigns pre-emption priority 1 and subpriority 2 to IRQn -> Option AQuick Check:
Priority grouping 3 + encoded priority = Sets priority grouping to 3 and assigns pre-emption priority 1 and subpriority 2 to IRQn [OK]
- Assuming it disables or enables interrupts
- Ignoring priority encoding details
- Confusing priority grouping with resetting
NVIC_EnableIRQ(IRQn);
What is the error?
Solution
Step 1: Understand function purpose
NVIC_EnableIRQ enables the interrupt, so using it to disable is incorrect.Step 2: Identify correct function to disable
NVIC_DisableIRQ should be used to disable interrupts, not NVIC_EnableIRQ.Final Answer:
The function NVIC_EnableIRQ enables, not disables, interrupts -> Option AQuick Check:
EnableIRQ enables, not disables [OK]
- Confusing enable and disable functions
- Assuming priority affects enabling/disabling
- Thinking order of calls disables interrupts
Solution
Step 1: Understand priority grouping effect
Setting priority grouping to allocate all bits to pre-emption priority means subpriority is zero, so pre-emption controls interrupt order fully.Step 2: Confirm this ensures critical interrupt pre-empts others
With no subpriority bits, the critical interrupt's pre-emption priority dominates, allowing it to always pre-empt.Final Answer:
Set priority grouping to allocate all bits to pre-emption priority and zero to subpriority -> Option DQuick Check:
All bits to pre-emption priority = critical pre-emption [OK]
- Thinking disabling subpriority means setting it high
- Assuming same priority levels allow pre-emption
- Disabling other interrupts is not practical
Ready to prove it?
Pass the test and this pattern moves unknown
