基于正点原子FreeRTOS学习笔记——动态任务创建与删除

一.任务栈与优先级定义

优先级数值越大,优先级越高。栈设为128是比较大,可以使用函uxTaskGetStackHighWaterMark ( TaskHandle_t xTask );检测任务栈剩余的大小。但是在不确定栈大小的情况下可以将栈设置的偏大以避免任务无法创建。

#define START_TASK_STACK_SIZE 128      //栈大小
#define START_TASK_PRIO       1        //优先级
TaskHandle_t start_task_handler;       //句柄
void start_task( void * pvParameters );//任务函数

#define TASK1_STACK_SIZE 128
#define TASK1_PRIO       2
TaskHandle_t task1_handler;
void task1( void * pvParameters );

#define TASK2_STACK_SIZE 128
#define TASK2_PRIO       3
TaskHandle_t task2_handler;
void task2( void * pvParameters );

#define TASK3_STACK_SIZE 128
#define TASK3_PRIO       4
TaskHandle_t task3_handler;
void task3( void * pvParameters );

二.任务创建

freertos_demo创建start_task任务,创建后启动任务调度器。taskENTER_CRITICAL();是进入临界区,进入后可以避免进入中断。导致task1或者task2虽然优先级低但是会先执行。先执行原因是start_task任务创建后启动了任务调度器导致task1创建后进入运行态,在其阻塞后才继续执行start_task创建task2。接着重复出现此现象。通过串口通信可以看到被打断的过程。

以下摘自官网:

BaseType_t xTaskCreate(    TaskFunction_t pvTaskCode,
                            const char * const pcName,
                            const configSTACK_DEPTH_TYPE uxStackDepth,
                            void *pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t *pxCreatedTask
                          );、

创建一个新任务并将其添加到准备运行的任务列表中。 configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中被设置为 1(config.h中默认为1),或保留未定义状态(此时,它默认为 1) ,才能使用此 RTOS API 函数。

每个任务都需要 RAM 来保存任务状态,并由任务用作其 堆栈。 如果使用 xTaskCreate() 创建任务,则所需的 RAM 将自动 从 FreeRTOS 堆中分配。 如果创建任务 使用了 xTaskCreateStatic(),则 RAM 由应用程序编写者提供,因此可以在编译时进行静态分配。

pvTaskCode  指向任务入口函数的指针。

任务通常 以 无限循环的形式实现;实现任务的函数决不能试图返回 或退出。 但是,任务可以 自我删除

pcName  任务的描述性名称。主要是为了方便 调试,但也可用于 获取任务句柄

任务名称的最大长度由 FreeRTOSConfig.h 中的 configMAX_TASK_NAME_LEN 定义。

uxStackDepth  要分配用于 任务堆栈的 堆栈。例如,如果堆栈的宽度为 16 位,uxStackDepth 为 100,则将分配 200 字节用作该任务的堆栈。 再举一例,如果堆栈的宽度为 32 位,uxStackDepth 为 400,则将分配 1600 字节用作该任务的堆栈。

堆栈深度与堆栈宽度的乘积不得超过 size_t 类型变量所能包含的最大值。

pvParameters  作为参数传递给创建的任务的一个值。

如果 pvParameters 设置为变量的地址, 则在执行创建的任务时该变量必须仍然存在——因此 传递堆栈变量的地址是无效的。

uxPriority  创建任务执行的优先级 。

包含 MPU 支持的系统可在特权(系统)模式下选择性地创建任务, 方法是在 uxPriority 中设置 portPRIVILEGE_BIT 位。 例如,要创建一个优先级为 2 的特权任务,可将 uxPriority 设置为 ( 2 | portPRIVILEGE_BIT )。

断言优先级低于 configMAX_priority。 如果未定义 configASSERT,则优先级会被静默限制为 ( configMAX_priority - 1)。

pxCreatedTask  用于将句柄传递至由 xTaskCreate() 函数创建的任务 。 pxCreatedTask 是可选的,可设置为 NULL。

返回:

如果任务创建成功,则返回 pdPASS。 否则 返回 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY

void freertos_demo(void)
{
        xTaskCreate( (TaskFunction_t        ) start_task,
                                 (char *                ) "start_task",
                                 (configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,
                                 (void *                ) NULL,
                                 (UBaseType_t           ) START_TASK_PRIO,
                                 (TaskHandle_t *        ) &start_task_handler );
    vTaskStartScheduler();//开启任务调度器
}

void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();/*进入临界区*/
        xTaskCreate( (TaskFunction_t        ) task1,
                                 (char *                ) "task1",
                                 (configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,
                                 (void *                ) NULL,
                                 (UBaseType_t           ) TASK1_PRIO,
                                 (TaskHandle_t *        ) &task1_handler );
                                 
        xTaskCreate( (TaskFunction_t        ) task2,
                                 (char *                ) "task2",
                                 (configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,
                                 (void *                ) NULL,
                                 (UBaseType_t           ) TASK2_PRIO,
                                 (TaskHandle_t *        ) &task2_handler );                         
        
        xTaskCreate( (TaskFunction_t        ) task3,
                                 (char *                ) "task3",
                                 (configSTACK_DEPTH_TYPE) TASK3_STACK_SIZE,
                                 (void *                ) NULL,
                                 (UBaseType_t           ) TASK3_PRIO,
                                 (TaskHandle_t *        ) &task3_handler );        
        vTaskDelete(NULL);
        taskEXIT_CRITICAL();         /*退出临界区*/                 
}

void task1( void * pvParameters )
{
        while(1)
        {
            printf("task1正在运行\r\n");
            LED0_TOGGLE();
            vTaskDelay(500);
        }
}

void task2( void * pvParameters )
{
        while(1)
        {
            printf("task2正在运行\r\n");
            LED1_TOGGLE();
            vTaskDelay(500);
        }
}

void task3( void * pvParameters )
{
    uint8_t key = 0;
        while(1)
        {
            printf("task3正在运行\r\n");
            key = key_scan(0);
            if(key == KEY0_PRES)
            {
                if(task1_handler != NULL)//执行一次,避免重复释放内存。
                {
                    printf("删除task1\r\n");
                    vTaskDelete(task1_handler);
                    task1_handler = NULL;
                }
                
            }
            vTaskDelay(10);
            
        }
}

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 正点原子freertos pdf是一份详细的技术文档,主要介绍了正点原子FreeRTOS实时操作系统的基本架构和实现方法。该文档详细介绍了FreeRTOS任务管理、时间管理、内存管理、中断管理、队列管理等相应的应用、算法、数据结构、函数和宏等的使用方法和实现原理。该文档还包括了多个实际例子,展示了如何使用FreeRTOS在真实项目中实现任务调度、时间管理、共享资源管理等功能。 该文档对于想要学习和掌握FreeRTOS实时操作系统的开发人员来说,是一份非常有价值的资料。通过学习该文档,开发人员可以深入了解FreeRTOS的设计思路、内部实现和应用场景,掌握FreeRTOS的核心功能和使用方法,从而更加熟练地应用FreeRTOS进行实时操作系统开发。同时,该文档还提供了大量的代码示例,让开发人员可以更加快速地理解和应用FreeRTOS,帮助开发人员在项目开发过程中更高效地完成任务。总之,正点原子freertos pdf是一份对于实时操作系统开发人员非常有用的学习资料,可以帮助开发人员更快速地掌握FreeRTOS技术,提高开发效率。 ### 回答2: 正点原子freertos是一种嵌入式实时操作系统,采用轻量级设计的freertos内核。它具有高度可移植性、可扩展性、可配置性、可靠性等优点,可以很好地处理实时任务和多任务之间的优先级和调度问题,满足各种应用的不同需求。正点原子freertos提供了丰富的API接口,支持线程、信号量、消息队列、定时器、互斥锁等功能,方便编写实时应用程序。在使用过程中,用户可以根据系统需求进行配置参数,如内存大小、最大线程数量、时钟频率等。同时,正点原子freertos还支持跨平台开发,通过移植可以在不同的硬件平台上运行,提高了应用程序的可移植性和可重用性。normal,正点原子freertos官方也提供了详细的编程手册和示例代码,方便开发者学习和参考。总之,正点原子freertos是一款高效、灵活、可靠的实时操作系统,可以为嵌入式系统的开发提供强有力的支持。 ### 回答3: 正点原子是一家国内知名的开源电子硬件平台品牌,其推出了一款名为 FreeRTOS 的操作系统软件。该软件旨在让开发者和工程师们更加方便地进行电子设备的开发和编程。此外,正点原子还为该软件提供了一份详细的使用手册——FreeRTOS PDF。 FreeRTOS PDF 是一份面向初学者和资深工程师的完整使用手册,其中包括了从安装软件、核心概念、任务管理、队列和信号量、定时器等各方面的详细教程和指导。通过这份手册,用户可以更加深入地理解 FreeRTOS 软件的运作机制和一些常见问题的解决方案。同时,手册也提供了丰富的示例代码,方便用户在开发过程中进行参考和借鉴。 总之,正点原子FreeRTOS PDF 告诉我们,通过该软件可以轻松地实现完整的多任务管理系统,支持多个处理器、各种架构和设备等,并能保证高性能和实时性。而该手册则是完美地展现了 FreeRTOS 的功能和使用方法,为广大工程师和开发者提供了强有力的支持和指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值