基于FreeRTOS的stm32程序初始化底层搭建(hal库)

采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。

**FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。**而且最重要的一点,freertos完全免费,而且非常方便移植,在hal库里可以直接使用。

hal库打开FreeRTOS非常方便
在这里插入图片描述
然后初始化所有需要的外设之后,进入工程
在这里插入图片描述
加入FreeRTOS之后,main初始化函数中多了两个函数:
**MX_FREERTOS_Init()**是hal库自动生成的freertos任务创建函数,其中的内容在后面会讲到
**osKernelStart()**是开启任务调度,进去看看
在这里插入图片描述
里面就是FreeRTOS提供的API中一个开启任务调度的函数vTaskStartScheduler()

任务调度开启之后,就正式进入FreeRTOS系统接管领域(其实操作系统在启动时就已经存在,只是可以这么理解),之后程序只会跑在中断和任务函数中,这时候就可以对while(1)说再见了!

那么接下来就可以创建任务函数,hal库默认生成的底层是在freertos.c文件中创建并运行任务函数
在这里插入图片描述
在freertos.c文件中可以发现前面main.c中看到的MX_FREERTOS_Init()
原函数是这样的

void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */
       
  /* 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) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

}

这其中就是自动生成了一个任务函数的创建,相当于给一个模板,你要再创建新的任务函数就按这个模板来套。
任务函数创建完成之后,那么程序怎么跑在任务函数中呢,freertos.c文件下面还有一个函数

void StartDefaultTask(void const * argument)
{
    
    

  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

这个就是hal库默认创建的任务函数StartDefaultTask执行程序的地方,任务函数初始化完成之后,任务调度开启,程序就会跑在这个任务函数里了,由于hal库只默认生成了一个任务函数,所以程序就只会跑在这一个任务函数中
那么如果要多创建几个任务函数,也就是多线程,可以按照hal库给的模板再多创建几个,但是如果这几个函数全部挤在一个freertos.c文件中,好像太冗杂了,可以这样做
创建一个Init_Task.c文件,用来做任务函数和驱动的初始化,再多加几个c文件,一般用得到几个任务函数就创建几个,这里暂时只用到两个
在这里插入图片描述
在Init_Task.c文件中进行任务函数和驱动的初始化:

osThreadId Init_TaskHandle;
osThreadId Test_TaskHandle;
osThreadId Display_TaskHandle;
void Task_Init(void);
void Driver_Init(void);
void Init_Task(void const * argument)
{
	Driver_Init();
	
	vTaskDelete(Init_TaskHandle);      //完成后取消此任务
}
void Task_Init(void)
{
osThreadDef(Init_Task, Init_Task, osPriorityHigh, 0, 128);
Init_TaskHandle = osThreadCreate(osThread(Init_Task), NULL);
	
osThreadDef(Test_Task, Test_Task, osPriorityNormal, 0, 128);
Test_TaskHandle = osThreadCreate(osThread(Test_Task), NULL);
	
osThreadDef(Display_Task, Display_Task, osPriorityNormal, 0, 128);
Display_TaskHandle = osThreadCreate(osThread(Display_Task), NULL);
}
void Driver_Init(void)
{
	
}

要注意的一点是,头文件中必须包含内核文件cmsis_os.h,内核文件中包含了任务句柄结构体,任务初始化结构体等

/// Create a thread and add it to Active Threads and set it to state READY.
/// \param[in]     thread_def    thread definition referenced with \ref osThread.
/// \param[in]     argument      pointer that is passed to the thread function as start argument.
/// \return thread ID for reference by other functions or NULL in case of error.
/// \note MUST REMAIN UNCHANGED: \b osThreadCreate shall be consistent in every CMSIS-RTOS.
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument);

/// Return the thread ID of the current running thread.
/// \return thread ID for reference by other functions or NULL in case of error.
/// \note MUST REMAIN UNCHANGED: \b osThreadGetId shall be consistent in every CMSIS-RTOS.
osThreadId osThreadGetId (void);

/// Terminate execution of a thread and remove it from Active Threads.
/// \param[in]     thread_id   thread ID obtained by \ref osThreadCreate or \ref osThreadGetId.
/// \return status code that indicates the execution status of the function.
/// \note MUST REMAIN UNCHANGED: \b osThreadTerminate shall be consistent in every CMSIS-RTOS.

到这,任务函数创建完毕
但是,如果不在main中将任务创建函数加进去,任务调度是到不了这的,所以要在main中**Task_Init()**加进去
在这里插入图片描述
这样,任务调度函数启动之后,程序就会跑在创建的几个任务函数中
其他任务函数也可以和Init_Task()一样
例如:
在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值