Skip to content

Commit

Permalink
Fix Interrupt depth comparison logic
Browse files Browse the repository at this point in the history
Fix parameter mismatch in portmacro.h file.
  • Loading branch information
TrongNguyenR committed Nov 4, 2024
1 parent 6fcec80 commit 2cbd857
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 11 deletions.
4 changes: 2 additions & 2 deletions portable/CCRH/F1Kx/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ The test project can be found [here](https://github.com/FreeRTOS/FreeRTOS-Commun
## Note
1. Configure IPIR Interrupt: Ensure that the bit specifying the destination for binding (requesting) an interrupt is enabled (e.g: IBDxxx register of F1KH-D8) (1)
2. `Channel 0` and address `0xFFFEEC00` are used as default configuration for configIPIR_CHANNEL and configEXCLUSIVE_ADDRESS, in case of resource confliction other channel/address can be used. (2)
3. The minimal stack size (configMINIMAL_STACK_SIZE) must be included the reserved memory for nested interrupt. This formula can be referred: `(task_context_size) * (1 + configMAX_INT_NESTING) + Stack_depth_of_taskcode`
In which, `task_context_size` is calculated as `36*4bytes = 144bytes` (when FPU enabled) or `34*4bytes = 136` (when FPU disabled), configMAX_INT_NESTING is 02 as default.
3. The minimal stack size (configMINIMAL_STACK_SIZE) must be included the reserved memory for nested interrupt. This formula can be referred: `(task_context_size) * (2 + configMAX_INT_NESTING) + Stack_depth_of_taskcode`
In which, `task_context_size` is calculated as `36*4bytes = 144bytes` (when FPU enabled) or `34*4bytes = 136` (when FPU disabled), configMAX_INT_NESTING is `02` as default (Note that a value of `0` is not allowed).
4. `configTIMER_PRESCALE`: This value is required in order to correctly configure clock for `CPUCLK_L`. Refer to Hardware Manual at `Table 44.22` for `option byte`: If the user sets the option byte `CKDIVMD to 1`, then `configTIMER_PRESCALE = 4`. Otherwise, if `CKDIVMD is set to 0`, then `configTIMER_PRESCALE = 2`.

(1) This is applicable for F1KH-D8 with SMP only.
Expand Down
4 changes: 2 additions & 2 deletions portable/CCRH/F1Kx/port.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@
#define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt()
#endif /* configSETUP_TICK_INTERRUPT */

#ifndef configMAX_INT_NESTING
#if ( !defined( configMAX_INT_NESTING ) || ( configMAX_INT_NESTING == 0 ) )

/* Set the default value for depth of nested interrupt. In theory, the
* microcontroller have mechanism to limit number of nested level of interrupt
Expand Down Expand Up @@ -225,7 +225,7 @@ volatile BaseType_t xPortScheduleStatus[ configNUMBER_OF_CORES ] = { 0 };
* It is necessary to control maximum stack depth.
*/
volatile UBaseType_t uxInterruptNesting[ configNUMBER_OF_CORES ] = { 0 };
volatile const UBaseType_t uxPortMaxInterruptDepth = configMAX_INT_NESTING - 1;
volatile const UBaseType_t uxPortMaxInterruptDepth = configMAX_INT_NESTING;

/* Count number of nested locks by same cores. The lock is completely released
* only if this count is decreased to 0, the lock is separated for task
Expand Down
7 changes: 4 additions & 3 deletions portable/CCRH/F1Kx/portasm.s
Original file line number Diff line number Diff line change
Expand Up @@ -269,9 +269,10 @@ _vIrq_Handler:

; Do not enable interrupt for nesting. Stackover flow may occurs if the
; depth of nesting interrupt is exceeded.
mov #_uxPortMaxInterruptDepth, r15
cmp r16, r15
be 4 ; Jump over ei instruction
mov #_uxPortMaxInterruptDepth, r19
ld.w 0[r19], r15
cmp r15, r16
bge 4 ; Jump over ei instruction
ei
jarl _vCommonISRHandler, lp
di
Expand Down
8 changes: 4 additions & 4 deletions portable/CCRH/F1Kx/portmacro.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,11 @@
/* Scheduler utilities */

/* Called at the end of an ISR that can cause a context switch */
extern void vPortSetSwitch( BaseType_t vPortSetSwitch );
extern void vPortSetSwitch( BaseType_t xSwitchRequired );

#define portEND_SWITCHING_ISR( xSwitchRequired ) vPortSetSwitch( vPortSetSwitch )
#define portEND_SWITCHING_ISR( x ) vPortSetSwitch( x )

#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )

/* Use to transfer control from one task to perform other tasks of
* higher priority */
Expand All @@ -131,7 +131,7 @@
#define coreid xPortGET_CORE_ID()

/* Request the core ID x to yield. */
extern void vPortYieldCore( unsigned int coreID );
extern void vPortYieldCore( uint32_t coreID );

#define portYIELD_CORE( x ) vPortYieldCore( x )

Expand Down

0 comments on commit 2cbd857

Please sign in to comment.