Adding start of interrupts and moving rtos words to vocab.
This commit is contained in:
@ -15,6 +15,7 @@
|
|||||||
#define ENABLE_I2C_SUPPORT
|
#define ENABLE_I2C_SUPPORT
|
||||||
#define ENABLE_SOCKETS_SUPPORT
|
#define ENABLE_SOCKETS_SUPPORT
|
||||||
#define ENABLE_FREERTOS_SUPPORT
|
#define ENABLE_FREERTOS_SUPPORT
|
||||||
|
#define ENABLE_INTERRUPTS_SUPPORT
|
||||||
|
|
||||||
// Uncomment this #define for OLED Support.
|
// Uncomment this #define for OLED Support.
|
||||||
// You will need to install these libraries from the Library Manager:
|
// You will need to install these libraries from the Library Manager:
|
||||||
@ -128,6 +129,7 @@
|
|||||||
OPTIONAL_CAMERA_SUPPORT \
|
OPTIONAL_CAMERA_SUPPORT \
|
||||||
OPTIONAL_SOCKETS_SUPPORT \
|
OPTIONAL_SOCKETS_SUPPORT \
|
||||||
OPTIONAL_FREERTOS_SUPPORT \
|
OPTIONAL_FREERTOS_SUPPORT \
|
||||||
|
OPTIONAL_INTERRUPTS_SUPPORT \
|
||||||
OPTIONAL_OLED_SUPPORT \
|
OPTIONAL_OLED_SUPPORT \
|
||||||
|
|
||||||
#ifndef ENABLE_SPIFFS_SUPPORT
|
#ifndef ENABLE_SPIFFS_SUPPORT
|
||||||
@ -156,6 +158,19 @@
|
|||||||
Y(xPortGetCoreID, PUSH xPortGetCoreID())
|
Y(xPortGetCoreID, PUSH xPortGetCoreID())
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENABLE_INTERRUPTS_SUPPORT
|
||||||
|
# define OPTIONAL_INTERRUPTS_SUPPORT
|
||||||
|
#else
|
||||||
|
# include "esp_intr_alloc.h"
|
||||||
|
# include "driver/gpio.h"
|
||||||
|
# define OPTIONAL_INTERRUPTS_SUPPORT \
|
||||||
|
Y(gpio_isr_handler_add, n0 = GpioIsrHandlerAdd((gpio_num_t) n2, n1, n0); NIPn(2)) \
|
||||||
|
Y(gpio_isr_handler_remove, n0 = gpio_isr_handler_remove((gpio_num_t) n0)) \
|
||||||
|
Y(gpio_install_isr_service, n0 = gpio_install_isr_service(n0)) \
|
||||||
|
Y(esp_intr_alloc, n0 = EspIntrAlloc(n4, n3, n2, n1, a0); NIPn(4)) \
|
||||||
|
Y(esp_intr_free, n0 = esp_intr_free((intr_handle_t) n0))
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef ENABLE_CAMERA_SUPPORT
|
#ifndef ENABLE_CAMERA_SUPPORT
|
||||||
# define OPTIONAL_CAMERA_SUPPORT
|
# define OPTIONAL_CAMERA_SUPPORT
|
||||||
#else
|
#else
|
||||||
@ -368,6 +383,9 @@ static Adafruit_SSD1306 *oled_display = 0;
|
|||||||
static char filename[PATH_MAX];
|
static char filename[PATH_MAX];
|
||||||
static String string_value;
|
static String string_value;
|
||||||
|
|
||||||
|
static cell_t EspIntrAlloc(cell_t source, cell_t flags, cell_t xt, cell_t arg, cell_t *ret);
|
||||||
|
static cell_t GpioIsrHandlerAdd(cell_t pin, cell_t xt, cell_t arg);
|
||||||
|
|
||||||
{{core}}
|
{{core}}
|
||||||
{{interp}}
|
{{interp}}
|
||||||
{{boot}}
|
{{boot}}
|
||||||
@ -419,6 +437,41 @@ static void InvokeWebServerOn(WebServer *ws, const char *url, cell_t xt) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct handle_interrupt_args {
|
||||||
|
cell_t xt;
|
||||||
|
cell_t arg;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void IRAM_ATTR HandleInterrupt(void *arg) {
|
||||||
|
struct handle_interrupt_args *args = (struct handle_interrupt_args *) arg;
|
||||||
|
cell_t code[2];
|
||||||
|
code[0] = args->xt;
|
||||||
|
code[1] = g_sys.YIELD_XT;
|
||||||
|
cell_t stack[16];
|
||||||
|
cell_t rstack[16];
|
||||||
|
stack[0] = args->arg;
|
||||||
|
cell_t *rp = rstack;
|
||||||
|
*++rp = (cell_t) (stack + 1);
|
||||||
|
*++rp = (cell_t) code;
|
||||||
|
forth_run(rp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell_t EspIntrAlloc(cell_t source, cell_t flags, cell_t xt, cell_t arg, void *ret) {
|
||||||
|
// NOTE: Leaks memory.
|
||||||
|
struct handle_interrupt_args *args = (struct handle_interrupt_args *) malloc(sizeof(struct handle_interrupt_args));
|
||||||
|
args->xt = xt;
|
||||||
|
args->arg = arg;
|
||||||
|
return esp_intr_alloc(source, flags, HandleInterrupt, args, (intr_handle_t *) ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cell_t GpioIsrHandlerAdd(cell_t pin, cell_t xt, cell_t arg) {
|
||||||
|
// NOTE: Leaks memory.
|
||||||
|
struct handle_interrupt_args *args = (struct handle_interrupt_args *) malloc(sizeof(struct handle_interrupt_args));
|
||||||
|
args->xt = xt;
|
||||||
|
args->arg = arg;
|
||||||
|
return gpio_isr_handler_add((gpio_num_t) pin, HandleInterrupt, args);
|
||||||
|
}
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
cell_t *heap = (cell_t *) malloc(HEAP_SIZE);
|
cell_t *heap = (cell_t *) malloc(HEAP_SIZE);
|
||||||
forth_init(0, 0, heap, boot, sizeof(boot));
|
forth_init(0, 0, heap, boot, sizeof(boot));
|
||||||
|
|||||||
@ -86,6 +86,20 @@ transfer{
|
|||||||
16 constant sizeof(sockaddr_in)
|
16 constant sizeof(sockaddr_in)
|
||||||
forth definitions
|
forth definitions
|
||||||
|
|
||||||
|
vocabulary interrupts interrupts definitions
|
||||||
|
transfer{
|
||||||
|
gpio_isr_handler_add gpio_isr_handler_remove gpio_install_isr_service
|
||||||
|
esp_intr_alloc esp_intr_free
|
||||||
|
}transfer
|
||||||
|
0 constant ESP_INTR_FLAG_DEFAULT
|
||||||
|
forth definitions
|
||||||
|
|
||||||
|
vocabulary rtos rtos definitions
|
||||||
|
transfer{
|
||||||
|
xPortGetCoreID xTaskCreatePinnedToCore vTaskDelete
|
||||||
|
}transfer
|
||||||
|
forth definitions
|
||||||
|
|
||||||
DEFINED? SerialBT.new [IF]
|
DEFINED? SerialBT.new [IF]
|
||||||
vocabulary bluetooth bluetooth definitions
|
vocabulary bluetooth bluetooth definitions
|
||||||
transfer{
|
transfer{
|
||||||
|
|||||||
Reference in New Issue
Block a user