Hello,
I have just started in the world of Nordic products and quite recently in the embedded world. I'm trying to learn and understand the use of zephyr in basic projects.
In this one I use two threads, one that makes the led blink and the other one with a callback on button pressed that sends a console message. However, my led doesn't blink and when I press the button nothing happens. I don't really understand why.
/* * Copyright (c) 2017 Linaro Limited * * SPDX-License-Identifier: Apache-2.0 */ #include <zephyr.h> #include <device.h> #include <devicetree.h> #include <drivers/gpio.h> #include <sys/util.h> #include <sys/printk.h> #include <inttypes.h> #include <drivers/pwm.h> #include <logging/log.h> #include <sys/__assert.h> #include <string.h> /* size of stack area used by each thread */ #define STACKSIZE 1024 /* scheduling priority used by each thread */ #define PRIORITY 7 #define SLEEP_MS 500 /*alias*/ #define LED0_NODE DT_ALIAS(led0) #define SW0_NODE DT_ALIAS(sw0) /*FIFO*/ struct printk_data_t { void *fifo_reserved; /* 1st word reserved for use by fifo */ uint32_t conp; uint32_t cnt; }; K_FIFO_DEFINE(printk_fifo); struct component { const char *gpio_dev_name; const char *gpio_pin_name; unsigned int gpio_pin; unsigned int gpio_flags; }; static struct gpio_callback button_cb; void print(uint32_t id, int cnt){ struct printk_data_t tx_data = { .conp = id, .cnt = cnt }; size_t size = sizeof(struct printk_data_t); char *mem_ptr = k_malloc(size); __ASSERT_NO_MSG(mem_ptr != 0); memcpy(mem_ptr, &tx_data, size); k_fifo_put(&printk_fifo, mem_ptr); k_msleep(SLEEP_MS); } void blink(const struct component *led, uint32_t id) { const struct device *gpio_dev; int cnt = 0; int ret; gpio_dev = device_get_binding(led->gpio_dev_name); if (gpio_dev == NULL) { printk("Error: didn't find %s device\n", led->gpio_dev_name); return; } ret = gpio_pin_configure(gpio_dev, led->gpio_pin, led->gpio_flags); if (ret != 0) { printk("Error %d: failed to configure pin %d '%s'\n", ret, led->gpio_pin, led->gpio_pin_name); return; } while (1) { gpio_pin_set(gpio_dev, led->gpio_pin, cnt % 2); print(id,cnt); cnt++; } } void button_pressed(const struct device *gpio_dev, struct gpio_callback *cb, uint32_t pins){ print(1,1); } void ring(const struct component *bt) { const struct device *gpio_dev; int cnt = 0; int ret; gpio_dev = device_get_binding(bt->gpio_dev_name); if (gpio_dev == NULL) { printk("Error: didn't find %s device\n", bt->gpio_dev_name); return; } ret = gpio_pin_configure(gpio_dev, bt->gpio_pin, bt->gpio_flags); if (ret != 0) { printk("Error %d: failed to configure pin %d '%s'\n", ret, bt->gpio_pin, bt->gpio_pin_name); return; } gpio_init_callback(&button_cb, button_pressed, bt->gpio_pin); gpio_add_callback(gpio_dev, &button_cb); bool val; while(1){ } } void led_blink(void) { const struct component led0 = { #if DT_NODE_HAS_STATUS(LED0_NODE, okay) .gpio_dev_name = DT_GPIO_LABEL(LED0_NODE, gpios), .gpio_pin_name = DT_LABEL(LED0_NODE), .gpio_pin = DT_GPIO_PIN(LED0_NODE, gpios), .gpio_flags = GPIO_OUTPUT_ACTIVE | DT_GPIO_FLAGS(LED0_NODE, gpios), #else #error "Unsupported board: led0 devicetree alias is not defined" #endif }; blink(&led0, 0); } void button(void) { const struct component button0 = { #if DT_NODE_HAS_STATUS(SW0_NODE, okay) .gpio_dev_name = DT_GPIO_LABEL(SW0_NODE, gpios), .gpio_pin_name = DT_LABEL(SW0_NODE), .gpio_pin = DT_GPIO_PIN(SW0_NODE, gpios), .gpio_flags = GPIO_INPUT | DT_GPIO_FLAGS(SW0_NODE, gpios), #else #error "Unsupported board: sw0 devicetree alias is not defined" #endif }; ring(&button0); } void uart_out(void) { while (1) { struct printk_data_t *rx_data = k_fifo_get(&printk_fifo, K_FOREVER); printk("[Info] conponent %d , value %d \n", rx_data->conp, rx_data->cnt); k_free(rx_data); } } K_THREAD_DEFINE(led_id, STACKSIZE, led_blink, NULL, NULL, NULL, PRIORITY, 0, 0); K_THREAD_DEFINE(button_id, STACKSIZE, button, NULL, NULL, NULL, PRIORITY, 0, 0); K_THREAD_DEFINE(uart_out_id, STACKSIZE, uart_out, NULL, NULL, NULL, PRIORITY, 0, 0);
If you know an idea or if you can explain to me what I'm doing wrong I would be delighted.
Thanks