基于HAL库的FREERTOS----------一.任务

FreeROTS 就是一个免费的 RTOS 类系统。这里要注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 UCOS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行。

结合CUBEMX使用freertos----cubemx配置

自己配置好串口
在这里插入图片描述
在这里插入图片描述

1.CMSIS-V1与CMSIS-V2

这两个接口,前者是普通功能,后者是高级功能,在使用事件时,必须开启CMSIS-V2。

2.config parameters

使用默认配置
配置好之后生成工程。

3.任务函数

1.创建任务

这是生成代码后,keil5里的创建任务代码

  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);//创建任务

函数osThreadCreate()原型如下

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint16_t usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
xTaskCreate((TaskFunction_t )start_task, //任务函数 (1)
 (const char* )"start_task", //任务名称
 (uint16_t )START_STK_SIZE, //任务堆栈大小
 (void* )NULL, //传递给任务函数的参数
 (UBaseType_t )START_TASK_PRIO, //任务优先级
 (TaskHandle_t* )&StartTask_Handler); //任务句柄

2.删除任务
使用删除任务时,CUBEMX里的此项要开启,如下图
在这里插入图片描述

vTaskDelete(myTask02Handle);
/*osThreadTerminate(myTask02Handle);*/
二者相同

原型如下

void vTaskDelete( TaskHandle_t xTaskToDelete )

/*osStatus osThreadTerminate (osThreadId thread_id)
{
#if (INCLUDE_vTaskDelete == 1)
  vTaskDelete(thread_id);
  return osOK;
#else
  return osErrorOS;
#endif
}*/

3.挂起任务和继续任务

vTaskSuspend(myTask02Handle);//osThreadSuspend(myTask02Handle);
vTaskResume(myTask02Handle);//osThreadResume(myTask02Handle);

osThreadSuspendAll();//全部挂起
osThreadResumeAll();//全部继续

		

使用几次全部挂起就要使用几次全部继续

4.任务调度
在这里插入图片描述

osStatus osKernelStart (void)
{
  vTaskStartScheduler();
  
  return osOK;
}

4.实验验证

void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
		printf("任务2执行\r\n");
		task2++;
    osDelay(1000);
  }
  /* USER CODE END StartTask02 */
}

void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
  for(;;)
  {
			if(task2>5)
			{
				task2=0;
				vTaskSuspend(myTask02Handle);//  等同osThreadSuspend(myTask02Handle);
				printf("任务2已挂起\r\n");
				osDelay(2200);
				vTaskResume(myTask02Handle);//osThreadResume(myTask02Handle)
				printf("任务2继续\r\n");
				osDelay(2200);
				vTaskDelete(myTask02Handle);//osThreadTerminate(myTask02Handle);
				printf("任务2已删除\r\n");
			}
    osDelay(1);
  }
  /* USER CODE END StartTask03 */
}

在这里插入图片描述
task2执行五次,相继挂起,执行,删除。
欢迎指正

### STM32 HAL FreeRTOS 结合使用教程 #### 创建任务 为了在STM32上利用HALFreeRTOS创建个简单的任务,可以按照以下方式编写代码。此方法适用于基于CubeMX配置的项目。 ```c #include "main.h" #include "cmsis_os.h" // 定义任务句柄 osThreadId_t defaultTaskHandle; void StartDefaultTask(void *argument) { /* 初始化 */ for (;;) { // 主循环体,在这里放置周期执行的任务逻辑 osDelay(500); // 延迟500ms } } /* 用户应用初始化函数 */ void MX_FREERTOS_Init(void) { osKernelInitialize(); // 初始操作系统内核 defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); osKernelStart(); } ``` 上述代码展示了如何定义并启动个新的线程`defaultTaskHandle`[^2]。通过调用`osThreadNew()`来创建新任务,并传递给它所要运行的具体工作——这里是`StartDefaultTask`函数指针以及可能需要的数据参数(本例中传入的是NULL),最后再启动调度器使能多任务处理机制。 #### 配置FreeRTOS环境 当采用V6版本编译器时,需调整FreeRTOS源码里的特定文件以适应当前开发平台的需求。具体来说就是编辑位于中间件目录下的FreeRTOS端口层实现部分: 路径类似于 `E:\STM32cubeMX\STM32Cube_FW_F4_V1.28.1\Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F` 下的相关头文件C文件[^3]。 这些更改通常涉及优化设置、中断优先级管理等方面的内容,确保最终应用程序能够在目标硬件平台上稳定高效地运作。 #### 示例工程介绍 对于希望深入了解Modbus协议栈集成到STM32微控制器的应用开发者而言,《Modbus-STM32-HAL-FreeRTOS》提供了个完整的解决方案实例。该项目不仅实现了Modbus TCP RTU模式下Master/Slave角色的支持,而且充分利用了ST官方提供的HAL驱动程序简化底层操作的同时引入了实时操作系统特性增强系统的灵活性与响应速度[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地球先生_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值