基于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执行五次,相继挂起,执行,删除。
欢迎指正

### 回答1: Modbus是一种常用的串行通信协议,其主从架构适用于工控领域。STM32是一系列微控制器芯片,其中包含了强大的处理器和周边设备,适用于工业控制、通信等应用。HAL是STM32提供的硬件抽象层,可以简化STM32芯片的驱动和编程过程。FreeRTOS是一个流行的实时操作系统,可以帮助开发者进行多线程编程、任务调度等操作。 在使用Modbus通信协议的过程中,通常使用STM32芯片作为主机或从机,通过HAL驱动与外设进行通信。通过FreeRTOS实现多任务调度,可以使得主从设备之间的通信更加稳定可靠。具体实现过程中,开发者需要熟悉Modbus协议的通信机制和STM32芯片的相关知识,同时掌握HAL驱动和FreeRTOS操作系统的编程方法。相应的,也可以选择其他适用于工控领域的通信协议和芯片平台进行开发。 ### 回答2: Modbus是一种通信协议,它被广泛应用于工业自动化领域。Modbus协议采用主从结构,主设备控制整个通信过程,从设备接收主设备发送的指令并返回相应的数据。STM32是一系列单片机产品,Hal是针对STM32开发的一套低层驱动库,FreeRTOS是一种流行的实时操作系统。 在使用STM32单片机实现Modbus主从通信时,可以使用Hal库提供的相关函数来对串口进行初始化和设置,同时可以使用FreeRTOS来实现多任务并行运行。对于Modbus协议的实现,可以利用从设备的地址进行区分,主设备通过读写寄存器的方式与从设备进行通信,而从设备则需要根据读写寄存器的指令进行相应的数据处理和返回。 总之,通过使用STM32Hal库FreeRTOS可以方便地实现Modbus主从通信,提高工业自动化控制系统的效率和稳定性。 ### 回答3: Modbus,又称为Modicon通信协议,是一种基于串行传输的通信协议。Modbus协议中定义了Master-Slave模式的通信方式,其中Master可以向Slave发送读/写命令,Slave可以回复数据给Master。STM32是一种32位的嵌入式微控制器,可以通过外围设备如串口等实现Modbus的通信。HAL则是ST公司提供的硬件抽象层,可以简化开发者对系统引脚和外设的访问。FreeRTOS则是一种开源的实时操作系统,可以帮助开发者实现多任务系统。 因此,modbus-master-slave-stm32-hal-freertos指的是使用STM32芯片作为Modbus通信的主体,使用HAL层引脚和外设抽象库简化访问,使用FreeRTOS实现基于多任务的系统设计,实现Modbus通信的Master-Slave模式。这种模式可以用于控制系统的监控和控制,能够实现高效、准确、可靠的数据交换,广泛应用于自动控制、仪器仪表、工业自动化等领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

地球先生_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值