portSAVE_CONTEXT macro
/* Save the remaining registers. */
pushm_x #12, r15 ; Pushes registers r4 through r15 onto the stack
mov.w &usCriticalNesting, r14 ; Need to save the task specific critical nesting counter
push_x r14
mov_x &pxCurrentTCB, r12 ; copy pointer to TCB structure into r12
mov_x sp, 0( r12 ) ; pxTopOfStack is the first field in the TCB structure, so this copies the stack pointer into pxTopOfStack by dereferencing r12
endm
What is the reason for having a separate global variable usCriticalNesting and having to save/restore it every time a context switch occurs? Why not have usCriticalNesting be part of the TCB_t structure, which would make context switching easier?
Why is usCriticalNesting not part of TCB_t?
While inspecting the context switch mechanism for msp430, I realized that in addition to all registers being pushed onto the stack, the critical nesting counter also has to be saved.
Why is usCriticalNesting not part of TCB_t?
The TCB is common to all FreeRTOS ports (of which there are many),
whereas the critical section handling is different on each port, and
often optimised in a way it couldn’t be if the count was in the TCB
(because the count would have to be retrieved from the TCB when the task
was restored).
Some ports define portCRITICALNESTINGIN_TCB to 1, in which case the
nesting count IS in the TCB – but the MSP430 port is very old and
pre-dates that feature.
Why is usCriticalNesting not part of TCB_t?
Thanks for the quick response. If I update the msp430 port to support portCRITICALNESTINGIN_TCB, where would I submit a patch?
Why is usCriticalNesting not part of TCB_t?
This used to be done via the FreeRTOS Interactive site, but
unfortunately the forum hosts no longer allow attachments to the posts.