|
11 | 11 | #include "freertos/semphr.h" |
12 | 12 | #include "freertos/event_groups.h" |
13 | 13 | #include "freertos/idf_additions.h" |
| 14 | + #include "rom/ets_sys.h" |
| 15 | + #include "esp_system.h" |
| 16 | + #include "esp_cpu.h" |
14 | 17 |
|
15 | 18 | #include "esp_lcd_panel_ops.h" |
16 | 19 |
|
|
133 | 136 | } |
134 | 137 |
|
135 | 138 | void rgb_bus_copy_task(void *self_in) { |
| 139 | + printf("rgb_bus_copy_task - STARTED\n"); |
| 140 | + |
136 | 141 | mp_lcd_rgb_bus_obj_t *self = (mp_lcd_rgb_bus_obj_t *)self_in; |
137 | 142 |
|
138 | 143 | copy_func_cb_t func; |
|
160 | 165 |
|
161 | 166 | if (rgb_bus_event_isset(&self->partial_copy)) { |
162 | 167 | rgb_bus_event_clear(&self->partial_copy); |
| 168 | + printf("rgb_bus_copy_task - partial_copy\n"); |
| 169 | + |
163 | 170 |
|
164 | 171 | copy_pixels( |
165 | 172 | self->idle_fb, self->partial_buf, |
|
168 | 175 | self->width, self->height, |
169 | 176 | bytes_per_pixel, func, self->rotation); |
170 | 177 |
|
171 | | - if (self->callback != mp_const_none) mp_sched_schedule(self->callback, MP_OBJ_FROM_PTR(self)); |
172 | | - } |
| 178 | + if (self->callback != mp_const_none) { |
| 179 | + volatile uint32_t sp = (uint32_t)esp_cpu_get_sp(); |
| 180 | + |
| 181 | + void *old_state = mp_thread_get_state(); |
| 182 | + |
| 183 | + mp_state_thread_t ts; |
| 184 | + mp_thread_set_state(&ts); |
| 185 | + mp_stack_set_top((void*)sp); |
| 186 | + mp_stack_set_limit(CONFIG_FREERTOS_IDLE_TASK_STACKSIZE - 1024); |
| 187 | + mp_locals_set(mp_state_ctx.thread.dict_locals); |
| 188 | + mp_globals_set(mp_state_ctx.thread.dict_globals); |
| 189 | + |
| 190 | + mp_sched_lock(); |
| 191 | + gc_lock(); |
| 192 | + |
| 193 | + nlr_buf_t nlr; |
| 194 | + if (nlr_push(&nlr) == 0) { |
| 195 | + mp_call_function_n_kw(self->callback, 0, 0, NULL); |
| 196 | + nlr_pop(); |
| 197 | + } else { |
| 198 | + ets_printf("Uncaught exception in IRQ callback handler!\n"); |
| 199 | + mp_obj_print_exception(&mp_plat_print, MP_OBJ_FROM_PTR(nlr.ret_val)); |
| 200 | + } |
| 201 | + |
| 202 | + gc_unlock(); |
| 203 | + mp_sched_unlock(); |
| 204 | + |
| 205 | + mp_thread_set_state(old_state); |
| 206 | + } |
173 | 207 |
|
174 | 208 | if (rgb_bus_event_isset(&self->last_update)) { |
175 | 209 | rgb_bus_event_clear(&self->last_update); |
| 210 | + printf("rgb_bus_copy_task - last_update\n"); |
| 211 | + |
176 | 212 | uint8_t *idle_fb = self->idle_fb; |
177 | 213 | rgb_bus_event_set(&self->swap_bufs); |
178 | 214 |
|
|
0 commit comments