1.任务相关的API函数

函数存在于task.c中,主要的函数有:

  • xTaskCreate():使用动态的方法创建一个任务;
  • xTaskCreatStatic():使用静态的方法创建一个任务(用的非常少);
  • xTaskCreateRestricted():创建一个使用MPU进行限制的任务;
  • vTaskDelete():删除一个任务;
  • vTaskSuspend():挂起一个任务;
  • vTaskResume():恢复一个任务的运行;
  • vTaskResumeFromISR():中断服务函数中恢复一个任务的运行;
  • portENABLE_INTERRUPTS():打开FreeRTOS中断;
  • portDISABLE_INTERRUPTS():关闭freeRTOS中断;

2.动态创建任务

  • xTaskCreate()函数原型:

     BaseType_t xTaskCreate(TaskFunction_t pvTaskCode,const char * const pcName,uint16_t usStackDepth,void *pvParameters,UBaseType_t uxPriority,TaskHandle_t *pvCreatedTask);

  • 动态创建任务:使用前先判断 #if( configSUPPORT_STATIC_ALLOCATION == 1 ) 是否成立,如果不成立需要在FreeRTOSConfig.h 文件中添加;
    #include "FreeRTOS.h"
    #include "task.h"//start_task 任务
    void start_task(void *pvParameters);       // 任务函数
    #define start_task_zise 50                // 任务堆栈的大小
    #define start_task_prio 1                // 任务优先级
    TaskHandle_t start_task_handler;        // 任务句柄//led1_task 任务
    void led1_task(void *pvParameters);        // 任务函数
    #define led1_task_zise 50                // 任务堆栈的大小
    #define led1_task_prio 2                // 任务优先级
    TaskHandle_t led1_task_handler;        // 任务句柄
    int main(void)
    {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init(115200);delay_init();LED_Init();// 创建一个任务 xTaskCreate(任务函数, 任务名, 任务堆栈的大小, 传递给任务函数的参数, 任务优先级, 任务句柄);xTaskCreate( start_task, "start_stask", start_task_zise, NULL, start_task_prio, &start_task_handler);    vTaskStartScheduler();        // 开启任务调度return 0;
    }void start_task( void * pvParameters )
    {taskENTER_CRITICAL();    // 创建临界区// 创建led1任务xTaskCreate(led1_task, "led1_task", start_task_zise, NULL, led1_task_prio, &led1_task_handler);
       vTaskDelete(start_task_handler); //删除开始任务taskEXIT_CRITICAL();    // 退出临界区
    }
    //LED1任务函数
    void led1_task( void * pvParameters )
    {for( ;; ){LED0 = ~LED0;vTaskDelay(1000);}
    }

3.静态创建任务

  • xTaskCreatStatic()函数原型:

    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 ) 

  • 静态创建任务:使用前先判断 #if( configSUPPORT_STATIC_ALLOCATION== 1 ) 是否成立,如果不成立需要在FreeRTOSConfig.h 文件中添加;
  • 在FreeRTOSConfig.h 文件中添加中添加宏后,编译报错:
    .\Objects\freeRTOS_sCreate_task.axf: Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory(referred from tasks.o).
    .\Objects\freeRTOS_sCreate_task.axf: Error: L6218E: Undefined symbol vApplicationGetTimerTaskMemory (referred from timers.o).

  • 由于把静态创建的宏给打开了,所以这两个数需要我们自己去实现
    // 空闲任务
    static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
    static StaticTask_t IdleTaskTCB;
    // 定时器任务
    static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
    static StaticTask_t TimerTaskTCB;// 空闲任务所需内存
    void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
    {*ppxIdleTaskTCBBuffer = &IdleTaskTCB;*ppxIdleTaskStackBuffer = IdleTaskStack;*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
    }
    // 定时器任务所需内存
    void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize )
    {*ppxTimerTaskTCBBuffer = &TimerTaskTCB;*ppxTimerTaskStackBuffer = TimerTaskStack;*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
    }

  • 静态创建任务
    //start_task 任务
    void start_task(void *pvParameters);    // 任务函数
    #define start_task_zise 50                // 任务堆栈的大小
    #define start_task_prio 1                // 任务优先级
    StackType_t start_task_stack[start_task_zise];    // 任务控制块大小
    StaticTask_t start_task_TCB;            // 任务堆栈大小
    TaskHandle_t start_task_handler;        // 任务句柄//led1_task 任务
    void led1_task(void *pvParameters);        // 任务函数
    #define led1_task_zise 50                // 任务堆栈的大小
    #define led1_task_prio 2                // 任务优先级
    StackType_t led1_task_stack[start_task_zise];    // 任务控制块大小
    StaticTask_t led1_task_TCB;                // 任务堆栈大小
    TaskHandle_t led1_task_handler;            // 任务句柄//led2_task 任务
    void led2_task(void *pvParameters);        // 任务函数
    #define led2_task_zise 50                // 任务堆栈的大小
    #define led2_task_prio 3                // 任务优先级
    StackType_t led2_task_stack[start_task_zise];    // 任务控制块大小
    StaticTask_t led2_task_TCB;                // 任务堆栈大小
    TaskHandle_t led2_task_handler;            // 任务句柄int main(void)
    {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init(115200);delay_init();LED_Init();// 创建一个开始任务start_task_handler = xTaskCreateStatic( (TaskFunction_t    )start_task,(char              *)"start_task",(uint32_t         )start_task_zise,(void *            )NULL,(UBaseType_t    )start_task_prio,(StackType_t *    )start_task_stack,    // 任务控制块大小(StaticTask_t *    )&start_task_TCB );    // 任务堆栈大小
    vTaskStartScheduler();        // 开启任务调度return 0;
    }void start_task( void * pvParameters )
    {led1_task_handler = xTaskCreateStatic( (TaskFunction_t    )led1_task,(char              *)"led1_task",(uint32_t         )led1_task_zise,(void *            )NULL,(UBaseType_t    )led1_task_prio,(StackType_t *    )led1_task_stack,    // 任务控制块大小(StaticTask_t *    )&led1_task_TCB );    // 任务堆栈大小
                                                led2_task_handler = xTaskCreateStatic( (TaskFunction_t    )led2_task,(char              *)"led2_task",(uint32_t         )led2_task_zise,(void *            )NULL,(UBaseType_t    )led2_task_prio,(StackType_t *    )led2_task_stack,    // 任务控制块大小(StaticTask_t *    )&led2_task_TCB );    // 任务堆栈大小
        vTaskDelete(start_task_handler);
    }
    void led1_task( void * pvParameters )
    {for( ;; ){LED0 = ~LED0;vTaskDelay(200);}
    }
    void led2_task( void * pvParameters )
    {for( ;; ){LED1 = ~LED1;vTaskDelay(1000);}
    }

4.删除任务

  • void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;

5.任务挂起

  • void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION;

6.任务恢复

  • void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;
  • 挂起、恢复代码如下:
    //key_task 任务
    void key_task(void *pvParameters);        // 任务函数
    #define key_task_zise 50                // 任务堆栈的大小
    #define key_task_prio 4                // 任务优先级
    TaskHandle_t key_task_handler;            // 任务句柄void start_task( void * pvParameters )
    {taskENTER_CRITICAL();    // 创建临界区// 创建按键检查任务
        xTaskCreate((TaskFunction_t    )key_task,(const char *     )"key_task",(uint16_t        )key_task_zise,(void *            )NULL,(UBaseType_t    )key_task_prio,(TaskHandle_t * )&key_task_handler);......vTaskDelete(start_task_handler); //删除开始任务taskEXIT_CRITICAL();    // 退出临界区
    }//key任务函数
    void key_task( void * pvParameters )
    {char key;for( ;; ){key = KEY_Scan(0);switch(key){case KEY0_PRES:vTaskSuspend(led1_task_handler);printf("led1_task Suspended.\n");break;case KEY1_PRES:vTaskResume(led1_task_handler);printf("led1_task Resumed.\n");break;case KEY2_PRES:vTaskSuspend(led2_task_handler);printf("led2_task Suspended.\n");break;case WKUP_PRES:vTaskResume(led2_task_handler);printf("led2_task Resumed.\n");break;}vTaskDelay(10);            //延时10ms
        }
    }

7.FreeRTOS开关中断

  • freeRTOS管理的中断优先级为 5~15,这是在freeRTOSConfig.h中设置的。

    #ifdef __NVIC_PRIO_BITS#define configPRIO_BITS               __NVIC_PRIO_BITS
    #else#define configPRIO_BITS               4
    #endif#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY            15                      //中断最低优先级
    #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5                       //系统可管理的最高中断优先级
    #define configKERNEL_INTERRUPT_PRIORITY         ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
    #define configMAX_SYSCALL_INTERRUPT_PRIORITY     ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) 

  • 设置好宏后,低于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断可以安全的调用FreeRTOS的API函数(xxFromISR()函数);
  • 高于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断不能被FreeRTOS禁止,中断服务函数也不能调用FreeRTOS的API函数。
  • 由于高于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY的优先级不会被FreeRTOS内核屏蔽,因此那些对实时性要求严格的任务可以使用这些优先级(0~4),比如四轴飞行器中的避障检测;
    //start_task 任务
    void start_task(void *pvParameters);    // 任务函数
    #define start_task_zise 50                // 任务堆栈的大小
    #define start_task_prio 1                // 任务优先级
    TaskHandle_t start_task_handler;        // 任务句柄//interrupt_task 任务
    void interrupt_task(void *pvParameters);        // 任务函数
    #define interrupt_task_zise 50                // 任务堆栈的大小
    #define interrupt_task_prio 2                // 任务优先级
    TaskHandle_t interrupt_task_handler;            // 任务句柄int main(void)
    {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init(115200);delay_init();LED_Init();TIM3_Int_Init(10000-1,7200-1);    //设置定时器3的抢占优先级为 4TIM5_Int_Init(10000-1,7200-1);    //设置定时器5的抢占优先级为 5// 创建一个任务xTaskCreate((TaskFunction_t    )start_task,            // 任务函数    (const char *     )"start_stask",            // 任务名    (uint16_t        )start_task_zise,        // 任务堆栈的大小(void *            )NULL,                    // 传递给任务函数的参数(UBaseType_t    )start_task_prio,        // 任务优先级(TaskHandle_t * )&start_task_handler);    // 任务句柄
        vTaskStartScheduler();        // 开启任务调度return 0;
    }void start_task( void * pvParameters )
    {taskENTER_CRITICAL();    // 创建临界区// 创建led1任务
        xTaskCreate((TaskFunction_t    )interrupt_task,(const char *     )"interrupt_task",(uint16_t        )interrupt_task_zise,(void *            )NULL,(UBaseType_t    )interrupt_task_prio,(TaskHandle_t * )&interrupt_task_handler);// 创建led2任务
    vTaskDelete(start_task_handler); //删除开始任务taskEXIT_CRITICAL();    // 退出临界区
    }
    //interrupt任务函数
    void interrupt_task( void * pvParameters )
    {int i = 0;for( ;; ){if(i == 5){printf("关闭中断!!!.\n");portDISABLE_INTERRUPTS();delay_xms(5000);            // delay_xms执行的时候不会执行任何任务调度printf("开中断!!!.\n");portENABLE_INTERRUPTS();}printf("interrupt task is %d runing.\n", i);LED0 = ~LED0;vTaskDelay(1000);i++;}
    }

8.临界段

  • 临界段是指:那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。FreeRTOS在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。
  • FreeRTOS中与临界段有关的函数有4个,定义于task.h中:
    #define taskENTER_CRITICAL()        portENTER_CRITICAL()
    #define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()#define taskEXIT_CRITICAL()            portEXIT_CRITICAL()
    #define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )

  • taskENTER_CRITICAL():进入任务级的临界区;  
  • taskEXIT_CRITICAL():退出任务级的临界区;
    void start_task( void * pvParameters )
    {taskENTER_CRITICAL();    // 进入临界区// 创建led1任务
        xTaskCreate((TaskFunction_t    )interrupt_task,(const char *     )"interrupt_task",(uint16_t        )interrupt_task_zise,(void *            )NULL,(UBaseType_t    )interrupt_task_prio,(TaskHandle_t * )&interrupt_task_handler);// 创建led2任务
    vTaskDelete(start_task_handler); //删除开始任务taskEXIT_CRITICAL();    // 退出临界区
    }

  • taskEXIT_CRITICAL_FROM_ISR():进入中断级临界区;
  • taskENTER_CRITICAL_FROM_ISR():退出中断级临界区;
    //定时器3中断服务程序
    void TIM3_IRQHandler(void)   //TIM3中断
    {int status_value;if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)      //检查TIM3更新中断发生与否
            {status_value = taskENTER_CRITICAL_FROM_ISR();    //进入临界区printf("定时器3发生中断.\n");LED1=!LED1;TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );    //清除TIMx更新中断标志     taskEXIT_CRITICAL_FROM_ISR(status_value);    //退出临界区
            }
    }//定时器3中断服务程序
    void TIM5_IRQHandler(void)   //TIM3中断
    {int status_value;if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)      //检查TIM5更新中断发生与否
            {    status_value = taskENTER_CRITICAL_FROM_ISR();    //进入临界区printf("定时器5发生中断.\n");LED1=!LED1;TIM_ClearITPendingBit(TIM5, TIM_IT_Update  );    //清除TIMx更新中断标志 taskEXIT_CRITICAL_FROM_ISR(status_value);    //退出临界区
            }
    }

转载于:https://www.cnblogs.com/icefree/p/8684859.html

2、FreeRTOS任务相关API函数相关推荐

  1. FreeRTOS学习笔记【六】——FreeRTOS 任务相关 API 函数

    上一章我们学习了 FreeRTOS 的任务基础知识,本章就正式学习如何使用 FreeRTOS 中有关任务的 API 函数.本来本章想讲解 FreeRTOS 的任务原理知识的,但是很多初学者还没使用过 ...

  2. 【STM32】FreeRTOS 任务相关 API 函数

    文章目录 1 任务创建和删除 API 函数 2 任务创建和删除实验(动态方法) 3 任务创建和删除实验(静态方法) 4 任务挂起和恢复 API 函数 5 任务挂起和恢复实验 1 任务创建和删除 API ...

  3. FreeRTOS任务相关API函数---查询/改变某个任务的优先级+获取全部/某个任务状态信息

    本文是<ALIENTEK STM32F429 FreeRTOS 开发教程>第十一章学习笔记 第一章笔记–FreeRTOS简介与源码下载 第二章笔记–FreeRTOS在STM32F4上移植 ...

  4. 【STM32】FreeRTOS 其他任务 API 函数

    文章目录 任务相关 API 函数预览 任务相关 API 函数预览 函数 描述 uxTaskPriorityGet() 查询某个任务的优先级. vTaskPrioritySet() 改变某个任务的任务优 ...

  5. 嵌入式FreeRTOS系统,在中断中调用FreeRTOS系统的API函数

    作为在中断中调用FreeRTOS系统的API函数的参考,disp_str()是显示屏的显示函数会将传入的字符串进行显示. void TIM5_Int_Init(u16 arr,u16 psc) {TI ...

  6. 【STM32】FreeRTOS任务相关API

    00. 目录 文章目录 00. 目录 01. 概述 02. xTaskCreate()函数 03. xTaskCreateStatic()函数 04. xTaskCreateRestricted()函 ...

  7. 剪贴板所有api函数

    编写剪贴板相关程序是收集的相关API函数. (一)ChangeClipboardChain 将剪贴的连接从一个句柄转到下一个句柄. BOOL ChangeClipboardChain( HWND hW ...

  8. 基于API函数的串口通信(方法讲解)

    用到的串口通信编程方法有:使用通信控件.在高级语言中嵌入汇编以及使用API函数.在这几种方法中,使用API函数编写的串口通信程序最为高效.灵活.串口通信编程将用到三种API函数 --串口通信相关API ...

  9. AirSim(五)---理解篇: Airsim世界坐标系、NED坐标系、机体坐标系以及控制相关API接口函数

    目录 1. 坐标系 coordinate system (1) AirSim API的坐标系:NED 坐标系 with SI unit (2) Unreal Engine的坐标系 (3)AirSim全 ...

最新文章

  1. [转] fedora linux下安装vmware tools的最好方法
  2. 【数据竞赛】从0梳理1场数据挖掘赛事!
  3. 解决纵向滚屏导致的轮播图异常
  4. 用计算机模仿真实系统的技术叫,计算机模拟技术.pdf
  5. python常用函数使用
  6. java 1.4 下载_j2sdk1.4.2
  7. ansible 建 kubernetes 证书签名请求_Kubernetes 两步验证 - 使用 Serverless 实现动态准入控制
  8. matlab多重分形广义函数谱,多重广义分形维数计算 - 程序语言 - DelphiPascal - 小木虫论坛-学术科研互动平台...
  9. 【C++】gflags的使用
  10. 真实经历!运维安全工程师经典面试汇总
  11. 64位计算机可以安装32位软件,【64位可以安装32位系统】64位安装32位的软件_64位系统改装32位系统...
  12. 没有水印的夸克免费扫描
  13. python曲线拟合为什么会失败_SciPy曲线拟合失败幂定律 - python
  14. C# 连接数据库,查询数据
  15. 正则表达式匹配任意字符串
  16. vw css什么单位,CSS vw单位
  17. Python爬取磁力链信息
  18. TensorFlow2 入门指南 | 04 分类问题实战之手写数字识别
  19. 计算机键盘上的星号代表,电脑上星号怎么打(键盘p打出来是星号)
  20. nextTick 使用场景

热门文章

  1. 自动化测试报告 html模板,PyTestReport 自动化测试报告框架
  2. 查询a表有但是b表没有的数据_牛逼!一个上亿数据的报表竟然能做到秒查~
  3. 与通用计算机相比 单片机具体有哪些特点,嵌入式系统-复习大纲_彭荣
  4. linux 爬虫工具,技术|如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
  5. mysql双主数据一致性_mysql双主复制的主备数据一致性知多少
  6. python sizeof函数_C++ sizeof 运算符 | 菜鸟教程
  7. NIO详解(五):Buffer详解
  8. 计算机网络期中考察方案,计算机网络期中考试题 b卷_ans.docx
  9. pageoffice网页提示未安装_Adobe Photoshop CC 2019 详细图文安装教程
  10. Win2008 r2 下修改mysql data目录的方法