STM32
直播中

凌流浪

7年用户 973经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

如何在STM32CubeMX上配置FreeRTOS?

如何在STM32CubeMX上配置FreeRTOS?

回帖(1)

杨叶

2021-11-16 09:53:09
简介

在应用中有许多禁止被打断的操作,如底层驱动等,这个时候就需要关闭中断
在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_Init */
/**
* @brief Function implementing the Init_Timer thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Init */
void Init(void const * argument)
{
  /* USER CODE BEGIN Init */
        osThreadDef(LED, Blink, osPriorityNormal, 0, 128);
  LEDHandle = osThreadCreate(osThread(LED), NULL);
        vTaskDelete(NULL);
  /* USER CODE END Init */
}


/* USER CODE BEGIN Header_Blink */
/**
* @brief Function implementing the LED thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Blink */
void Blink(void const * argument)
{
  /* USER CODE BEGIN Blink */
        unsigned int i = 0;
        HAL_TIM_Base_Start_IT(&htim1);
  /* Infinite loop */
  for(;;)
  {
                i = 0x017B8935;
                portDISABLE_INTERRUPTS();
                while(i--);
                portENABLE_INTERRUPTS();


               
    osDelay(1000);
  }
  /* USER CODE END Blink */
}


portDISABLE_INTERRUPTS();
portENABLE_INTERRUPTS();
用于开关中断,需要注意的是,若想在其中间做一点延时,那么不能使用 osDelay(1000);函数,因为他会自动开启中断
举报

更多回帖

发帖
×
20
完善资料,
赚取积分