打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

我介绍了STM32CubeIDE这个强大的编程工具并基于STM32CubeMX方便地移植了FreeRTOS操作系统。不能免俗像大多数的编程教程,在这一讲中我将写一个HelloWorld程序展示下FreeRTOS,起到抛砖引玉的效果。

本程序基于的开发版是stm32f4-discovery,板载一个lcd屏幕和两个led灯。本程序的目的是建立两个任务同时运行,其中第一个任务显示在lcd屏上滚动显示文字,第二个任务是使一个led灯1s闪烁。

下面是本项目的main程序,限于篇幅还有着重点很多语句我不会过多介绍,主要是让大家体验下如何方便地调用FreeRTOS的功能

osThreadId Task1Handle;
osThreadId Task2Handle;
void HelloWorldTask(void const * argument);
void BlinkTask(void const * argument);
char str[] = "Hello World!";
int TextPos = 1;

 在声明部分我们声明了两个线程Task1Handle和Task2Handle,显示程序HelloWorldTask和Led闪烁程序BlinkTask

int main(void)
{
   /*......之前程序是对单片机进行初始化和配置*/
   osThreadDef(HelloWorld, HelloWorldTask, osPriorityNormal, 0, 2048);
   Task1Handle = osThreadCreate(osThread(HelloWorld), NULL);
   osThreadDef(blink, BlinkTask, osPriorityNormal, 0, 2048);
   Task2Handle = osThreadCreate(osThread(blink), NULL);
   /* USER CODE END RTOS_THREADS */
   /* Start scheduler */
   osKernelStart();
   /* We should never get here as control is now taken by the scheduler */
   while (1)
   {
   }
}

在main函数中,首先的一系列函数是对单片机的资源进行配置(初始化单片机rcc,初始化lcd屏幕等等),在这里我们就略过不讲了。

然后当我们使用FreeRTOS的时候我们首先需要配置需要执行的线程程序

osThreadDef(HelloWorld, HelloWorldTask, osPriorityNormal, 0, 2048);
Task1Handle = osThreadCreate(osThread(HelloWorld), NULL);

声明了第一个线程Task1Handle并让它指向显示程序HelloWorldTask

osThreadDef(blink, BlinkTask, osPriorityNormal, 0, 2048);
Task2Handle = osThreadCreate(osThread(blink), NULL);

 其次了第二个线程Task2Handle并让它指向闪烁程序BlinkTask

语句启动FreeRTOS的任务调度程序,单片机就运行起来了 

我们可以看到一般开发FreeRTOS项目的流程首先是对单片机进行初始化,然后是对需要执行的线程进行配置,最后启动任务调度,可以看到整个流程是十分清晰简洁的。同时各个线程之间耦合程度低,日后对项目进行维护时只要对相关的线程程序进行修改就行了。

本例的程序比较简单,然而在实际的项目中,有很多个线程要运行,需要对每个线程进行的堆空间大小,优先级进行配置,同时要顾及到线程间的通讯问题还有对资源的保护避免互锁等,这些都将是我们以后探讨的重点话题。FreeRTOS是非常强大的实时操作系统,可以游刃有余地解决这些问题。我希望读者通过本篇文章对FreeRTOS能有个大致的思路,如果对其中某些具体语句看不懂是正常的,我将在之后的文章中,详细介绍FreeRTOS的每个功能和使用案例,并期待一起讨论,共同提高技术。

posted on 2022-08-13 11:00  xuejianqiang  阅读(181)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033