你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F407的FreeRTOS任务的创建与删除经验分享(2)

[复制链接]
攻城狮Melo 发布时间:2023-10-19 15:54

微信图片_20231019155406.png

官方的API手册中有这些函数,xTaskCreate和xTaskCreateStatic分别是利用动态方法和静态方法创建任务。(动态和静态的区别之后再研究)vTaskDelete是删除任务,因为freeRTOS的任务内存空间存储在堆区,所以很像C语言的动态内存分配,任务使用和结束我们都应该创建和删除这些任务防止占用过多空间。

xTaskCreate的函数模型如下,参数内容总共有六项:任务函数的函数指针,任务函数的名称,任务函数所需堆栈空间,任务函数的类型,任务函数的优先级,以及任务函数的函数句柄
微信图片_20231019155403.png

vTaskDelete的函数模型如下,参数内容为函数句柄,如果为NULL则删除该任务本身。

微信图片_20231019155400.png

因此我们创建任务的步骤是:首先定义一个启动任务,该任务是为了启动我们的真正任务,因此在调用完一遍后要用vTaskDelete 中输入NULL删除启动函数本身。
微信图片_20231019155357.png

任务函数编写
  1. /*
  2. LED1翻转
  3. */
  4. void LED_TOG(void * pvParameters)//参数为 void * pvParameters
  5. {
  6.   while(1)
  7.   {
  8.     printf("LED_TOG running\r\n");//串口打印运行信息
  9.     HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);//LED1翻转
  10.     vTaskDelay(500);//延迟500ms
  11.   }
  12. }
复制代码


要注意的是vTaskDelay是FreeRTOS用来延时的函数。


微信图片_20231019155354.png

之后我们要创建任务函数的启动函数

  1. TaskHandle_t Start_LED_Handler;

  2. void Start_LED(void * pvParameters)
  3. {
  4.   xTaskCreate((TaskFunction_t        )LED_TOG,//任务函数
  5.               (char *                )"LED_TOG",//任务名称
  6.               (configSTACK_DEPTH_TYPE) 128,//堆栈空间128Byte
  7.               (void*                 ) NULL,//无返回
  8.               (UBaseType_t          ) 1,//优先级1
  9.               (TaskHandle_t *        )LED_TOG_Handler);//任务函数句柄
  10.   vTaskDelete(NULL);
  11. }
复制代码

我们创建启动任务的函数,将任务函数的函数指针,任务函数的名称,任务函数所需堆栈空间,任务函数的类型,任务函数的优先级,以及任务函数的函数句柄,填入vTaskCreate函数中,其中每个参数都使用了强制类型转换防止出现错误。

同样的方法,我们创建启动 启动函数的任务(有点绕口因为启动函数本身是一个任务)

  1. void FreeRTOS_Init()
  2. {
  3.   xTaskCreate((TaskFunction_t        )Start_LED,
  4.               (char *                )"Start_LED",
  5.               (configSTACK_DEPTH_TYPE) 128,
  6.               (void*                 ) NULL,
  7.               (UBaseType_t          ) 0,
  8.               (TaskHandle_t *        )Start_LED_Handler);
  9.   vTaskStartScheduler();//启动运行函数
  10. }
复制代码

这样子我们在主函数中添加刚刚定义的启动启动函数

  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */
  9.   KEY_Init();
  10.   /* USER CODE END Init */

  11.   /* Configure the system clock */
  12.   SystemClock_Config();

  13.   /* USER CODE BEGIN SysInit */

  14.   /* USER CODE END SysInit */

  15.   /* Initialize all configured peripherals */
  16.   MX_GPIO_Init();
  17.   MX_USART1_UART_Init();
  18.   /* USER CODE BEGIN 2 */
  19.   FreeRTOS_Init();
  20.   /* USER CODE END 2 */

  21.   /* Infinite loop */
  22.   /* USER CODE BEGIN WHILE */
  23.   while (1)
  24.   {
  25.     /* USER CODE END WHILE */

  26.     /* USER CODE BEGIN 3 */
  27.   }
  28.   /* USER CODE END 3 */
  29. }
复制代码

我们的代码就可以正常运行啦!


我们在用上述的方法实现两个灯一起翻转

还是先编辑任务函数如下,并且定义其相关句柄

  1. TaskHandle_t LED_TOG2_Handler;
  2. void LED_TOG2(void * pvParameters)//参数为 void * pvParameters
  3. {
  4.   while(1)
  5.   {
  6.     printf("LED_TOG running\r\n");//串口打印运行信息
  7.     HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转
  8.     vTaskDelay(500);//延迟500ms
  9.   }
  10. }
复制代码

在任务启动函数中加入我们新建的任务。

  1. void Start_LED(void * pvParameters)
  2. {
  3.   xTaskCreate((TaskFunction_t        )LED_TOG,//任务函数
  4.               (char *                )"LED_TOG",//任务名称
  5.               (configSTACK_DEPTH_TYPE) 128,//堆栈空间128Byte
  6.               (void*                 ) NULL,//无返回
  7.               (UBaseType_t          ) 1,//优先级1
  8.               (TaskHandle_t *        )LED_TOG_Handler);//任务函数句柄
  9.   
  10.    xTaskCreate((TaskFunction_t        )LED_TOG2,//任务函数
  11.               (char *                )"LED_TOG2",//任务名称
  12.               (configSTACK_DEPTH_TYPE) 128,//堆栈空间128Byte
  13.               (void*                 ) NULL,//无返回
  14.               (UBaseType_t          ) 2,//优先级2
  15.               (TaskHandle_t *        )LED_TOG2_Handler);//任务函数句柄
  16.               
  17.   vTaskDelete(NULL);
  18. }
复制代码

再次运行我们的代码。


转载自: 电路小白

如有侵权请联系删除




收藏 评论0 发布时间:2023-10-19 15:54

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版