精华内容
下载资源
问答
  • FreeRTOS创建任务

    2019-02-14 23:37:00
    创建任务的函数如下: 第一个参数是:任务函数指针,即任务函数名。  敲黑板:创建任务和任务函数是两码事,一定要分清楚; 第二个参数是:这个参数不被FREE RTOS调用,就是辅助调试用的; 第三个参数是:为...

    创建任务的函数如下:

    第一个参数是:任务函数指针,即任务函数名。

      敲黑板:创建任务和任务函数是两码事,一定要分清楚;

    第二个参数是:这个参数不被FREE RTOS调用,就是辅助调试用的;

    第三个参数是:为任务创建栈空间的大小,单位是字(不是byte),这个值自己大约给一个自己认为合理的值就可以了;

    第四个参数是:出入任务函数的参数,可以设置为NULL,如果没有参数传入的话;

    第五个参数是:制定任务的优先级;

    第六个参数是:句柄,不需要时可以设置为NULL;

     

    转载于:https://www.cnblogs.com/braveheart007/p/10381321.html

    展开全文
  • FreeRTOS创建任务(2)

    2021-10-18 16:49:08
    FreeRTOS最基本的功能就是任务管理,而任务管理最基本的操作就是创建和删除任务FreeRTOS任务创建和删除API函数如下表所示: 函数 描述 xTaskCreate() 使用动态的方法创建一个任务 xTaskCreateStatic()...

    一、FreeRTOS任务相关API函数

    1、任务创建和删除API函数
    FreeRTOS最基本的功能就是任务管理,而任务管理最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如下表所示:

    函数描述
    xTaskCreate()使用动态的方法创建一个任务
    xTaskCreateStatic()使用静态的方法创建一个任务
    xTaskCrearteRestricted()创建一个使用MPU进行限制的任务,相关内存使用动态内存分配
    vTaskDelete()删除一个任务

    1. 函数xTaskCreate()
    此函数用来创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。如果使用函数xTaskCreate()来创建任务的话,那么这些所需的RAM就会自动的从FreeRTOS的堆中分配,因此必须提供内存管理文件,默认我们使用
    heap_4.c这个内存管理文件,
    而且宏configSUPPORT_DYNAMIC_ALLOCATION必须为1。如
    使用函数xTaskCreateStatic()创建的话这些RAM就需要用户来提供了。新创建的任务默认就是就绪态的,如果当前没有比它更高优先级的任务运行,那么此任务就会立即进入运行态开始运行,不管在任务调度器启动前还是启动后,都可以创建任务。函数原型如下:

    BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,
    						const char * const pcName,
    						const uint16_t usStackDepth,
    						void * const pvParameters,
    						UBaseType_t uxPriority,
    						TaskHandle_t * const pxCreatedTask ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
    

    参数:

    参数描述
    pxTaskCode任务函数
    pcName任务名字,一般用于追踪和调试,任务名字长度不能超过configMAX_TASK_NAME_LEN
    usStackDepth任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE
    pvParameters传递给任务函数的参数
    uxPriotiry任务优先级,范围0~configMAX_PRIORITIES-1
    pxCreatedTask任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其他API函数可能会使用到这个句柄
    BaseType_t返回值 pdPASS:创建成功,其他为不成功

    2. 函数xTaskCreateStatic()
    此函数和xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的RAM需要用用户来提供。如果要使用此函数的话需要将宏
    configSUPPORT STATIC ALLOCATION 定义为1。函数原型如下:

    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 ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
    

    参数:

    参数描述
    pxTaskCode任务函数
    pcName任务名字,一般用于追踪和调试,任务名字长度不能超过configMAX_TASK_NAME_LEN
    usStackDepth任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE
    pvParameters传递给任务函数的参数
    uxPriotiry任务优先级,范围0~configMAX_PRIORITIES-1
    puxStackBuffer任务堆栈,一般为数组,数组类型要定义为StackType_t类型
    pxTaskBuffer任务控制块
    TaskHandle_t返回值,NULL为任务创建失败,其他值,任务创建成功,返回任务的任务句柄

    3、函数xTaskCreateRestricted()
    此函数也是用来创建任务的,只不过此函数要求所使用的MCU有MPU(内存保护单元),用此函数创建的任务会受到MPU的保护。其他的功能和函数xTaxkCreate()一样。函数原型:

    BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )
    
    参数描述
    pxTaskDefinition指向一个结构体TaskParameters_t,这个结构体描述了任务的任务函数、堆栈大小、优先级等,在task.h文件有定义
    pxCreatedTask任务句柄
    BaseType_t返回值 pdPASS:任务创建成功,其他值:任务创建失败

    4、函数vTaskDelete()
    删除一个用函数xTaskCreate()或者xTaskCreateStatic()创建的任务,被删除了的任务不再存在,也就是说再也不会进入运行态。任务被删除以后就不能再使用此任务的句柄!如果此任务是使用动态方法创建的,也就是使用函数xTaskCreate()创建的,那么在此任务被删除以后此任务之前申请的堆栈和控制块内存会在空闲任务中被释放掉,因此当调用函数vTaskDelete()删除任务以后必须给空闲任务一定的运行时间。只有那些由内核分配给任务的内存才会在任务被删除以后自动的释放掉,用户分配给任务的内存需要用户自行释放掉,比如某个任务中用户调用函数pvPortMalloc()分配了500字节的内存,那么在此任务被删除以后用户也必须调用函数vPortFree()将这500字节的内存释放掉,否则会导致内存泄露。此函数原型如下:

    vTaskDelete(TaskHandle_t xTaskToDelete)
    
    参数描述
    xTaskToDelete要删除的任务的任务句柄

    二、任务创建和删除的代码展示

    #include "sys.h"
    #include "delay.h"
    #include "usart.h"
    #include "led.h"
    #include "FreeRTOS.h"
    #include "task.h"
    #include "lcd.h"
    
    
    //任务优先级
    #define START_TASK_PRIO		1
    //任务堆栈大小	
    #define START_STK_SIZE 		128  
    //任务句柄
    TaskHandle_t StartTask_Handler;
    //任务函数
    void start_task(void *pvParameters);
    
    //任务优先级
    #define LED_TASK_PRIO		2
    //任务堆栈大小	
    #define LED_STK_SIZE 		128  
    //任务句柄
    TaskHandle_t LEDTask_Handler;
    //任务函数
    void led_task(void *pvParameters);
    
    //任务优先级
    #define LCD_TASK_PRIO		3
    //任务堆栈大小	
    #define LCD_STK_SIZE 		128  
    //任务句柄
    TaskHandle_t LCDTask_Handler;
    //任务函数
    void lcd_task(void *pvParameters);
    
    //LCD刷屏使用的颜色
    int lcd_discolor[14] = {  WHITE,BLACK,BLUE,BRED,
    													GRED,GBLUE,RED,MAGENTA,
    													GREEN,CYAN,YELLOW,BROWN,
    													BRRED,GRAY };
    
    int main(void)
    { 
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
    	delay_init(168);		//初始化延时函数
    	uart_init(115200);     	//初始化串口
    	LED_Init();		        //初始化LED端口
    	LCD_Init();
    	POINT_COLOR = RED;
    	LCD_ShowString(30,10,200,16,16,"LIU YI NIU BI");
    	LCD_ShowString(30,40,200,16,16,"2021/10/18");
    	//创建开始任务
        xTaskCreate((TaskFunction_t )start_task,            //任务函数
                    (const char*    )"start_task",          //任务名称
                    (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                    (void*          )NULL,                  //传递给任务函数的参数
                    (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                    (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
        vTaskStartScheduler();          //开启任务调度
    }
     
    //开始任务任务函数
    void start_task(void *pvParameters)
    {
        taskENTER_CRITICAL();           //进入临界区
        //创建LED0任务
        xTaskCreate((TaskFunction_t )led_task,     	
                    (const char*    )"led_task",   	
                    (uint16_t       )LED_STK_SIZE, 
                    (void*          )NULL,				
                    (UBaseType_t    )LED_TASK_PRIO,	
                    (TaskHandle_t*  )&LEDTask_Handler);   
        //创建LED1任务
        xTaskCreate((TaskFunction_t )lcd_task,     
                    (const char*    )"lcd_task",   
                    (uint16_t       )LCD_STK_SIZE, 
                    (void*          )NULL,
                    (UBaseType_t    )LCD_TASK_PRIO,
                    (TaskHandle_t*  )&LCDTask_Handler);        
        vTaskDelete(StartTask_Handler); //删除开始任务
        taskEXIT_CRITICAL();            //退出临界区
    }
    
    //LED任务函数 
    void led_task(void *pvParameters)
    {
        u8 led_num = 0;
    		POINT_COLOR = BLACK;
    		LCD_DrawRectangle(5,110,115,314);
    		LCD_DrawLine(5,130,115,130);
    		POINT_COLOR=BLUE;
    		LCD_ShowString(6,111,110,16,16,"led run:000");
    		while(1)
        {
    				led_num++;
            LED0=~LED0;
    				LCD_Fill(6,131,114,313,lcd_discolor[led_num % 14]);
    				LCD_ShowxNum(86,111,led_num,3,16,0x80);
            vTaskDelay(1000);
        }
    }   
    
    //LCD任务函数
    void lcd_task(void *pvParameters)
    {
    		u8 lcd_num = 0;
    		POINT_COLOR=BLACK;
    		LCD_DrawRectangle(125,110,234,314);
    		LCD_DrawLine(125,130,234,130);
    		POINT_COLOR= BLUE;
    		LCD_ShowString(126,111,110,16,16,"lcd run:000");
        while(1)
        {
            lcd_num++;
    				LED1=!LED1;
    //        vTaskDelay(200);
    				LCD_ShowxNum(206,111,lcd_num,3,16,0x80);
    				LCD_Fill(126,131,233,313,lcd_discolor[13-lcd_num%14]);
            vTaskDelay(1000);
        }
    }
    

    FreeRTOS创建任务就讲解到这里啦!!!感谢大家游览!!!希望大家多多点赞!!!谢谢啦!!!

    展开全文
  • FreeRTOS创建任务分析

    2020-08-25 21:46:04
    prvAddNewTaskToReadyList添加新创建任务到就绪列表中 prvInitialiseNewTask 初始化堆栈内容都为0xA5(条件编译) 获取栈顶,保存在pxTopOfStack pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint...

    xTaskCreate

    1. 申请任务堆栈内存,保存到pxNewTCB->pxStack
    2. 申请任务控制块内存
    3. prvInitialiseNewTask初始化任务
    4. prvAddNewTaskToReadyList添加新创建任务到就绪列表中

    prvInitialiseNewTask

    1. 初始化堆栈内容都为0xA5(条件编译)
    2. 获取栈顶,保存在pxTopOfStack pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );
    3. 保存任务名称到任务控制块的名称数组中,最长configMAX_TASK_NAME_LEN
    4. 保存任务优先级到pxNewTCB->uxPriority,如果大于等于configMAX_PRIORITIES,则保存configMAX_PRIORITIES-1
    5. 初始化2个列表项pxNewTCB->xStateListItem、xNewTCB->xEventListItem
    6. 初始化各种任务控制块的成员变量
    7. 调用pxPortInitialiseStack,初始化堆栈
    8. 保存任务句柄,*pxCreatedTask = ( TaskHandle_t ) pxNewTCB;

    prvAddNewTaskToReadyList( pxNewTCB )

    1. uxCurrentNumberOfTasks++;
    2. 如果创建的是第一个任务,初始化相关列表prvInitialiseTaskLists()
    3. 调用prvAddTaskToReadyList,将新创建的任务添加到就绪列表中
    4. 如果新创建的任务比当前任务优先级高,那么调用taskYIELD_IF_USING_PREEMPTION(),进行任务切换

    prvAddTaskToReadyList( pxNewTCB )

    1. 将uxTopReadyPriority相应bit置1(硬件方法),表示相应优先级有就绪任务
    2. 将新创建的任务添加到对应的就绪列表中,末尾插入。比如优先级3,插入到pxReadyTasksLists[3]中。
    展开全文
  • typedef struct ...指向任务栈的栈顶 ListItem_t xStateListItem; //任务结点 StackType_t *pxStack; //任务栈起始地址 char pcTaskName[ configMAX_TASK_NAME_LEN ]; //任务名称 } tskTCB;
  • FreeRTOS 创建任务失败原因

    千次阅读 2019-10-21 09:35:40
    (我的环境是: 我在移植开源库时里面的是 Heap_3 但是 我...创建 任务原因 /*Allocate space for the stack used by the task being created. */ pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStac...

    (我的环境是:
    我在移植开源库时里面的是 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为多段不连续存储空间的集合

    展开全文
  • 我发觉不管是单片机运行C程序前还是freertos创建任务前,都需要先创建堆栈。 STM32的启动代码里面就是有弄堆栈创建初始化的嘛。
  • 上面已经基于 STM32 F407创建好了 FreeRTOS 的工程模板,这章开始我们将真正进入如何使用 FreeRTOS 的征程,先从最简单的创建任务开始,点亮一个LED,以慰藉下尔等初学者弱小的心灵。 由于前面已经讲过了,所以这里...
  • FreeRTOS创建任务(1)

    2021-10-18 09:06:44
    一、任务基础知识 在STM32F4中以前的单片机裸机(未使用系统)的时候一般都是在mai函数中用循环来处理所有事物,循环调用相应的函数完成事物的处理。
  • 方法一: 方法二: 推荐第二种方法
  • ESP32 Arduino FreeRTOS创建任务双核运行

    千次阅读 2019-11-05 16:51:04
    This version of FreeRTOS has been modified by Espressif to be SMP-aware. The API is similar to the original FreeRTOS API, with the following changes: - The xTaskCreate() function ...
  • 在stm32f103zet6环境中移植成功freertos之后,创建第一个任务之后,会进入硬件中断,经过排查发现死在了prvStartFirstTask() 排查原因: 发现是启动文件startup_stm32f10x_hd.s中发生了错误 修改前: 修改后: ...

空空如也

空空如也

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

freertos创建任务