@@ -107,32 +107,37 @@ STATIC void freertos_entry(void *arg) {
107107 }
108108}
109109
110- void mp_thread_create (void * (* entry )(void * ), void * arg , size_t stack_size ) {
110+ void mp_thread_create (void * (* entry )(void * ), void * arg , size_t * stack_size ) {
111111 // store thread entry function into a global variable so we can access it
112112 ext_thread_entry = entry ;
113113
114- if (stack_size == 0 ) {
115- stack_size = 2048 ; // default stack size
114+ if (* stack_size == 0 ) {
115+ * stack_size = 4096 ; // default stack size
116+ } else if (* stack_size < 2048 ) {
117+ * stack_size = 2048 ; // minimum stack size
116118 }
117119
118120 mp_thread_mutex_lock (& thread_mutex , 1 );
119121
120122 // create thread
121- StackType_t * stack = m_new (StackType_t , stack_size / sizeof (StackType_t ));
123+ StackType_t * stack = m_new (StackType_t , * stack_size / sizeof (StackType_t ));
122124 StaticTask_t * task_buf = m_new (StaticTask_t , 1 );
123- TaskHandle_t id = xTaskCreateStatic (freertos_entry , "Thread" , stack_size / sizeof (void * ), arg , 2 , stack , task_buf );
125+ TaskHandle_t id = xTaskCreateStatic (freertos_entry , "Thread" , * stack_size / sizeof (void * ), arg , 2 , stack , task_buf );
124126 if (id == NULL ) {
125127 mp_thread_mutex_unlock (& thread_mutex );
126128 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , "can't create thread" ));
127129 }
128130
131+ // adjust stack_size to provide room to recover from hitting the limit
132+ * stack_size -= 512 ;
133+
129134 // add thread to linked list of all threads
130135 thread_t * th = m_new_obj (thread_t );
131136 th -> id = id ;
132137 th -> ready = 0 ;
133138 th -> arg = arg ;
134139 th -> stack = stack ;
135- th -> stack_len = stack_size / sizeof (StackType_t );
140+ th -> stack_len = * stack_size / sizeof (StackType_t );
136141 th -> next = thread ;
137142 thread = th ;
138143
0 commit comments