STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

这篇具有很好参考价值的文章主要介绍了STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32 CubeMX



学习使用Freertos第二步
在 FreeRTOS 中,任务通信可以通过以下函数来实现:

  1. xQueueCreate():用于创建一个消息队列。可以设置队列长度和每个消息的大小。

xQueueSend():将一条消息发送到队列中。可以选择阻塞或非阻塞发送。

xQueueReceive():从队列中接收一条消息。可以选择阻塞或非阻塞接收。

xQueuePeek():查看队列中的下一条消息,但不将其移除。

xQueueReset():清空队列中的所有消息。
2. xQueueSemaphoreTake()xQueueSemaphoreGive():用于实现二值信号量,控制任务之间的互斥访问。
3. xSemaphoreCreateMutex():创建一个互斥信号量,用于实现任务之间的互斥访问。
4. xTaskNotify()ulTaskNotifyTake():用于任务间的通知机制,一个任务可以通知另一个任务进行某种操作。
5. xEventGroupCreate()、xEventGroupSetBits()和xEventGroupWaitBits():用于创建、设置和等待事件标志组。

一、STM32 CubeMX设置

时钟配置

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

使用STM32 CubeMX 库,配置Freertos

选择CMISS_V1接口就可以满足Freertos接口;且代码量比CMISS_V2小(CMISS_V2支持更多的RTOS接口,所以代码量比CMISS_V1多)
STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

二、实验一:消息队列

消息队列是什么?适用于什么地方?

  • 数据传递:消息队列允许任务之间传递数据,一个任务可以将数据打包成消息发送到队列,另一个任务则可以从队列中接收该消息并处理其中的数据。这使得任务之间可以方便地进行数据交换和共享。
  • 任务解耦:通过使用消息队列,任务之间的耦合度可以降低。一个任务只需要关注发送和接收消息,而不需要知道消息的具体处理细节和目标任务的实现。这样,当需要更改或替换某个任务时,只需要保证消息的格式和接口不变即可,不会对其他任务产生影响。
  • 同步与协作:消息队列可以用于实现任务之间的同步和协作。例如,一个任务可以等待某个特定的消息到达队列后才继续执行,从而实现任务间的同步。另外,多个任务可以通过发送和接收消息来协调彼此的执行顺序和操作。
  • 缓冲和调节:消息队列可以充当缓冲区,用于存储一定数量的消息。当发送方发送消息速度较快,而接收方处理速度较慢时,消息队列可以暂时存储未处理的消息,避免数据丢失。同时,消息队列还可以调节发送和接收任务之间的速度差异,以平衡任务负载。

FreeRTOS 消息队列和数组 的几个区别:

  • 数据组织方式:消息队列是一种先进先出(FIFO)的数据结构,用于存储和传递消息。每个消息都可以包含不同类型和长度的数据。而数组是一种线性的、连续的数据结构,用于存储相同类型和长度的元素。
  • 功能和用途:消息队列主要用于任务间通信,允许任务之间传递数据和进行同步。它提供了数据传递、解耦、同步和协作等功能。而数组通常用于存储一组具有相同类型的元素,可以进行遍历、访问和修改等操作。
  • 大小和容量:消息队列的大小是可以动态调整的,可以根据需要增加或减少队列的容量。而数组的大小在创建时就确定,并且通常是固定的。
  • 可用性和效率:消息队列可以实现多个任务之间的并发通信,提供了较高的可用性和灵活性。而数组通常在单个任务内进行操作,具有较高的效率和直接性
  • 总的来说,消息队列和数组是两种不同的数据结构,适用于不同的场景和需求。消息队列主要用于任务间通信和数据传递,具有灵活性和可调节性;而数组主要用于存储相同类型的元素,并进行遍历和访问操作。选择使用哪种数据结构取决于具体的应用需求和功能要求。

创建消息队列

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

  • Queue Name: 队列名称
  • Queue Size: 队列能够存储的最大单元数目,即队列深度
  • Queue Size: 队列中数据单元的长度,以字节为单位
  • Allocation: 分配方式:Dynamic 动态内存创建
  • Buffer Name: 缓冲区名称
  • Buffer Size: 缓冲区大小
  • Conrol Block Name: 控制块名称

创建任务

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

  • Task Name: 任务名称
  • Priority: 优先级,在 FreeRTOS 中,数值越大优先级越高,0 代表最低优先级
  • Stack Size (Words): 堆栈大小,单位为字,在32位处理器(STM32),一个字等于4字节,如果传入128那么任务大小为128*4字节
  • Entry Function: 入口函数
  • Code Generation Option: 代码生成选项
  • Parameter: 任务入口函数形参,不用的时候配置为0或NULL即可
  • Allocation: 分配方式:Dynamic 动态内存创建
  • Buffer Name: 缓冲区名称
  • Conrol Block Name: 控制块名称

代码部分

void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
      xsatus=xQueueSendToBack(myQueue01Handle,&buff,0);
			 if( xsatus!=pdPASS)
			 {
			 printf("输入失败\r\n");		// printf输出字符串
			 }
			 else
			 {
			 printf("成功写入%d\r\n", buff);		// printf输出字符串
			 }
			 osDelay(1000);
  }
  /* USER CODE END sendTask1 */
}
void readTask3(void const * argument)
{
  /* USER CODE BEGIN readTask3 */
  BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
      xsatus=xQueueReceive(myQueue01Handle,&buff,0);
		  if( xsatus!=pdPASS)
			 {
			 printf("读取失败\r\n");		// printf输出字符串
			 }
			 else
			 {
			 printf("成功读取%d\r\n", buff);		// printf输出字符串
			 }
			  osDelay(3000);
  }
  /* USER CODE END readTask3 */
}

实验现象

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

 
			 xsatus=xQueueSendToBack(myQueue01Handle,&buff,portMAX_DELAY);//一直等待
			 if( xsatus!=pdPASS)
			 {
			 printf("输入失败\r\n");		// printf输出字符串
			 }
			 else
			 {
			 printf("成功写入%d\r\n", buff);		// printf输出字符串
			 }

还一种方式:读取不会删除信息(偷窥信息)

三,实验二:信号量

信号量是什么?适用于什么地方?

FreeRTOS中的信号量是一种用于任务间同步和资源共享的机制。它可以用来实现任务之间的互斥访问共享资源,或者在某个任务等待某个事件发生时进行阻塞。

FreeRTOS提供了两种类型的信号量:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。

二进制信号量是一种简单的信号量,只有两种状态:空闲和占用。当一个任务获取到二进制信号量时,它就可以继续执行,而其他任务则会被阻塞。当任务释放二进制信号量时,其他任务可以获取到它并继续执行。

计数信号量是一种更复杂的信号量,它可以有多个资源可供获取。计数信号量可以用来实现资源池的管理,例如限制同时访问某个资源的任务数量

在FreeRTOS中,可以使用以下函数来创建和操作信号量:

  • xSemaphoreCreateBinary(): 创建二进制信号量。
  • xSemaphoreCreateCounting(): 创建计数信号量。
  • xSemaphoreTake(): 获取一个信号量。
  • xSemaphoreGive(): 释放一个信号量。

需要注意的是,使用信号量时要确保正确的获取和释放顺序,以避免出现死锁或资源竞争的问题。

二值信号量

创建信号量
STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

代码部分

void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
		
       if( xSemaphoreTake(myBinarySem01Handle,portMAX_DELAY)!=pdPASS)
			 {
			  printf("刷新失败#信号量获取失败\r\n");		// printf输出字符串
			 }
			 else
			 {
			  printf("成功刷新#信号量获取成功\r\n");		// printf输出字符串
			 }
	
			 osDelay(2000);
  }
  /* USER CODE END sendTask1 */
}
void readTask3(void const * argument)
{
  /* USER CODE BEGIN readTask3 */
  BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
  
		 	 if( xSemaphoreGive(myBinarySem01Handle)!=pdPASS)
			 {
			  printf("读取失败#信号量不能释放\r\n");		// printf输出字符串
			 }
			 else
			 {
			  printf("成功读取#信号量已经释放\r\n");		// printf输出字符串
			 }
			  osDelay(1000);
  }
  /* USER CODE END readTask3 */
}

实验现象

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

计数信号量

创建计数信号量
STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机
STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

代码部分

void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
		
       if( xSemaphoreGive(myCountingSem01Handle)!=pdTRUE)
			 {
			  printf("停车已满\r\n");		// printf输出字符串
			 }
			 else
			 {
			  printf("停车成功\r\n");		// printf输出字符串
			 }
			 osDelay(2000);
  }
  /* USER CODE END sendTask1 */
}
void readTask3(void const * argument)
{
  /* USER CODE BEGIN readTask3 */
  BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
  
		 	 if( xSemaphoreTake(myCountingSem01Handle,0)!=pdTRUE)
			 {
			  printf("无车\r\n");		// printf输出字符串
			 }
			 else
			 {
			   printf("取走车\r\n");		// printf输出字符串
			 }
			  osDelay(1000);
  }
  /* USER CODE END readTask3 */
}

实验现象

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

四,实验三:互斥量

互斥量是什么?适用于什么地方?

FreeRTOS中的互斥量(Mutex)是一种用于保护共享资源的同步机制。它可以确保在任何给定时刻只有一个任务可以访问被保护资源,以避免竞争条件和数据损坏。

在FreeRTOS中,互斥量通过以下API函数进行创建、获取和释放:

  • xSemaphoreCreateMutex():用于创建一个互斥量,并返回一个指向该互斥量的句柄。
  • xSemaphoreTake():用于获取(锁定)互斥量。如果互斥量当前未被锁定,则任务可以 获取互斥量并继续执行;否则,任务将被阻塞,直到互斥量可用。
  • xSemaphoreGive():用于释放(解锁)互斥量。一旦任务完成了对共享资源的访问,应该调用此函数来释放互斥量,以允许其他任务获取它。
    创建互斥量
    STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

代码部分

void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
		 osDelay(20);
       if(xSemaphoreTake(myMutex01Handle,portMAX_DELAY)!=pdTRUE)
			 {
			   printf("1号:你上完厕所,下一个就轮到我了\r\n");		// printf输出字符串
			 }
			 else
			 {
			   printf("1号:现在是我在上厕所\r\n");		// printf输出字符串
				 xSemaphoreGive(myMutex01Handle);
	       printf("1号:我上完了\r\n");		// printf输出字符串
			 }	
			 osDelay(2000);
  }
  /* USER CODE END sendTask1 */
}

/* USER CODE BEGIN Header_sendTask2 */
/**
* @brief Function implementing the Task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_sendTask2 */
void sendTask2(void const * argument)
{
  /* USER CODE BEGIN sendTask2 */
	BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
     xSemaphoreTake(myMutex01Handle,0); 
     printf("2号:我在厕所\r\n");		// printf输出字符串
	   osDelay(3000);
     printf("2号:我上完了\r\n");		// printf输出字符串
	   xSemaphoreGive(myMutex01Handle);
     osDelay(2000);
	}
  /* USER CODE END sendTask2 */
}

/* USER CODE BEGIN Header_readTask3 */
/**
* @brief Function implementing the read thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_readTask3 */
void readTask3(void const * argument)
{
  /* USER CODE BEGIN readTask3 */
  BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
      if(xSemaphoreTake(myMutex01Handle,0)!=pdTRUE)
			 {
			   printf("3号:厕所有人,等一会儿再来\r\n");		// printf输出字符串
			 }
			 else
			 {
			    printf("3号:到我上小便了\r\n");		// printf输出字符串
	        printf("3号:我撒完尿了\r\n");		// printf输出字符串
				  xSemaphoreGive(myMutex01Handle);
			 }	 
			  osDelay(1000);
  }
  /* USER CODE END readTask3 */
}

实验现象

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

五,实验四:事件组

互斥量是什么?适用于什么地方?

FreeRTOS事件组是一个用于多任务协调和通信的机制。它允许任务等待多个事件同时发生,并在事件发生后恢复任务的执行。事件组可以用于线程同步、互斥、事件通知等应用场景。

FreeRTOS事件组由32位的二进制位表示,每个事件标志位对应一个事件。任务可以通过等待特定的事件标志位来挂起自己的执行,并在其中一个或多个事件标志位被设置时被唤醒。任务还可以使用事件组的API函数来设置或清除特定的事件标志位。

以下是一些常用的FreeRTOS事件组API函数:

  1. xEventGroupCreate():创建一个新的事件组。
  2. vEventGroupDelete():删除已创建的事件组。
  3. xEventGroupSetBits():设置一个或多个事件标志位。
  4. xEventGroupClearBits():清除一个或多个事件标志位。
  5. xEventGroupWaitBits():等待一个或多个事件标志位被设置。

使用FreeRTOS事件组可以实现任务之间的同步和通信,提高系统的可靠性和效率。
**CMSIS_V1不支持创建事件组,所以手创建 **

EventGroupHandle_t myEvent=NULL;//创建句柄
myEvent = 	xEventGroupCreate(); //创建事件组

与逻辑,事件组

任务代码:

/* USER CODE END Header_sendTask1 */
void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
		     printf("1号:这个方案我同意了\r\n");		// printf输出字符串
         xEventGroupSetBits(myEvent,0x0001);			   
		     osDelay(2000);
  }
  /* USER CODE END sendTask1 */
}

/* USER CODE BEGIN Header_sendTask2 */
/**
* @brief Function implementing the Task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_sendTask2 */
void sendTask2(void const * argument)
{
  /* USER CODE BEGIN sendTask2 */
	BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
		     osDelay(5000);
         printf("2号:这个方案我同意了\r\n");		// printf输出字符串
         xEventGroupSetBits(myEvent,0x0010);			   			
	}
  /* USER CODE END sendTask2 */
}

/* USER CODE BEGIN Header_readTask3 */
/**
* @brief Function implementing the read thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_readTask3 */
void readTask3(void const * argument)
{
  /* USER CODE BEGIN readTask3 */
  BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
        buff=xEventGroupWaitBits(myEvent,0x0011,pdTRUE,pdTRUE,portMAX_DELAY);//1.句柄;2.哪些位;3.读完清零;4.全部有效(与逻辑);5.等待时间
		    if(buff==0x0011)
				{
				   printf("3号:好这个方案全票同意\r\n");		// printf输出字符串
				}
			  osDelay(10000);
  }
  /* USER CODE END readTask3 */
}

实验现象

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机

或逻辑,事件组

void sendTask1(void const * argument)
{
  /* USER CODE BEGIN sendTask1 */
	BaseType_t xsatus;
	uint32_t buff=9600;
  /* Infinite loop */
  for(;;)
  {
		     printf("1号:这个方案我同意了\r\n");		// printf输出字符串
         xEventGroupSetBits(myEvent,0x0001);			   
		     osDelay(2000);
  }
  /* USER CODE END sendTask1 */
}

/* USER CODE BEGIN Header_sendTask2 */
/**
* @brief Function implementing the Task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_sendTask2 */
void sendTask2(void const * argument)
{
  /* USER CODE BEGIN sendTask2 */
	BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
		     osDelay(5000);
         printf("2号:这个方案我同意了\r\n");		// printf输出字符串
         xEventGroupSetBits(myEvent,0x0010);			   			
	}
  /* USER CODE END sendTask2 */
}

/* USER CODE BEGIN Header_readTask3 */
/**
* @brief Function implementing the read thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_readTask3 */
void readTask3(void const * argument)
{
  /* USER CODE BEGIN readTask3 */
  BaseType_t xsatus;
	uint32_t buff=115200;
  /* Infinite loop */
  for(;;)
  {
        buff=xEventGroupWaitBits(myEvent,0x0011,pdTRUE,pdFALSE,portMAX_DELAY);//1.句柄;2.哪些位;3.读完清零;4.全部有效(与逻辑);5.等待时间
		    if((buff==0x0010)||(buff==0x0001))
				{
				   printf("3号:好方案通过,下一个方案\r\n");		// printf输出字符串
				}
 
  }
  /* USER CODE END readTask3 */
}

实验现象

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知),STM32 CubeMX,Rtos,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-664843.html

六,实验五:任务通知

到了这里,关于STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第二步:STM32F407ZGT6资源介绍

      内核: 32位 高性能 ARM Cortex-M4 处理器 时钟:高达168M, 实际还可以超屏一点点 支持FPU (浮点运算)和 DSP 指令 IO口: STM32F407ZGT6: 144引脚  114 个 IO 大部分IO 口都耐 5V( 模拟通道除外 ) 支持调试:SWD 和 JTAG , SWD 只要 2 根数据线 存储器容量: 1024K FLASH , 192K SRAM 时钟,复位和

    2024年02月13日
    浏览(58)
  • STM32 CubeMX LwIP + freertOS 移植

    开发板: 官方 STM32F746  MCU型号:STM32F746NGH 网卡型号:LAN8742A  原理图如下 先用裸机测试LAN8742A的网卡驱动 使用CubeMX创建工程 系统时钟和时基定时器如下 无系统LWIP协议栈设置,静态IP地址,关闭DHCP 生产代码,下载进开发板。开发板网口与电脑网口通过网线直连,设置电脑本

    2024年01月16日
    浏览(87)
  • 基于STM32CubeMX创建FreeRTOS—以STM32F429为例

    目录 1. 实验任务 2. 使用STM32CubeMX创建基础工程 2.1 使用STM32CubeMX创建项目 2.2 创建新项目 2.3 时钟设置 2.4 时钟配置树 2.5 修改时钟基准,打开串行调试 2.6 配置串口 2.7 配置状态指示灯 2.8 FreeRTOS配置 2.9 配置工程输出项 3. 代码编辑 3.1 printf重映射 3.1.1 使用ARMCC 5编译器时的print

    2024年01月22日
    浏览(43)
  • 搭建STM32F407的Freertos系统(基于STM32CubeMX)

           本人长期开发Linux、Windows上应用软件,一直以来MCU开发有所接触,但较少(最近项目需要,小公司么,都得会,被逼的),好在有STM32CubeMX这样工具,貌似就是我想要的工具。         本次demo目标立下:         1. 搭建或移植FreeRTOS到STM32上,毕竟对于长期在Linux环境

    2024年02月10日
    浏览(63)
  • STM32CubeMX+FATFS+FREERTOS读写U盘

    软件:STM32CubeMX V6.6.1 、 KEIL5 V5.29 硬件:STM32F429ZET6 USB_OTG_FS:PA11/PA12引脚 USART1:PA9/PA10,方便输出调试信息 1)SYS下载方式选择SW方式,因为要使用FREERTOS,提前将时钟源修改为TIM7(其他定时器也可以) 2) RCC设置,选择高速外部晶振HSE(根据具体硬件选择) 3)USART1设置,方便输出调

    2024年01月18日
    浏览(51)
  • STM32cubemx对FreeRTOS的适配(工程模板配置)

    本篇文章将带大家使用STM32cubemx对FreeRTOS进行工程模板的配置。 1.开始工程的创建: 2.芯片型号选择: 3.修改时钟为TIM8: 在FreeRTOS中SYSTICK需要为FreeRTOS提供心跳,故这里选择TIM8替换SYNTICK。 4.配置RCC: 5.配置FreeRTOS: 6.开启串口方便调试和观察: 7.工程路径及编译器选择等:

    2024年02月07日
    浏览(52)
  • STM32基于HAL库和STM32CubeMX的实时操作系统FreeRtOS开发

    1、FreeRTOS RTOS是一类操作系统,µC/OS,FreeRTOS,RTX,RT-Thread 等这些都是RTOS 类的操作系统 FreeRTOS 是众多RTOS 类操作系统中的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,FreeRTOS 也不仅仅局限于在微控制器中使用。就单从文件数量上来看FreeRTOS 要比µC/OS 少得多

    2024年02月21日
    浏览(64)
  • STM32 CubeMX (第三步Freertos中断管理和软件定时)

    学习使用Freertos第三步 在 FreeRTOS 中,中断管理和软件定时: · taskENTER_CRITICAL() ·; 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用 ·

    2024年02月12日
    浏览(67)
  • STM32CubeMx学习FreeRTOS的绝对延时和相对延时

    在阻塞状态中 可以空闲出时间 来让低优先级的任务可以进行 有两种阻塞延时 一个是相对延时 也就是  这样的osDelay可以让在到这里的时候,延时500ms 也就是程序到这里才500ms 不记程序前面所用的时间 而还有一个绝对延时 绝对延时指的是 加上程序自己跑的时间 全部的一起

    2024年02月14日
    浏览(42)
  • STM32H743使用CubeMX配置Lwip、Freertos

    硬件:野火挑战者开发板STM32H743IIT6 软件版本: CubeMX 6.7.0 STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 原理图: 时钟树参数仅供参考 MPU配置需要查相关资料,一知半解 修改GPIO与硬件原理图对应,串口参数默认 参数配置与硬件对应 此处网络收发地址非常重要!!! 使能中断 串口

    2024年02月07日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包