精华内容
下载资源
问答
  • ESP32_FreeRTOS-SD卡 ESP32 FreeRTOS项目将数据记录到SDCard
  • ESP32嵌入式系统上运行的FreeRTOS应用程序 介绍 该proyect硬件由一块ESP32板以及加速度计/陀螺仪芯片MPU6050组成。 该应用的主要目的是测量动物的加速度,以监测他们在乡下的情况。 目标 该项目的主要目标是: ...
  • ESP32 FreeRTOS信号量

    2021-06-13 21:52:20
    开发环境:Arduino,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json 实现功能: (1)任务1初始化按钮,设置按钮中断,最后删除自身任务; (2)任务2接收信号量,...

    开发板:NodeMCU 32 V1.3
    开发板引脚图:
    在这里插入图片描述

    开发环境:Arduino,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    实现功能:
    (1)任务1初始化按钮,设置按钮中断,最后删除自身任务;
    (2)任务2接收信号量,如果在一定时间内接收到信号量,则翻转LED灯;这个时间由函数xSemaphoreTake的第二个参数决定,该函数原型为:BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );,其中xTicksToWait可以通过宏pdMS_TO_TICKS()将毫秒转成滴答数ticks;
    (3)setup:对led,串口等一些外设的初始化,创建信号量,创建freertos任务;

    Arduino代码为:

    #include <Arduino.h>
    /*
     * 开发板:NodeMCU 32 v1.3
     * setup():初始化串口,创建freertos任务,创建信号量
     * 任务Task1:初始化按钮,添加中断等,最后删除自身任务
     * ButtonISR:按钮触发中断服务函数,在ISR中释放信号量
     * 任务Task2:等待接收信号量,翻转LED
     */
    #if CONFIG_FREERTOS_UNICORE
    #define ARDUINO_RUNNING_CORE 0
    #else
    #define ARDUINO_RUNNING_CORE 1
    #endif
    
    #ifndef LED_BUILTIN
    #define LED_BUILTIN 2
    #endif
    
    #define LONG_TIME 0xffff
    #define buttonPin 0  // Nodemcu-32 BUTTON
    
    volatile byte state = LOW;   //LED初始状态为低电平
    
    // define two tasks for Blink & AnalogRead
    void TaskKey( void *pvParameters );
    void TaskAct( void *pvParameters );
    // 声明信号量句柄
    SemaphoreHandle_t xSemaphore;
    
    // the setup function runs once when you press reset or power the board
    void setup() {
      pinMode(LED_BUILTIN, OUTPUT); // 设置LED
     
      Serial.begin(115200); // 设置串口
      
      // Now set up two tasks to run independently.
      xTaskCreatePinnedToCore(
        TaskKey
        ,  "TaskKey"   // A name just for humans
        ,  2048  // This stack size can be checked & adjusted by reading the Stack Highwater
        ,  NULL
        ,  2  // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
        ,  NULL 
        ,  ARDUINO_RUNNING_CORE);
    
      xTaskCreatePinnedToCore(
        TaskAct
        ,  "TaskAct"
        ,  2048  // Stack size
        ,  NULL
        ,  1  // Priority
        ,  NULL 
        ,  ARDUINO_RUNNING_CORE);
      // Now the task scheduler, which takes over control of scheduling individual tasks, is automatically started.
    }
    
    void loop()
    {
      // Empty. Things are done in Tasks.
    }
    
    /*---------------------- Tasks ---------------------*/
    
    void TaskKey(void *pvParameters)  // This is a task.
    {
      (void) pvParameters;
      Serial.println(">>> Start TaskKey!");
      
      // 创建信号量
      xSemaphore = xSemaphoreCreateBinary();
      
      pinMode(buttonPin, INPUT);
      //设置中断
      attachInterrupt(digitalPinToInterrupt(buttonPin), ButtonISR, RISING);
    
      // 删除此任务
      vTaskDelete(NULL);
    }
    
    // 按钮中断函数
    void ButtonISR()
    {
      BaseType_t send;
      static BaseType_t xHigherPriorityTaskWoken;
      xHigherPriorityTaskWoken = pdFALSE;
      Serial.println("Button clicked!");
      // 释放信号量
      send = xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken);
      if (send==pdTRUE) Serial.println("Release semaphore successfully!");
      else Serial.println("Fialed to release semaphore!");
    }
    // 
    void TaskAct(void *pvParameters)  // This is a task.
    {
      (void) pvParameters;
      Serial.println(">>> Start TaskAct!");
      BaseType_t rec;
      BaseType_t msToWait = 1000; // 信号量接收等待时间
      TickType_t ticks;
      for (;;)
      {
        //函数原型:BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );
        rec = xSemaphoreTake(xSemaphore, pdMS_TO_TICKS(msToWait));//pdMS_TO_TICKS将ms转成对应的滴答数
        if (rec==pdTRUE) {
          Serial.println("Receive semaphore successfully!");
          state = !state;
          digitalWrite(LED_BUILTIN, state);
        }
        else {
          ticks = pdMS_TO_TICKS(msToWait);
          Serial.printf("Fialed to receive semaphore after waiting %d ticks!\n", ticks);
        }
        vTaskDelay(15);  // one tick delay (15ms) in between reads for stability
      }
    }
    

    结果如下
    在这里插入图片描述

    展开全文
  • ESP32 FreeRTOS队列操作

    2021-06-11 11:43:24
    开发环境:Arduino,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json 实现功能: (1)设定2个任务,设定一个队列(常规或者静态) (2)任务1:每隔1s,计数器加1,...

    开发板:NodeMCU 32 V1.3
    开发环境:Arduino,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    实现功能:
    (1)设定2个任务,设定一个队列(常规或者静态)
    (2)任务1:每隔1s,计数器加1,当计数值为5时,将计数值写入队列:xQueueSendToBack(myqueue, &count, wait_ticks),同时计数清零;
    (3)任务2:等待接收队列, xQueueReceive(myqueue, &rec, portMAX_DELAY),第三个参数表示阻塞时间,如果这么长时间内没有接收到队列值,返回pdFALSE。

    #include <Arduino.h>
    
    #if CONFIG_FREERTOS_UNICORE
    #define ARDUINO_RUNNING_CORE 0
    #else
    #define ARDUINO_RUNNING_CORE 1
    #endif
    
    /*创建静态队列*/
    #define QUEUE_DEPTH 1
    static StaticQueue_t qobj;
    static uint8_t qstorage[QUEUE_DEPTH*sizeof(unsigned char)];
    
    QueueHandle_t myqueue;
    /* 任务函数声明 */
    void SendQueue(void *pv);
    void ReceiveQueue(void *pv);
    /* Define the queue parameters. */
    #define QUEUE_LENGTH 5
    #define QUEUE_ITEM_SIZE sizeof( unsigned char )
    
    void setup()
    {
      pinMode(LED_BUILTIN, OUTPUT);
      Serial.begin(115200);
      /*获取程序使用的核*/
      char app_cpu = xPortGetCoreID();
      Serial.printf("Core used: %d\n", app_cpu);
      //创建普通队列
      myqueue = xQueueCreate(QUEUE_LENGTH, QUEUE_ITEM_SIZE);
      //创建静态队列
    //  myqueue = xQueueCreateStatic(QUEUE_DEPTH,sizeof(unsigned char),&qstorage[0],&qobj);
      
      //创建任务,注意stack size要大些,不然程序会一直reboot
      //xTaskCreatePinnedToCore是esp32特有的,因为esp32有2个核,官方在原有freertos基础上进行了改进
      xTaskCreatePinnedToCore(SendQueue, "SendQueue", 2048,NULL,1,NULL, ARDUINO_RUNNING_CORE);
      xTaskCreatePinnedToCore(ReceiveQueue, "ReceiveQueue", 2048, NULL, 1, NULL, ARDUINO_RUNNING_CORE);
      
    }
    
    void loop()
    {
      // Empty. Things are done in Tasks.
      vTaskDelete(NULL);
    }
    
    void SendQueue(void *pv)
    {
      unsigned char count=0;
      TickType_t wait_ticks = 2;
      for(;;)
      {
        count += 1;
        if (count==5) //计数到5时,发送队列
        {
          Serial.printf(">>> Start to send queue!\n", count);
          BaseType_t rc = xQueueSendToBack(myqueue, &count, wait_ticks); // send queue
          if (rc==pdTRUE) Serial.printf("Count:%d, Send from SendQueue!\n", count);
          else Serial.println("Error sending queue!");
          count = 0; //计数清零
        }
        vTaskDelay(1000); //每隔1s数值增一
      }
    }
    
    void ReceiveQueue(void *pv)
    {
      unsigned char rec;
      const TickType_t wait=120; //队列接收等待时间,超过该时间还没接收到队列数据返回pdFALSE
      for(;;)
      {
        //接收队列阻塞时间:portMAX_DELAY,表示当队列为空时一直阻塞
        BaseType_t rc = xQueueReceive(myqueue, &rec, portMAX_DELAY); 
        if (rc==pdTRUE) Serial.printf("Received:%d, Message from ReceiveQueue!\n", rec);
        else Serial.println("Error receiving queue!");
        vTaskDelay(1000);
      }
    }
    

    效果如下:
    在这里插入图片描述

    展开全文
  • ESP32 FreeRTOS 环境搭建和向导

    千次阅读 2018-09-07 11:24:30
    1. 环境配置 ...https://dl.espressif.com/dl/esp32_win32_msys2_environment_and_toolchain-20180110.zip 1.1.2安装MSYS2 解压到C盘根目录,你将会看到msys32的文件夹   1.1.3打开C:\msys32\m...

    1.       环境配置

    1.1 Windows安装Toolchain

    1.1.1 下载

    https://dl.espressif.com/dl/esp32_win32_msys2_environment_and_toolchain-20180110.zip

    1.1.2安装MSYS2

    解压到C盘根目录,你将会看到msys32的文件夹

    1

     

    1.1.3打开C:\msys32\mingw32.exe,进入shell command界面,并创建esp目录

    mkdir -p ~/esp

    2

    1.2 获取ESP-IDF

    1.2.1 输入cd ~/esp 再git clone --recursive https://github.com/espressif/esp-idf.git

    你将看到esp-idf的目录

    3

    1.2.2 获取all submodules:

    cd ~/esp/esp-idf

    git submodule update --init --recursive

    4

    1.2.3 设置ESP-IDF环境变量,Windows系统

    在C:\msys32\etc\profile.d创建脚本文件export_idf_path.sh,并加入code:

    export IDF_PATH="C:/msys32/home/terryyao/esp/esp-idf",注意自己实际路径

    5

    1.2.4添加后输入printenv IDF_PATH验证

    6

    1.3 安装Python Packages

    输入python -m pip install --user -r $IDF_PATH/requirements.txt

    7

    1.4编译一个demo测试,如hello_word

    1.4.1 进入esp目录,输入cd ~/esp

    1.4.2将hello_word的example复制到esp目录:

    输入cp -r $IDF_PATH/examples/get-started/hello_world ./

    1.4.3进入hello_word工程,输入cd ~/esp/hello_world

    1.4.4将Esp32连接电脑,开始配置config,输入make menuconfig,进入配置界面:

    8

    1.4.5进入Serial flasher config,根据实际Com munber配置,如截图

    9

    1.4.6开始编译刷机,输入make flash

    10

    1.4.7刷机成功:

    11

     

    2.       下载编译Amazon FreeRTOS

    2.1下载代码:https://github.com/aws/amazon-freertos

    2.2考虑到路径不能太长,将工程解压在C:\msys32\home\terryyao\esp\freertos

    2.3 配置Project,安装AWS CLI

    2.3.1在Mingw32环境下,在shell command中输入easy_install awscli

    2.3.2配置环境变量,打开C:\msys32\home\terryyao\.profile,

    加入export PATH=~/.local/bin:$PATH,如截图:

    12

    2.3.3并输入source ~/.profile才会生效

    2.3.4安装后,输入aws –version确认版本:

    13

    2.4配置AWS CLI

    2.4.1到IAM console获取access key ID和secret access key for an IAM user

    14

    或者你也可以参考https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html 如截图创建access key

    15

    2.4.2输入aws configure

    16

    2.4.3在C:\msys32\home\terryyao\.aws路径生成config和credentials两个文件

    17

    2.5安装boto3 Python module,输入easy_install boto3

    18

    2.6打开demos\common\tools\aws_config_quick_start\configure.json配置thing_name,wifi_ssid,wifi_password,wifi_security,如截图

    19

    2.7在demos/common/tools/aws_config_quick_start目录,输入python SetupAWS.py setup

    20

    2.8 demos\common\include中的aws_clientcredential.h将会被同步

    2.9进入demos\espressif\esp32_devkitc_esp_wrover_kit\make,输入make menuconfig

    2.10开始编译,需将之前配置的IDF_PATH屏蔽:

    21

    2.11输入make flash monitor,中间需要选择默认即可

    22

    2.12刷机成功:

    23

    2.13  Demo测试成功,可以发送MQTT消息给AWS Server

    24

    参考链接:https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_espressif.html

     

    展开全文
  • ESP32 - FreeRTOS

    千次阅读 2021-02-05 13:02:27
    ESP32 FreeRTOS概述TASK API头文件类型定义函数任务创建任务管理 本文为阅读esp32官方文档所做的一些笔记,原文如下。 供学习使用,因为本人能力有限,可能有不符合事实的内容, 敬请指正! 原文地址 概述 主要介绍...

    本文为阅读esp32官方文档所做的一些笔记,原文如下。
    供学习使用,因为本人能力有限,可能有不符合事实的内容,
    敬请指正!
    原文地址

    概述

    主要介绍esp32上运行的freertos的类型、函数、宏定义等等。
    esp32上的freertos是基于FreeRTOS v10.2.0
    详细信息见
    ESP-IDF FreeRTOS SMP Changes
    ESP-IDF FreeRTOS Additions

    TASK API

    头文件

    freertos/include/freertos/task.h

    类型定义

    函数

    注意:函数的相同内容的描述详细程度是递减的,相同的描述后面的内容可能不会重复提起,请顺序阅读。

    任务创建

    //创建任务 与xTaskCreate类似 但是多cpu情况下 他可以指定CPU运行
    //返回值:pdPASS 标志创建成功
    BaseType_t xTaskCreatePinnedToCore(
    //任务入口函数指针 void (*func)(void*)
    TaskFunction_t pvTaskCode, 
    //任务的表述名称 名称长度由MAX_TASK_NAME_LEN宏定义指定 默认为16
    const char *constpcName, 
    //任务栈深度 与vanilla FreeRTOS不同 太小会溢出
    const uint32_t usStackDepth,
    //任务函数的参数指针
     void *const pvParameters, 
     //优先级 要设置优先级为2 应该设置为(2 | portPRIVILEGE_BIT) 
     //其中portPRIVILEGE_BIT为一个宏定义常量
     UBaseType_t uxPriority, 
    //传入一个TaskHandle_t的变量 函数将为其赋值 用来执行挂起 删除等操作
     TaskHandle_t *const pvCreatedTask, 
     //指定cpu运行 如果设置为tskNO_AFFINITY 则表示不指定cpu
     const BaseType_t xCoreID
     )
    
    
    //创建一个任务 并加到就绪列表中
    /*
    在freertos的内部实现中,每个任务有两块内存空间,其中第一块作为任务的
    数据存储块,另一块作为任务的栈。如果用xTaskCreate来创建任务的话这两块
    内存空间就会自动动态地分配。如果用xTaskCreateStatic函数来创建任务,那么
    用户需要自行为任务分配内存,因此xTaskCreateStatic可以让一个任务在创建时
    不需要动态分配内存。
    */
    static BaseType_t xTaskCreate(
    //任务函数指针
    TaskFunction_t pvTaskCode, 
    //任务名称
    const char *const pcName, 
    //栈深度 不要太小 会溢出
    const uint32_t usStackDepth, 
    //任务函数参数指针
    void *const pvParameters, 
    //优先级 要设置优先级为2 应该设置为(2 | portPRIVILEGE_BIT) 
    UBaseType_t uxPriority, 
    //传入一个TaskHandle_t的变量 函数将为其赋值 用来执行挂起 删除等操作
    TaskHandle_t *const pvCreatedTask
    )
    
    //示例:
    //任务函数
    // Task to be created.
    void vTaskCode( void * pvParameters )
    {
     for( ;; )
     {
         // Task code goes here.
     }
    }
    
    // Function that creates a task.
    void vOtherFunction( void )
    {
    static uint8_t ucParameterToPass;
    TaskHandle_t xHandle = NULL;
    
     // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass
     // must exist for the lifetime of the task, so in this case is declared static.  If it was just an
     // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
     // the new task attempts to access it.
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
        configASSERT( xHandle );
    
     // Use the handle to delete the task.
        if( xHandle != NULL )
        {
         vTaskDelete( xHandle );
        }
    }
    
    
    //创建任务函数 
    //他的栈空间和Task Buffer是由用户自己申请并作为参数传入的
    //同样也可以选择CPU运行 
    //当pxStackBuffer和pxTaskBuffer都不为NULL时返回pdPASS表示成功
    //否则创建失败 返回errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
    //注:官方文档此函数返回类型是TaskHandle_t 
    //    此时创建成功是应该返回的是指向任务的指针
    TaskHandle_t xTaskCreateStaticPinnedToCore(
    TaskFunction_t pvTaskCode, 
    const char *const pcName,
    const uint32_t ulStackDepth, 
    void *const pvParameters, 
    UBaseType_t uxPriority, 
    //用户自己申请的空间
    StackType_t *const pxStackBuffer, 
    StaticTask_t *const pxTaskBuffer, 
    //tskNO_AFFINITY表示所有cpu皆可运行此任务
    const BaseType_t xCoreID
    )
    
    
    //创建一个任务并加到就绪列表中
    //与xTaskCreate的区别就是要自己分配内存
    static TaskHandle_t xTaskCreateStatic(
    TaskFunction_t pvTaskCode, 
    const char *constpcName, 
    const uint32_t ulStackDepth, 
    void *const pvParameters, 
    UBaseType_t uxPriority, 
    //用户分配堆栈内存
    StackType_t *const pxStackBuffer, 
    StaticTask_t *const pxTaskBuffer
    )
    
    

    任务管理

    
    
    //将任务删除并释放其占用的内存资源等等
    //被删除的任务将会在就绪、阻塞、挂起和事件队列中被删除
    //参数xTaskToDelete就是在创建任务是返回的TaskHandle_t类型的指针
    void vTaskDelete(TaskHandle_t xTaskToDelete)
    
    
    
    
    //将任务延时若干个时钟,让出cpu待延时结束后重新执行
    //注意单位是时钟 不是us也不是ms 需要换算
    //延时 100ms 则xTicksToDelay应该设为 100/portTICK_PERIOD_MS
    /*
    xTaskDelay是相对性的延时,对于需要定时执行的任务,其效果并不好
    可以使用vTaskDelayUntil来替代
    */
    void vTaskDelay(const TickType_t xTicksToDelay)
    
    //示例
    void vTaskFunction( void * pvParameters )
    {
    	// Block for 500ms.
    	const TickType_t xDelay = 500 / portTICK_PERIOD_MS;
    
        for( ;; )
        {
            // Simply toggle the LED every 500ms, blocking between each 	toggle.
            vToggleLED();
            vTaskDelay( xDelay );
        }
    }
    
    
    
    /*
    将任务延时到一个指定的时间 适合定期的任务
    参数:
    pxPreviousWakeTime:用来存储上次的时间 第一次初始化时需要调用xTaskGetTickCount () 来获取当前时间
    xTimeIncrement:时间增量,也就是设置任务执行的周期
    */
    void vTaskDelayUntil(TickType_t *const pxPreviousWakeTime, const TickType_t xTimeIncrement)
    //示例:
    // Perform an action every 10 ticks.
    void vTaskFunction( void * pvParameters )
    {
    	TickType_t xLastWakeTime;
    	const TickType_t xFrequency = 10;
        // Initialise the xLastWakeTime variable with the current time.
        xLastWakeTime = xTaskGetTickCount ();
        for( ;; )
        {
            // Wait for the next cycle.
            vTaskDelayUntil( &xLastWakeTime, xFrequency );
            // Perform action here.
        }
    }
    
    
    
    
    //将正在延时挂起的函数重新加入就绪队列
    BaseType_t xTaskAbortDelay(TaskHandle_tx Task)
    
    
    //获取任务的优先级
    UBaseType_t uxTaskPriorityGet(const TaskHandle_t xTask)
    
    
    //获取任务的状态
    /*
    返回值可以为以下之一
    eRunning
    eReady
    eBlocked
    eSuspended
    eDeleted
    eInvalid
    */
    eTaskState eTaskGetState(TaskHandle_t xTask)
    
    
    
    
    /*
    获取任务的详细信息
    */
    void vTaskGetInfo(
    TaskHandle_t xTask, 
    TaskStatus_t *pxTaskStatus, 
    BaseType_t xGetFreeStackSpace, 
    eTaskState eState
    )
    
    
    //设置任务的优先级
    void vTaskPrioritySet(TaskHandle_t xTask, UBaseType_t uxNewPriority)
    //示例  当xTask为NULL时则修改自己的优先级
    void vAFunction( void )
    {
    TaskHandle_t xHandle;
     // Create a task, storing the handle.
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
     // ...
     // Use the handle to raise the priority of the created task.
     vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
     // ...
     // Use a NULL handle to raise our priority to the same value.
     vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
    }
    
    
    //挂起一个任务 当xTaskToSuspend为NULL时表示挂起自己
    void vTaskSuspend(TaskHandle_t xTaskToSuspend)
    
    //重新运行挂起的任务
    void vTaskResume(TaskHandle_t xTaskToResume)
    
    //从中断中重新运行
    BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)
    
    //挂起所有的任务 实际上是将调度器挂起
    //注意:若调度器已经处于挂起状态不能再挂起调度器
    void vTaskSuspendAll(void)
    
    //让调度器重新运行
    BaseType_t xTaskResumeAll(void)
    
    

    未完待续

    展开全文
  • 用于freertos嵌入式实时系统内存泄漏检测,可以实时查看内存状况,具体平台是ESP32
  • 使用FreeRTOS,在一个内核上运行2个任务,以不同的时序切换内置LED。 实验装置 示例2-任务计划 在一个核心中运行2个任务。 一个读取用户输入以设置新的LED计时,另一个读取用户输入以根据用户输入闪烁。 实验装置...
  • 原理篇5、ESP32中的FreeRTOS

    千次阅读 2021-01-03 21:11:43
    目录ESP32简介1、CPU2、储存3、通信4、硬件FreeRTOS简介说明任务任务创建任务删除软件定时器创建软件定时器软件定时器激活软件定时器停止软件定时器删除队列队列创建队列写入队列读取信号量信号量创建信号量获取信号...
  • FreeRTOS提供的软件定时器支持单次模式和周期模式。单次模式和周期模式时间到达之后都会调用软件定时器的回调函数,可以在定时器回调函数中实现工程代码。FreeRTOS的软件定时器单次模式与周期模式的区别如下: 单次...
  • ESPIDF开发ESP32学习笔记【ESP32上的FreeRTOS

    千次阅读 多人点赞 2021-03-14 17:05:50
    文章目录Bootloader分区表默认分区表自定义分区表出厂程序恢复出厂设置...ESP32中的FreeRTOS时钟内存管理(内存堆)通信管理(消息队列、事件集、信号量、互斥量)消息队列事件集ESP32上的FreeRTOSbackport双核任务...
  • 任务删除 在实际应用中,有一些任务只需要运行一次...NodeMCU ESP32-S V3.0开发板一块 数据线一条 2、软件准备 vscode ESP-IDF的vscode扩展 在vscode中创建一个ESP-IDF项目,如果不清楚的同学,可以参考前面的文章ES
  • 带Arduino的ESP32-FreeRTOS- 已导入有用的Arduino库的项目模板。 使用此模板,可以实现FreeRTOS编程。 安装: 确保您已安装git命令。 git clone ...
  • ESP32学习笔记(2)FreeRTOS上手使用指南 文章目录ESP32学习笔记(2)FreeRTOS上手使用指南FreeRTOS的可配置参数配置参数demo可配置的参数简要说明FreeRTOS 使用指南(API)一个最简单的使用demo写两个任务在main中...
  • 1.ESP32 Arduino安装 文件->首选项 添加开发吧管理网址: https://dl.espressif.com/dl/package_esp32_index.json 工具->开发板->开发板管理器,搜索ESP32,点安装(此过程可能需要科学上网) 选择开发板 2...
  • 从零开始学ESP32:个人笔记记录: 芯片型号: ESP32 网络环境支持:LWIP IDF.PY-SDK: ESP-IDF v4.3 芯片功能: freeRTOS系统 声明: 当前内存池参考 Linux / rttthreadOS 两个套系统,自己写成的。 内存池的创建: ...
  • ESP32_FreeRtos_内存使用情况查看 前言:之前项目用到了esp8266也是用的freertos,当时也想查看内存使用情况,可是搞了好久也没有成功,只得暂时先放弃,如今使用esp32开发时也需要查看内存使用情况,主要是跑一下...
  • ESP32与外设备连接并驱动时,一些外设的驱动时序里会涉及到延时,因此如果在独立的任务里驱动控制外设,就需要使用到任务的阻塞延时。本实例将详细介绍FreeRTOS中任务阻塞延时的使用方法。 FreeRTOS提供了两个...
  • FreeRTOS中,任务邮箱实际上是消息队列固定长度为1的特殊形式。任务邮箱效率更高、占用RAM空间更小,更加灵活。 FreeRTOS提供了如果几种方式发送通知给任务: 发送通知给任务,如果通知未读,不覆盖通知值 发送...
  • 用于ESP32的LVGL项目 这是一个ESP32演示项目,展示了LVGL v7,并支持多个显示控制器和触摸控制器。 该演示应用程序是存储库中的lv_demo_widgets项目。 ESP-IDF版本需要4.2。 注意:我们正在尝试使此存储库向后兼容...
  • 且会导致esp32频繁重启。 程序如下: #include #include #include const char* ssid = “gzlhs.com”;//wifi名称 const char* password = “XXXXXXXX”;//wifi密码 WiFiServer server(80);//http端口 #if CONFIG_...
  • 基于事件的任务之间通信 事件是一种实现任务之间的通信机制,主要用于多任务间同步,与消息队列不同的是,事件通信只能是事件类型通信...一般情况下,在配置文件中将事件配置为32位,即将configUSE_16_BIT_TICKS定义为
  • ESP32的基础学习之FreeRTOS(一)

    千次阅读 2019-04-09 21:03:38
    本人也是刚刚开始学习ESP32,还未毕业。对嵌入式开发有一点点基础,之前一直还玩的是8051和STM32单片机。自从我发现了ESP32后,我就对它产生了浓厚的兴趣。之后我就在官网买了一块开发板,开始我的学习之旅。  首先...
  • 二、消息队列的作用三、FreeRtos中消息队列API的调用函数 xQueueCreate函数 xQueueSend2.读入数据总结 前言 写博客是为了总结知识,提炼知识不做知识的搬运者 文章不一定全是原创但是所写内容都有经过自身研读与...
  • FreeRTOS信号量 & ESP32实战

    千次阅读 2021-10-05 20:49:16
    ESP32实战 阅读建议:有一定操作系统基础知识。 FreeRTOS信号量 1. 二值信号量   二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制...
  • ESP32使用 FreeRTOS 操作系统
  • ESP32-Arduino中的FreeRTOS使用 在platformio中不需要引入FreeRTOS的头文件,直接可用 创建任务 xTaskCreatePinnedToCore(task,"task_name",stack_depth,some_param,priority,handler,core_id); 字段 含义 ...
  • 使用esp32的GPIO接口,实现下降沿和上升沿中断,开始点亮您的第一盏 LED和中断回调实现按键功能 。https://blog.csdn.net/xh870189248/article/details/80354565
  • 基于stm32F407 + FreeRTOS + ESP8266的实时气象站系统,通过物联网技术实时读取天气情况,温度以及自带了一个计时功能。 所需设备 stm32F407,淘晶驰串口屏,ESP8266; 串口屏连接串口3,ESP8266连接串口2,串口1...
  • 在前面的ESP32开发实例-FreeRTOS信号量-计数信号量实例中,我们掌握了普通任务间通过计数信号量进行通信,在本次实例中,将详细介绍如何在中断服务中与普通任务之间使用计数信号量。 在ESP32中,中断服务与普通任务...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,867
精华内容 746
关键字:

esp32freertos