×
单片机 > 单片机程序设计 > 详情

STM32CubeMX学习笔记——FreeRTOS_任务挂起与继续

发布时间:2020-06-01 发布时间:
|

Github

https://github.com/HaHaHaHaHaGe/Planof2019_half/tree/master/Course_Project/FreeRTOS/Class02_SuspendResume


简介

任务挂起与继续的作用,用于暂停运行某些任务与继续运行某些任务。就像用视频播放器看电影的播放按键与暂停按键一样简单。


在STM32CubeMX上配置FreeRTOS非常的简单,几乎不需要做任何操作,只需要勾选

移植FreeRTOS就成功了,关于在非Cube上的RTOS配置文件内的相关内容,也在下方的Configuration栏中给好了

所有的配置都可以在这里完成


任务创建

有别于在没有使用Cube下的创建方式,在Cube中它专门提供了可视化的创建方式,并且增加了中间文件cmsis_os.c将freertos中提供的方法进行了再一次的封装(猜测可能是为了支持更多的OS吧)


可视化创建方式

在Tasks and Queues中可以点击Add按钮添加新的任务

1、任务名字

2、任务优先级(因为增加了一个层级结构,导致不再是以数字来决定优先级了)

3、栈大小

4、函数名(有别于第一条,第一条是字符串格式的,这条是定义代码中的函数名字)

5、代码生成设置(生成与否?还是生成弱函数——希望自行编写函数的选As External,希望自动生成的选Default)

6、传入的数据/指针,一般为NULL,有希望传入的数据可以修改

7、创建方式(动态或静态,一般动态,很少使用静态方式)


代码创建方式

osThreadId LED_Blink2Handle;

osThreadDef(LED_Blink2, Blink_PB1, osPriorityNormal, 0, 128);

LED_Blink2Handle = osThreadCreate(osThread(LED_Blink2), NULL);


代码创建也很简单,实际上osThreadCreate对xTaskCreate进行了封装,而osThreadDef与osThread都是宏定义,用于描述初始化变量的,通过预编译器巧妙的生成了函数名(字符串)与相关初始化变量赋给了函数osThreadCreate


LED_Blink2:希望生成的中间结构体名称也会被预编译器生成同名的字符串

Blink_PB1:真实的函数名称

osPriorityNormal:优先级

0:最大实例化个数(估计是以后会用到,目前这个变量还没什么作用,默认0就好)

128:栈空间


任务挂起与继续

/* USER CODE BEGIN Header_blink01 */

/**

* @brief Function implementing the Blink_PB0 thread.

* @param argument: Not used

* @retval None

*/

/* USER CODE END Header_blink01 */

void blink01(void const * argument)

{

  /* USER CODE BEGIN blink01 */

int i = 0;

  /* Infinite loop */

  for(;;)

  {

if(i == 10)

vTaskSuspend(Blink_PB1Handle);

if(i == 20)

vTaskResume(Blink_PB1Handle);

HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);

    osDelay(500);

i++;

  }

  /* USER CODE END blink01 */

}


/* USER CODE BEGIN Header_blink02 */

/**

* @brief Function implementing the Blink_PB1 thread.

* @param argument: Not used

* @retval None

*/

/* USER CODE END Header_blink02 */

void blink02(void const * argument)

{

  /* USER CODE BEGIN blink02 */

  /* Infinite loop */

  for(;;)

  {

HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);

    osDelay(1000);


  }

  /* USER CODE END blink02 */

}


真的是很简单,直接调用vTaskSuspend用于挂起某个任务,调用vTaskResume用于继续某个任务



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析