RTOS--根据韦东山视频总结函数

RTOS开发函数与机制总结

最近在搞车和准备RM比赛,学习RTOS。我想是我们主要用的就是函数,主要是记函数与实际用的区别

基本概念(不全,留有印象)

RTOS的栈概念 保存现场就是保存被切换瞬间的所有寄存器

 每个任务都有自己的调用关系,栈,自己的局部变量,自己的现场(所有的CPU寄存器)。这些都是要计算的栈大小。

内存管理-堆分频-------

heap_5.c里面有片外外设。视频地址 

函数出现

xPortGetFreeHeapSize();

xPortGetMinimumEverFreeHeapSize()

 vApplicationMallocFailedHook() 

 创建任务————

xTaskCreate()

使用示例  

void Mytask(void *argument)
{
    while(1)
    {}
}

    TaskHandle_t xSoundTaskHandle;//任务句柄
    BaseType_t ret;//分辩返回值,可以不要    ret=xTaskCreate(Mytask,"myfirsttask",128,NULL,osPriorityNormal,&xSoundTaskHandle);//内存没有计算功能,这里的128是字节

动态自动分频结构体和栈 

 xTaskCreatestatic()

首先准备好栈和结构体

使用示例

  static uint32_t g_puStackofLinghtTak[128];//传进去的大小是字为单位
//如果是uint8 就是128*4。32位就不用*4了
static StaticTask_t g_TCBofLightTask;
static TaskHandle_t xSoundTaskHandle;//任务返回的是句柄或者是NULL  xSoundTaskHandle=xTaskCreateStatic(Mytask,"myfirsttask",128,NULL,osPriorityNormal,g_puStackofLinghtTak,&g_TCBofLightTask);//这里的128是指128字

 估算任务栈的大小 

栈的计算:

1返回地址LR,其他Reg:取决于函数的调用深度(5级调用*被调用者寄存器R4到R11共8个寄存器还有LR)5*9*4(byte)

2局部变量:char,int

3现场:16(寄存器)*4=64byte

创建任务知识点--提供不同的任务参数

使用同一个创建不同的任务,为了更好的说明问题我们还是看视频(本来就是基于视频做的总结)

我只将其中重要的代码抄出来做总结,当然是我个人的总结。

static struct TaskPrintInfo g_Task1Info={0,0,"Task1"};
static struct TaskPrintInfo g_Task2Info={0,3,"Task2"};
static struct TaskPrintInfo g_Task3Info={0,6,"Task3"};
static int g_LCDCANuse=1;//想达成目的一个在显示的时候另一个不能显示
void LcdPrintTask(void *params)
{
		struct TaskPrintInfo *pInfo= params;
		uint32_t cnt=0;
		int len;
		while(1)
		{
            if(g_LCDCANuse)
            {
            g_LCDCANuse=0;//占时很短
			/*打印信息*/
			len=LCD_PrintString(pInfo->x,pInfo->y,pInfo->name);
			len+=LCD_PrintString(len,pInfo->y,":");
			LCD_PrintSignedVal(len,pInfo->y,cnt);
            g_LCDCANuse=1;//占时很短
			}
             mdelay(500)//简单的延时函数,占while切换的时间。不加还不行,不然while里面只有if,那就只有task3在运行
		}
   
		
}
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */
	TaskHandle_t xSoundTaskHandle;
	BaseType_t ret;
  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* creation of defaultTask */
  //defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* 创建任务: 声 */
//  extern void PlayMusic(void *params);
//  ret = xTaskCreate(PlayMusic, "SoundTask", 128, NULL, osPriorityNormal, &xSoundTaskHandle);

//  /* 创建任务: 光 */
//  xLightTaskHandle = xTaskCreateStatic(Led_Test, "LightTask", 128, NULL, osPriorityNormal, g_pucStackOfLightTask, &g_TCBofLightTask);

//  /* 创建任务: 色 */
//  xColorTaskHandle = xTaskCreateStatic(ColorLED_Test, "ColorTask", 128, NULL, osPriorityNormal, g_pucStackOfColorTask, &g_TCBofColorTask);
		/* 使用同一个函数创建不同的任务 */
		xTaskCreate(LcdPrintTask,"task1",128,&g_Task1Info,osPriorityNormal,NULL);
		xTaskCreate(LcdPrintTask,"task2",128,&g_Task2Info,osPriorityNormal,NULL);
		xTaskCreate(LcdPrintTask,"task3",128,&g_Task3Info,osPriorityNormal,NULL);
  /* USER CODE END RTOS_THREADS */

  /* USER CODE BEGIN RTOS_EVENTS */
  /* add events, ... */
  /* USER CODE END RTOS_EVENTS */

}

提问:如何互斥地访问LCD?使用全周变量,大概率可以,但是不是万无一失
提问:为何是后面创健的task3先运行?

删除任务函数————

vTaskDelete(句柄);

举例说明

TaskHandle_t xSoundTaskHandle = NULL;//句柄初始化

              if (xSoundTaskHandle == NULL)//如果句柄没被创建,就创建任务
              {
                    LCD_ClearLine(0, 0);
                    LCD_PrintString(0, 0, "Create Task");
              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小C学Python青春版

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

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

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

打赏作者

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

抵扣说明:

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

余额充值