lab2-4_single_msg_queue_interrupt
This commit is contained in:
parent
7ddfd4a1aa
commit
0c0741aef3
@ -104,7 +104,7 @@ void app_main(void) {
|
|||||||
DISPLAY("Start of app_main task, priority = %d",uxTaskPriorityGet(NULL));
|
DISPLAY("Start of app_main task, priority = %d",uxTaskPriorityGet(NULL));
|
||||||
vTaskSuspendAll();
|
vTaskSuspendAll();
|
||||||
|
|
||||||
xTaskCreatePinnedToCore(vTaskFunction1, "Task 1", STACK_SIZE, (void*)"Task 1", T1_PRIO, NULL,CORE_1);
|
|
||||||
xTaskCreatePinnedToCore(vTaskFunction2, "Task 2", STACK_SIZE, (void*)"Task 2", T2_PRIO, NULL,CORE_0);
|
xTaskCreatePinnedToCore(vTaskFunction2, "Task 2", STACK_SIZE, (void*)"Task 2", T2_PRIO, NULL,CORE_0);
|
||||||
xTaskCreatePinnedToCore(vTaskFunction3, "Task 3", STACK_SIZE, (void*)"Task 3", T3_PRIO, NULL,CORE_0);
|
xTaskCreatePinnedToCore(vTaskFunction3, "Task 3", STACK_SIZE, (void*)"Task 3", T3_PRIO, NULL,CORE_0);
|
||||||
|
|
||||||
|
|||||||
@ -13,19 +13,7 @@
|
|||||||
*
|
*
|
||||||
* @see https://github.com/fmuller-pns/esp32-vscode-project-template
|
* @see https://github.com/fmuller-pns/esp32-vscode-project-template
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "esp_log.h"
|
|
||||||
|
|
||||||
/* FreeRTOS.org includes. */
|
|
||||||
#include "freertos/FreeRTOSConfig.h"
|
|
||||||
#include "freertos/FreeRTOS.h"
|
|
||||||
#include "freertos/task.h"
|
|
||||||
#include "freertos/semphr.h"
|
|
||||||
|
|
||||||
#include "my_helper_fct.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -42,7 +30,11 @@
|
|||||||
|
|
||||||
#include "my_helper_fct.h"
|
#include "my_helper_fct.h"
|
||||||
|
|
||||||
|
QueueHandle_t xMsgQ;
|
||||||
static const char* TAG = "MsgQ";
|
static const char* TAG = "MsgQ";
|
||||||
|
static const uint32_t T1_PRIO = 2;
|
||||||
|
static volatile uint32_t isrCount = 0;
|
||||||
|
|
||||||
|
|
||||||
// Push button for interrupt
|
// Push button for interrupt
|
||||||
static const gpio_num_t PIN_PUSH_BUTTON = 15;
|
static const gpio_num_t PIN_PUSH_BUTTON = 15;
|
||||||
@ -50,19 +42,35 @@ static const gpio_num_t PIN_PUSH_BUTTON = 15;
|
|||||||
/* Stack size for all tasks */
|
/* Stack size for all tasks */
|
||||||
const uint32_t TASK_STACK_SIZE = 4096;
|
const uint32_t TASK_STACK_SIZE = 4096;
|
||||||
|
|
||||||
|
static void IRAM_ATTR Push_button_isr_handler(void *args);
|
||||||
|
void vCounterTask(void *pvParameters);
|
||||||
|
|
||||||
|
|
||||||
void app_main(void) {
|
void app_main(void) {
|
||||||
|
|
||||||
/* Config GPIO */
|
/* Config GPIO */
|
||||||
|
gpio_config_t config_in = {
|
||||||
|
.intr_type = GPIO_INTR_NEGEDGE,
|
||||||
|
.mode = GPIO_MODE_INPUT,
|
||||||
|
.pull_down_en = GPIO_PULLDOWN_DISABLE,
|
||||||
|
.pull_up_en = GPIO_PULLUP_ENABLE,
|
||||||
|
.pin_bit_mask = (1ULL << PIN_PUSH_BUTTON)
|
||||||
|
};
|
||||||
|
gpio_config(&config_in);
|
||||||
|
|
||||||
/* Create Message Queue and Check if created */
|
/* Create Message Queue and Check if created */
|
||||||
|
xMsgQ = xQueueCreate(1, sizeof(uint32_t));
|
||||||
|
if(xMsgQ == NULL){
|
||||||
|
//DISPLAY("xMsgQ was not created and must not be used!");
|
||||||
|
ESP_LOGE(TAG,"MsgQ cannot be created.");
|
||||||
|
}
|
||||||
|
|
||||||
/* Create vCounterTask task */
|
/* Create vCounterTask task */
|
||||||
|
xTaskCreate(vCounterTask, "Counter Task", TASK_STACK_SIZE, NULL, T1_PRIO, NULL);
|
||||||
|
|
||||||
/* Install ISR */
|
/* Install ISR */
|
||||||
|
gpio_install_isr_service(0);
|
||||||
|
gpio_isr_handler_add(PIN_PUSH_BUTTON, Push_button_isr_handler, (void *)PIN_PUSH_BUTTON);
|
||||||
|
|
||||||
|
|
||||||
/* to ensure its exit is clean */
|
/* to ensure its exit is clean */
|
||||||
@ -70,36 +78,46 @@ void app_main(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void vCounterTask(void *pvParameters) {
|
void vCounterTask(void *pvParameters) {
|
||||||
|
int pinNumber;
|
||||||
for (;; ) {
|
for (;; ) {
|
||||||
|
|
||||||
/* Wait for message with 5 sec. otherwise DISPLAY a message to push it */
|
/* Wait for message with 5 sec. otherwise DISPLAY a message to push it */
|
||||||
|
if(xQueueReceive(xMsgQ,&pinNumber, pdMS_TO_TICKS(5000))){
|
||||||
/* If pushed */
|
/* If pushed */
|
||||||
|
|
||||||
// DISPLAY "Button pushed" and the isrCount variable
|
// DISPLAY "Button pushed" and the isrCount variable
|
||||||
|
DISPLAY("Button pushed, isrCount:%d", isrCount);
|
||||||
// Get the number of items in the queue
|
// Get the number of items in the queue
|
||||||
|
uint32_t msgNumber = uxQueueMessagesWaiting(xMsgQ);
|
||||||
// DISPLAYI (Information display) number of items if greater than 1
|
// DISPLAYI (Information display) number of items if greater than 1
|
||||||
|
if(msgNumber > 1){
|
||||||
|
DISPLAYI(TAG, "More than one interrupt occurs : %d", msgNumber);
|
||||||
|
}
|
||||||
// Waiting for push button signal is 1 again (test every 20 ms)
|
// Waiting for push button signal is 1 again (test every 20 ms)
|
||||||
|
do {
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(20));
|
||||||
|
} while (gpio_get_level(pinNumber) == 0);
|
||||||
|
|
||||||
// DISPLAY "Button released"
|
// DISPLAY "Button released"
|
||||||
|
DISPLAY("Button released, isrCount: %d", isrCount);
|
||||||
|
}
|
||||||
/* Else If Time out */
|
/* Else If Time out */
|
||||||
|
else
|
||||||
|
{
|
||||||
// Display message "Please, push the button!"
|
// Display message "Please, push the button!"
|
||||||
|
DISPLAY("Please, push the button!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void IRAM_ATTR Push_button_isr_handler(void *args) {
|
static void IRAM_ATTR Push_button_isr_handler(void *args) {
|
||||||
|
|
||||||
|
int pinNumber = (int)args;
|
||||||
// Increment isrCount
|
// Increment isrCount
|
||||||
|
isrCount++;
|
||||||
|
|
||||||
// Send message
|
// Send message
|
||||||
|
xQueueSendFromISR(xMsgQ, &pinNumber, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,47 @@
|
|||||||
|
#ifndef _MY_HELPER_FCT_
|
||||||
|
#define _MY_HELPER_FCT_
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Core constants fot xTaskCreatePinnedToCore() function */
|
||||||
|
const uint32_t CORE_0 = 0;
|
||||||
|
const uint32_t CORE_1 = 1;
|
||||||
|
const uint32_t PRO_CPU = 0;
|
||||||
|
const uint32_t APP_CPU = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro to display the buffer with arguments. msg is a formatted string as printf() function.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define DISPLAY(msg, ...) printf("%d:%d>\t"msg"\r\n", xTaskGetTickCount(), xPortGetCoreID(), ##__VA_ARGS__);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro to display error/warning/info for the buffer with arguments. msg is a formatted string as printf() function.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define DISPLAYE(tag, msg, ...) ESP_LOGE(tag, "%d:%d>\t"msg"", xTaskGetTickCount(), xPortGetCoreID(), ##__VA_ARGS__);
|
||||||
|
|
||||||
|
#define DISPLAYW(tag, msg, ...) ESP_LOGW(tag, "%d:%d>\t"msg"", xTaskGetTickCount(), xPortGetCoreID(), ##__VA_ARGS__);
|
||||||
|
|
||||||
|
#define DISPLAYI(tag, msg, ...) ESP_LOGI(tag, "%d:%d>\t"msg"", xTaskGetTickCount(), xPortGetCoreID(), ##__VA_ARGS__);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro to display the buffer without argument
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define DISPLAYB(msg) printf("%d:%d>\t", xTaskGetTickCount(), xPortGetCoreID());\
|
||||||
|
printf(msg);\
|
||||||
|
printf("\r\n");
|
||||||
|
|
||||||
|
|
||||||
|
/* Consume CPU cycles. Time parameter is for the default frequency: 160MHz (ESP32_DEFAULT_CPU_FREQ_MHZ=160) */
|
||||||
|
#define COMPUTE_IN_TIME_US(time_us) {register uint32_t i=(uint32_t)time_us*5.02*100/22; while (i-- > 0) {asm(" nop");}}
|
||||||
|
|
||||||
|
#define COMPUTE_IN_TIME_MS(time_ms) {register uint32_t i=(uint32_t)time_ms*1000*5.02*100/22; while (i-- > 0) {asm(" nop");}}
|
||||||
|
|
||||||
|
#define COMPUTE_IN_TICK(tick) {register uint32_t i=(uint32_t)(tick*1000/configTICK_RATE_HZ)*1000*5.02*100/22; while (i-- > 0) {asm(" nop");}}
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
|
||||||
|
CONFIG_ESPTOOLPY_FLASHSIZE="4MB"
|
||||||
|
|
||||||
|
# disable watchdog for task
|
||||||
|
CONFIG_ESP_TASK_WDT=n
|
||||||
|
|
||||||
|
# 1 core to perform freertos
|
||||||
|
CONFIG_FREERTOS_UNICORE=y
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user