精华内容
下载资源
问答
  • S32DS自带了Freertos的分析调试工具,打开后可以显示任务的状态,heap的使用大小。 然后结合debug与assert()发现了是其他两个任务并没有创建。 void my_assert(uint8_t condition,char* file_name,uint32_t line_no)...

    问题

    使用NXP的S32芯片开发,环境是S32DS 2018,创建了三个任务,最后发现只有一个任务在运行。

    找问题

    S32DS自带了Freertos的分析调试工具,打开后可以显示任务的状态,heap的使用大小。分析工具
    然后结合debug与assert()发现了是其他两个任务并没有创建。

    void my_assert(uint8_t condition,char* file_name,uint32_t line_no)
    {
      
      if(!condition)
      {
        printf( "\n[Debug]Assert failed: %s, line %u\n",file_name,line_no);
        abort();
      }
    }
    
    

    解决

    任务不能正常创建一般是heap分配不够的原因,于是去修改configTOTAL_HEAP_SIZE这个宏

    #define configTOTAL_HEAP_SIZE                    ( ( size_t ) 20480 )
    

    最后我给的20K,够用了,成功创建三个任务,heap使用率为55%。

    展开全文
  • FreeRTOS 创建任务失败原因

    千次阅读 2019-10-21 09:35:40
    我在移植开源库时里面的是 Heap_3 但是 我使用了 Heap_4的配置导致申请 任务堆栈空间失败创建 任务原因 /*Allocate space for the stack used by the task being created. */ pxStack = ( StackType_t * ) ...

    (我的环境是:
    我在移植开源库时里面的是 Heap_3 但是 我使用了 Heap_4的配置导致申请 任务堆栈空间失败

    创建 任务原因

    /*Allocate space for the stack used by the task being created. */
    pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
    

    在为任务堆栈分配空间时返回值为 0

    也就是分配的堆栈空间失败

    导致分配的原因呢
    那么就是 Heap管理机制 与设置的参数不一致,也就是FreeRTOSConfig.h 函数里面的相关配置

    (以下介绍来自https://blog.csdn.net/weixin_42385536/article/details/80639712)

    freeRTOS没有强制提供Heap管理机制,只是给出了几类推荐方案,用于支持RTOS所需存储空间的分配回收管理。

    Heap_1:使用栈管理heap,分配的存储空间在回收时,必须保证在其之后分配的存储空间都已经回收后才能进行,可使用该类分配方式,不建议进行存储空间的回收。

    Heap_2:使用链表管理heap,可能产生碎片,不建议使用

    Heap_3:使用标准C提供的malloc和free管理heap,

    Heap_4:使用链表管理heap,并且使用首次适配算法整理碎片,推荐使用

    Heap_5:与Heap_4基本一致,但是支持heap为多段不连续存储空间的集合

    展开全文
  • stm32上freertos任务无法创建和运行的问题 当用如下语句创建了多任务后,能编译且能写入flash,但是任务无法运行。 int main(void) { LED_GPIO_Config(); xTaskCreate(task_1, "task1", 10, NULL, 1, NULL); //...

    stm32上freertos任务无法创建和运行的问题

    当用如下语句创建了多任务后,能编译且能写入flash,但是任务无法运行。

    int main(void)
    {
    	LED_GPIO_Config();
    	 xTaskCreate(task_1, "task1", 10, NULL, 1, NULL);
    	 //(1)
    	 xTaskCreate(task_2, "task2", 10, NULL, 1, NULL);
    	 //(2)
    	 vTaskStartScheduler();
    	 //(3)
    	 while(1);
    }
    

    问题分析:

    很有可能是因为RAM分配不当造成的,此时可用readelf命令查看所生成的elf文件,看看他内部的内存布局。

    readelf -a -n build/STM32F103C8T6.elf
    

    用关键字2000来查看内存区域的情况:

    readelf -a -n build/STM32F103C8T6.elf | grep 2000
    

    在这里插入图片描述
    看到bss的大小为4938,_user_heap_stack 这一行起始地址都已经到0x2000493c了,而整个RAM的最大地址也才20005000,所以推测是bss里面某些符号所占空间太大。
    继续向下看
    在这里插入图片描述
    看到199行这儿ucHeap所占空间太大,其实也就是用户堆栈空间太大,因此可以去FreeRTOSConfig.h里面修改。
    在这里插入图片描述
    整个RAM才20k,而total_heap_size就已经18k了,果然是他搞的鬼,把他调小一点,10*1024。
    此处应注意,调得太小会导致任务无法分得所需要的堆栈空间也无法运行,调得太大又没有足够的空间来创建任务,因此需要权衡。

    如果按照上面所述还是无法创建任务,就去tasks.c里面注暴力释掉这一句:

    //( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) 
    
    展开全文
  • 1. FreeRTOS任务创建 FreeRTOS有两种方式创建任务,动态方法和静态方法,他们的区别就是动态创建任务所使用到的堆栈由系统自动分配,而静态创建任务所使用到的堆栈则要由程序员自己指定了。 1.1 动态方法 FreeRTOS...

    1. FreeRTOS任务创建

    FreeRTOS有两种方式创建任务,动态方法和静态方法,他们的区别就是动态创建任务所使用到的堆栈由系统自动分配,而静态创建任务所使用到的堆栈则要由程序员自己指定了。

    1.1 动态方法

    FreeRTOS动态方法创建任务的API是xTaskCreate,其函数原型如下:

    /* 动态方法创建任务的API */
    BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,				// 任务函数
                            const char * const pcName,				// 任务名称
                            const uint16_t usStackDepth,			// 堆栈大小,实际大小为4 * usStackDepth
                            void * const pvParameters,				// 传递给任务函数的参数
                            UBaseType_t uxPriority,					// 任务优先级
                            TaskHandle_t * const pxCreatedTask 		// 任务句柄(可以理解为就是该任务本身)
                          );
    

    参数介绍

    1. xTaskCreate: 该参数就是指向用户任务函数的指针。任务函数也是一个C函数而已,只不过任务函数没有返回值,函数参数是一个void型指针,任务函数里面通常是一个死循环,里面执行着用户想要实现的任务功能。任务函数原型:void task_function( void *pvParameters )

    2. pcName: 任务名称。这个参数不会被 FreeRTOS 使用,其只是单纯地用于辅助调试。应用程序可以通过定义常量 config_MAX_TASK_NAME_LEN 来定义任务名的最大长度——包括’\0’结束符。如果传入的字符串长度超过了这个最大值,字符串将会自动被截断。

    3. usStackDepth: 我们创建的每个任务,他们都有唯一属于自己的任务堆栈空间。usStackDepth 值用于告诉内核为该任务分配多大的栈空间,单位是字节。实际分配的大小为:4 * usStackDepth 字节。

    4. pvParameters: 传递给任务函数的参数。

    5. uxPriority: 任务优先级,FreeRTOS中任务优先级的取值范围是: 0 ~ (configMAX_PRIORITIES – 1),取值越大说明优先级越高。

      其中,configMAX_PRIORITIES 这个宏是由用户定义的常量,FreeRTOS并没有规定优先级的上限,但是我们在使用的时候,最好定义一个自己实际需要的大小,这样可以避免浪费内存。

    6. pxCreatedTask: 任务句柄。这个句柄将在 API 调用中对该创建出来的任务进行引用, 比如改变任务优先级, 或者删除任务。如果应用程序中不会用到这个任务的句柄,则 pxCreatedTask 可以被设为 NULL。

    返回值

    该API有两个返回值:

    1. pdTRUE,表明任务创建成功。
    2. errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY,表明任务创建失败。一般任务创建失败都是由于内存不足造成的。

    1.2 静态方法

    静态方法创建任务,需要用户自己指定任务堆栈和任务控制块,静态方法创建任务会比动态方法更复杂一些。静态方法创建任务函数原型如下:

    /* 静态方法创建任务的API,创建成功函数返回该任务句柄 */
    TaskHandle_t xTaskCreateStatic(	TaskFunction_t pxTaskCode,			// 任务函数
    								const char * const pcName,			// 任务名称
    								const uint32_t ulStackDepth,		// 堆栈大小,由用户自己给出堆栈
    								void * const pvParameters,			// 传递给任务函数的参数
    								UBaseType_t uxPriority,				// 任务优先级
    								StackType_t * const puxStackBuffer,	// 任务堆栈
    								StaticTask_t * const pxTaskBuffer 	// 任务控制块
                                  );
    

    参数介绍(只介绍和动态方法不同的几个参数)

    1. usStackDepth: 任务堆栈大小,由于本函数是静态方法创建任务,所以任务堆栈由用户给出(一般是个用户定义一个数组),所以此参数就是这个数组的大小。
    2. puxStackBuffer: 任务堆栈,一般是用户定义的一个数组,数组类型要为StackType_t 类型。
    3. pxTaskBuffer: 任务控制块。

    返回值

    1. NULL: 表明任务创建失败,一般是 puxStackBuffer 或 pxTaskBuffer 用户定义的堆栈大小,任务控制块内存大小不足导致失败。

    2. 创建成功,返回该任务的任务句柄。

    2. FreeRTOS任务删除

    当我们觉得某个任务已经不需要时,FreeRTOS提供vTaskDelete()函数来删除任务自身或者其他任务,任务一旦被删除之后,相当于不存在了,后续也不可能进入运行态。

    如果删除的这个任务,是使用动态方法创建的,那么这个任务删除后,这个任务所用到的堆栈和任务控制块会被空闲任务自动回收。因此有一点很重要,那就是使用 vTaskDelete() 函数的任务千万不能把空闲任务的执行时间饿死,否则空闲任务得不到执行,那么被删除的任务内存也就回收不了了。

    另外,该任务的内存只有由内核自动分配的,才会由空闲任务自动回收。而那些由用户自己申请的内存,比如pvPortMalloc()申请的内存,在任务删除后,需要用户自己去释放这部分内存,内核是不会自动帮我们回收的。

    删除任务的函数原型如下:

    void vTaskDelete( xTaskHandle pxTaskToDelete );
    

    其中参数pxTaskToDelete为要删除的某个任务句柄,另外任务可以传入NULL来删除自身。

    3. FreeRTOS任务创建和删除代码示例

    我们来设计一个例子。

    1. 首先在main函数里创建优先级为1的任务1,当任务1运行的时候,以优先级2创建任务2。这时因为任务2的优先级最高,所以会马上得到执行。
    2. 任务2执行时,啥都不做,它只是把自己删除了(vTaskDelete传入NULL即可把自身删除)。
    3. 当任务2删除自身之后,任务1又成为了最高的优先级任务,任务1继续执行,这时需要调用vTaskDelay()函数来阻塞一小段时间,让空闲任务得以执行,从而回收被删除了的任务2的内存。
    4. 当任务1退出阻塞态后,再次成为就绪态中具有最高优先级的任务,因此会抢占空闲任务。任务1再次得以运行,如此往复下去。

    代码清单如下:

    #include <stdio.h>
    
    #include "bsp_usart.h"
    #include "FreeRTOS.h"
    #include "task.h"
    
    TaskHandle_t StartTask_Handler;			//task1任务句柄
    
    /* task2函数 */
    void task2(void *pvParameters)
    {	
    	for ( ; ; )
    	{
    		printf("task2 is running and about to delete itself\n");
    
    		vTaskDelete( NULL );		// 任务2把自己删除了
    	}
    }
    
    /* task1函数 */
    void task1(void *pvParameters)
    {	
    	for ( ; ; )
    	{
    		printf("task1 is running\n");
    
    		xTaskCreate( task2, "task2", 1000, NULL, 2, NULL );		// 创建任务2
    
    		vTaskDelay(1000);		// 延时1s,让空闲任务得以运行,从而回收被删除的任务2的内存
    	}
    }
    
    int main()
    {
    	USART_Config();		// 串口初始化
    
    	/* 创建任务1 */
        xTaskCreate((TaskFunction_t )task1,           	 	 //任务函数
                    (const char*    )"task1",          		 //任务名称
                    (uint16_t       )128,        			 //任务堆栈大小
                    (void*          )NULL,             		 //传递给任务函数的参数
                    (UBaseType_t    )1,       				 //任务优先级
                    (TaskHandle_t*  )StartTask_Handler);     //任务句柄
    				
        vTaskStartScheduler();          					 //开启任务调度
    }
    

    代码编译运行后,在串口助手上看到的运行结果如下:
    在这里插入图片描述
    和我们设计时分析的运行过程时一模一样的。为了更直观的了解这个例子的运行过程,可以看下面的任务运行的流程图:
    在这里插入图片描述

    展开全文
  • typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking ... //任务堆栈的栈顶指针,栈顶指针随着程序运行而移动 volatile StackType_t *pxTopOfStack; /*< Point...
  • 6.1 任务创建和删除API 函数FreeRTOS 最基本的功能就是任务管理,而任务管理最基本的操作就是创建和删除任务,FreeRTOS任务创建和删除API 函数如表6.1.1.1 所示:1、函数xTaxkCreate()此函数用来创建一个任务,...
  • FreeRTOS任务创建

    千次阅读 2017-09-10 18:43:17
    FreeRTOS 任务创建
  • FreeRTOS任务创建由函数xTaskCreate()完成。函数源码如下: BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const ...
  • FreeRTOS(14)---FreeRTOS 任务创建分析

    千次阅读 2018-10-11 19:17:19
    FreeRTOS 任务创建分析FreeRTOS 任务创建分析创建任务堆栈和任务TCB初始化任务TCB必要的字段初始化任务堆栈进入临界区当前任务数量增加1为第一次运行做必要的初始化更新当前正在运行的任务TCB指针将新创建的任务加入...
  • 普通任务创建及运行,参阅安富莱电子demo /* ********************************************************************************************************* * 函 数 名: vTaskTaskUserIF * 功能说明: 接口消息处理...
  • FreeRTOS高级篇2---FreeRTOS任务创建分析

    万次阅读 多人点赞 2016-05-03 13:31:08
    在FreeRTOS基础系列《FreeRTOS系列第10篇---FreeRTOS任务创建和删除》中介绍了任务创建API函数xTaskCreate(),我们这里先回顾一下这个函数的声明: BaseType_t xTaskCreate( TaskFunction_tp vTaskCode,
  • 关于FreeRTOS任务删除

    2019-12-01 10:31:06
    任务占用的内存由空闲任务来进行释放,故调用的任务删除函数的API要保证空闲函数能够被调用,以进行内存回收,另外,任务中有用户创建并占用的内存空间要由应用程序进行显式的释放。 任务删除API函数如下: void ...
  • FreeRTOS任务通知

    2021-02-01 21:27:09
    FreeRTOS任务通知 FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能,每个任务都有一个 32 位的通知值,在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组, 也可以替代长度为 1 的队列(可以保存一...
  • FreeRTOS 任务调度 任务创建

    千次阅读 2016-10-13 00:30:16
    任务创建 静态创建任务 动态创建任务 初始化任务控制块 栈初始化举例 插入就绪链表 参考 FreeRtos 简述FreeRTOS 的任务调度在 Source/include/task.c 中实现,包含了任务的创建、切换、挂起、延时和删除等所有功能...
  • 任务创建有两种方式分别为动态创建和静态创建,分别通过调用vTaskcreat()和vTaskcreat_static()来创建。其区别是动态创建任务的堆栈由系统分配,而静态创建任务的堆栈由用户自己传递。    ...
  • FreeRTOS任务创建删除

    2017-12-12 17:53:00
    FreeRTOS 当前使用的api 接口为 xTaskCreate() xTaskCreateRestricted() xTaskCreateStatic() vTaskDelete() xTaskCreate() 函数原型 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,   ...
  • 174_FreeRTOS任务删除

    2019-11-30 10:05:01
    不知道是不是我工作比较特殊的原因,在我的工作经历中几乎没有什么... 任务开始只创建了一个Task1,优先级是1。之后,OS的调度器启动。 在Task1中,打印一个字符串同时创建Task2,优先级是2,之后延迟100ms。...
  • 这一节来分析一下FreeRTOS动态创建任务FreeRTOS创建任务常用的有两种方式,一种是静态方式,一种是动态方式,静态创建方式需要用户自己提供任务堆栈,动态创建用户只需提供堆栈大小,堆栈由内核来分配,大多数应用...
  • 1、时间片调度没有打开 ...2、中断函数中定义了,SVC_Handler,PendSV_Handler,SysTick_Handler 三个中断,导致FreeRTOS中的 port.c 文件中的任务调度函数无法执行,任务无法切换。 解决方案: ..
  • FreeRTOS任务简介

    2021-05-29 00:37:45
    一、FreeRTOS用途FreeRTOS一般被用于硬件设计上RAM大小存在一定限制(成本、资源、性能功耗比等)的平台之中,它是目前运用的比较多的实时操作系统之一。选用FreeRTOS作为项...
  • FreeRTOS任务调度启动流程PrefacePreviewAttentionFreeRTos目录结构解释FreeRTos任务调度一、vTaskStartScheduler函数中需要注意的细节二、xPortStartScheduler函数中需要注意的细节三、prvStartFirstTask函数中需要...
  • 本文主要介绍FreeRTOS创建任务函数 xTaskCreate() 的函数原型及如何使用 xTaskCreate() 创建任务。 一、xTaskCreate() API 函数 这是我们接触到的第一个FreeRTOS函数,可能也是所有API函数中最复杂的一个,但必须...
  • FreeRTOS 任务调度 任务切换

    万次阅读 2016-10-15 17:07:34
    FreeRtos 简述前面文章 < FreeRTOS 任务调度 任务创建 > 介绍了 FreeRTOS 中如何创建任务以及其具体实现。 一般来说, 我们会在程序开始先创建若干个任务, 而此时任务调度器还没又开始运行,因此每一次任务创建后...
  • 任务创建和删除
  • 在前面几篇文章我们已经对FreeRTOS任务API和任务调度原理进行了相对深入的分析 这篇文章主要针对任务与任务之间的交互,信息传递相关的API组件进行分析 一、任务通知 简单用官方的话介绍一下: FreeRTOS 的每个...
  • FreeRTOS任务栈设置 不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要。 局部变量,函数调用时的现场保护和返 回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃...
  • FreeRTOS调度器是唯一可以切换任务状态的实体。 非运行态 阻塞态 等待事件的任务处于阻塞态,任务会因等待两种不同的事件进入阻塞态 时间相关事件-此类事件要么是一个延时的相对时间,要么是一个

空空如也

空空如也

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

freertos任务创建失败