我介绍了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的每个功能和使用案例,并期待一起讨论,共同提高技术。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!