Merge branch 'bugfix/watchpoint_on_shared_stacl' into 'master'
shared_stack: fixed watchpoint placement on shared stack See merge request espressif/esp-idf!7522
This commit is contained in:
commit
f9bc4fc08b
4 changed files with 21 additions and 19 deletions
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/semphr.h"
|
#include "freertos/semphr.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
#include "esp_debug_helpers.h"
|
#include "esp_debug_helpers.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
@ -42,6 +43,10 @@ extern "C" {
|
||||||
expression; \
|
expression; \
|
||||||
} \
|
} \
|
||||||
esp_switch_stack_exit(&backup); \
|
esp_switch_stack_exit(&backup); \
|
||||||
|
StaticTask_t *current = (StaticTask_t *)xTaskGetCurrentTaskHandle(); \
|
||||||
|
/* pxDummy6 is the stack base of current thread defined in TCB_t */ \
|
||||||
|
/* place the watchpoint on current task stack after function execution*/ \
|
||||||
|
vPortSetStackWatchpoint(current->pxDummy6); \
|
||||||
xSemaphoreGive(lock); \
|
xSemaphoreGive(lock); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -386,6 +386,7 @@ extern void esp_vApplicationTickHook( void );
|
||||||
|
|
||||||
void _xt_coproc_release(volatile void * coproc_sa_base);
|
void _xt_coproc_release(volatile void * coproc_sa_base);
|
||||||
void vApplicationSleep( TickType_t xExpectedIdleTime );
|
void vApplicationSleep( TickType_t xExpectedIdleTime );
|
||||||
|
void vPortSetStackWatchpoint( void* pxStackStart );
|
||||||
|
|
||||||
#define portSUPPRESS_TICKS_AND_SLEEP( idleTime ) vApplicationSleep( idleTime )
|
#define portSUPPRESS_TICKS_AND_SLEEP( idleTime ) vApplicationSleep( idleTime )
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,8 @@
|
||||||
StackType_t * esp_switch_stack_setup(StackType_t *stack, size_t stack_size)
|
StackType_t * esp_switch_stack_setup(StackType_t *stack, size_t stack_size)
|
||||||
{
|
{
|
||||||
#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
|
#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
|
||||||
int watchpoint_place = (((int)stack + 31) & ~31);
|
esp_clear_watchpoint(1);
|
||||||
|
uint32_t watchpoint_place = ((uint32_t)stack + 32) & 0x1f ;
|
||||||
#endif
|
#endif
|
||||||
StackType_t *top_of_stack = (StackType_t *)&stack[0] +
|
StackType_t *top_of_stack = (StackType_t *)&stack[0] +
|
||||||
((stack_size * sizeof(StackType_t)) / sizeof(StackType_t));
|
((stack_size * sizeof(StackType_t)) / sizeof(StackType_t));
|
||||||
|
@ -35,7 +36,7 @@ StackType_t * esp_switch_stack_setup(StackType_t *stack, size_t stack_size)
|
||||||
frame->a1 = (UBaseType_t)top_of_stack;
|
frame->a1 = (UBaseType_t)top_of_stack;
|
||||||
|
|
||||||
#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
|
#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
|
||||||
esp_set_watchpoint(2, (char*)watchpoint_place, 32, ESP_WATCHPOINT_STORE);
|
esp_set_watchpoint(1, (uint8_t *)watchpoint_place, 32, ESP_WATCHPOINT_STORE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return top_of_stack;
|
return top_of_stack;
|
||||||
|
|
|
@ -26,14 +26,14 @@
|
||||||
esp_switch_stack_enter:
|
esp_switch_stack_enter:
|
||||||
|
|
||||||
#ifndef __XTENSA_CALL0_ABI__
|
#ifndef __XTENSA_CALL0_ABI__
|
||||||
entry sp, 0x10
|
entry sp, 0x10
|
||||||
mov a4, a1
|
mov a4, a1
|
||||||
s32i a4, a3, 0 /* on a3 there is a safe place to save the current stack */
|
s32i a4, a3, 0 /* on a3 there is a safe place to save the current stack */
|
||||||
l32i a4, a2, 0 /* obtains the user allocated stack buffer */
|
l32i a4, a2, 0 /* obtains the user allocated stack buffer */
|
||||||
mov a1, a4 /* sp register now contains caller specified stack */
|
mov a1, a4 /* sp register now contains caller specified stack */
|
||||||
retw
|
retw
|
||||||
#else
|
#else
|
||||||
#error "this code is written for Window ABI"
|
#error "this code is written for Window ABI"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,17 +45,12 @@ esp_switch_stack_enter:
|
||||||
esp_switch_stack_exit:
|
esp_switch_stack_exit:
|
||||||
|
|
||||||
#ifndef __XTENSA_CALL0_ABI__
|
#ifndef __XTENSA_CALL0_ABI__
|
||||||
entry sp, 0x10
|
entry sp, 0x10
|
||||||
|
|
||||||
#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
|
l32i a4, a2, 0 /* recover the original task stack */
|
||||||
movi a6, 2
|
mov a1, a4 /* put it on sp register again */
|
||||||
movi a4, esp_clear_watchpoint
|
retw
|
||||||
callx4 a4 /* clear the watchpoint before releasing stack */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
l32i a4, a2, 0 /* recover the original task stack */
|
|
||||||
mov a1, a4 /* put it on sp register again */
|
|
||||||
retw
|
|
||||||
#else
|
#else
|
||||||
#error "this code is written for Window ABI"
|
#error "this code is written for Window ABI"
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue