先介绍一下由CubeMX生成的文件都是干什么的

tasks.c 任务操作

list.c 列表

queue.c 队列操作和信号量操作

timer.c 时间操作(软件定时器)

一些变量名前缀

c   char

s   short  int16_t

l   int32_t  long

x  非标准类型BaseType_t  :结构体等

u  unsigned

p  指针

uc  uint8_t unsigned char

pc  char指针

函数命名方式 :前缀+任务源文件名+作用

做到了函数名本身就能传达:返回值,类型,和模块

前缀含义和前面变量名一样

例子

xQueueReceive  

x是  返回值:非标准类型

Queue 说明再queue.c里

Receive 说明是接收函数

再一些函数的参量里会有一些特定的宏

pdTRUE   1

pdFALSE   0

pdPASS   1

pdFALL   0

下面了解一下FreeRTOS的内存管理

主要分为三个方面(分别由MX中的这三个配置决定)

分配内存方式

分配内存大小

内存管理函数

在我们有相同操作,但仅仅是所需要的参数不同

我们就可以让一个函数对应多个任务

在使用

xTaskCreate(MyTask,"Myself",128,NULL,osPriorityNormal,NULL);

创建任务的时候任务名不同,和传入的参数不同,但是函数名称需要相同,需要注意传入的参数只能有一个指针,可以到函数内部进行继承

具体示例如下

这个例子是在OLED不同的行去依次显示递增数字

void OLEDTask(void *argument)
{
		OLED_Init();
	static uint16_t num = 0;
  /* Infinite loop */
  for(;;)
  {
	 
	  if(flag)
	  {
		flag = 0;
	  data* information = argument;
	  
	  OLED_ShowString(information->y,information->x,information->name);
	  
	  OLED_ShowSignedNum(information->y,6,num,3);
		  
		  num++;
	OLED_ShowString(4,1,"yes");
	  
		  flag=1;
	  }
	  ///vTaskDelay(500);
      //osDelay(1);
	  HAL_Delay(500);
  }
  
}

这是主题函数,里面的flag类似一个状态判断标志位,里面的OLED函数借鉴我前面的文章

xTaskCreate(OLEDTask, "task1", 128, &num1, osPriorityNormal, NULL);
	xTaskCreate(OLEDTask, "task2", 128, &num2, osPriorityNormal, NULL);
	xTaskCreate(OLEDTask, "task3", 128, &num3, osPriorityNormal, NULL);
	

这是创建任务函数

当我们在一个时候想要不运行一个函数的时候我们就可以使用任务删除函数

删除当前任务:vTaskDelete(NULL)

被别的任务删除:别的任务执行vTaskDelete(pvTaskCode),pvTaskCode是自己的句柄

删除别的任务:执行vTaskDelete(pvTaskCode),pvTaskCode是别的任务的句柄

使用第一种时最安全的

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐