parent
461d833c1c
commit
0eb08509f0
@ -197,7 +197,11 @@ MP_DEFINE_CONST_FUN_OBJ_1(supervisor_runtime_get_next_stack_limit_obj, superviso
|
|||||||
STATIC mp_obj_t supervisor_runtime_set_next_stack_limit(mp_obj_t self, mp_obj_t size_obj) {
|
STATIC mp_obj_t supervisor_runtime_set_next_stack_limit(mp_obj_t self, mp_obj_t size_obj) {
|
||||||
mp_int_t size = mp_obj_get_int(size_obj);
|
mp_int_t size = mp_obj_get_int(size_obj);
|
||||||
mp_arg_validate_int_min(size, 256, MP_QSTR_size);
|
mp_arg_validate_int_min(size, 256, MP_QSTR_size);
|
||||||
set_next_stack_size(size);
|
if (!set_next_stack_size(size)) {
|
||||||
|
mp_raise_msg_varg(&mp_type_AttributeError,
|
||||||
|
MP_ERROR_TEXT("can't set attribute '%q'"),
|
||||||
|
MP_QSTR_next_stack_limit);
|
||||||
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
MP_DEFINE_CONST_FUN_OBJ_2(supervisor_runtime_set_next_stack_limit_obj, supervisor_runtime_set_next_stack_limit);
|
MP_DEFINE_CONST_FUN_OBJ_2(supervisor_runtime_set_next_stack_limit_obj, supervisor_runtime_set_next_stack_limit);
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
extern uint32_t _estack;
|
extern uint32_t _estack;
|
||||||
|
|
||||||
// Requested size.
|
// Requested size.
|
||||||
static uint32_t next_stack_size = CIRCUITPY_DEFAULT_STACK_SIZE;
|
static uint32_t next_stack_size = 0;
|
||||||
static uint32_t current_stack_size = 0;
|
static uint32_t current_stack_size = 0;
|
||||||
// Actual location and size, may be larger than requested.
|
// Actual location and size, may be larger than requested.
|
||||||
static uint32_t *stack_limit = NULL;
|
static uint32_t *stack_limit = NULL;
|
||||||
@ -49,11 +49,15 @@ static void allocate_stack(void) {
|
|||||||
stack_limit = port_stack_get_limit();
|
stack_limit = port_stack_get_limit();
|
||||||
stack_length = (port_stack_get_top() - stack_limit) * sizeof(uint32_t);
|
stack_length = (port_stack_get_top() - stack_limit) * sizeof(uint32_t);
|
||||||
current_stack_size = stack_length;
|
current_stack_size = stack_length;
|
||||||
|
next_stack_size = stack_length;
|
||||||
} else {
|
} else {
|
||||||
mp_uint_t regs[10];
|
mp_uint_t regs[10];
|
||||||
mp_uint_t sp = cpu_get_regs_and_sp(regs);
|
mp_uint_t sp = cpu_get_regs_and_sp(regs);
|
||||||
|
|
||||||
mp_uint_t c_size = (mp_uint_t)port_stack_get_top() - sp;
|
mp_uint_t c_size = (mp_uint_t)port_stack_get_top() - sp;
|
||||||
|
if (next_stack_size == 0) {
|
||||||
|
next_stack_size = CIRCUITPY_DEFAULT_STACK_SIZE;
|
||||||
|
}
|
||||||
supervisor_allocation *stack_alloc = allocate_memory(c_size + next_stack_size + EXCEPTION_STACK_SIZE, true, false);
|
supervisor_allocation *stack_alloc = allocate_memory(c_size + next_stack_size + EXCEPTION_STACK_SIZE, true, false);
|
||||||
if (stack_alloc == NULL) {
|
if (stack_alloc == NULL) {
|
||||||
stack_alloc = allocate_memory(c_size + CIRCUITPY_DEFAULT_STACK_SIZE + EXCEPTION_STACK_SIZE, true, false);
|
stack_alloc = allocate_memory(c_size + CIRCUITPY_DEFAULT_STACK_SIZE + EXCEPTION_STACK_SIZE, true, false);
|
||||||
@ -103,8 +107,12 @@ size_t stack_get_length(void) {
|
|||||||
return stack_length;
|
return stack_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_next_stack_size(uint32_t size) {
|
bool set_next_stack_size(uint32_t size) {
|
||||||
|
if (port_has_fixed_stack()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
next_stack_size = size;
|
next_stack_size = size;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t get_next_stack_size(void) {
|
uint32_t get_next_stack_size(void) {
|
||||||
|
@ -37,7 +37,7 @@ void stack_resize(void);
|
|||||||
uint32_t *stack_get_bottom(void);
|
uint32_t *stack_get_bottom(void);
|
||||||
size_t stack_get_length(void);
|
size_t stack_get_length(void);
|
||||||
// Next/current requested stack size.
|
// Next/current requested stack size.
|
||||||
void set_next_stack_size(uint32_t size);
|
bool set_next_stack_size(uint32_t size);
|
||||||
uint32_t get_next_stack_size(void);
|
uint32_t get_next_stack_size(void);
|
||||||
uint32_t get_current_stack_size(void);
|
uint32_t get_current_stack_size(void);
|
||||||
bool stack_ok(void);
|
bool stack_ok(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user