本文介绍基于RTOS的程序基本框架。
一个良好的程序框架便于划分各个功能模块,不同功能模块处于不同的层次,各层次相互调用共同完成软件功能。本文基于FreeRTOS给出一个的程序基本框架。
1.目录划分
目录划分主要基于软件体系结构进行的,对于带RTOS的软件体系结构主要包含硬件层,设备驱动层(BSP层),操作系统层,应用层。对应目录分别为:
1)Drivers目录
对应设备驱动层,主要放置设备驱动源代码,如LED,按键,EEPROM等。
2)FreeRTOS目录
对应操作系统层,主要放置操作系统源代码,包含与底层硬件之间的接口(移植相关)和上层应用之间的接口(如CMSIS-RTOS2通用API接口)。
3)App目录
对应应用层,主要放置应用程序源码。
4)User目录
主要放置程序入口(如main函数)及操作系统配置相关文件(如FreeROTSConfig.h文件)。
5)Utils目录
主要放置一些工具源码。如CRC计算,插值计算等。
2.程序入口
程序入口主要是main函数的编写,其主要包括驱动初始化,操作系统初始化,应用程序初始化,然后就是启动操作系统。伪代码如下(这里使用了CMSIS-RTOS2通用API接口):
int main(void)
{
/* Init hardware */
Hardware_Init();
/* Init scheduler */
osKernelInitialize();
/* Init app */
App_Init();
/* Start scheduler */
osKernelStart();
/* We should never get here as control is now taken by the scheduler */
/* Infinite loop */
while (1)
{
}
return 0;
}
其中,
1)应用程序初始化,主要为创建任务,信号量,事件组,互斥量,消息队列等。可以放置一个文件,并将信号量等的创建,请求,释放用单独的函数进行封装后调用,避免导出全局变量。伪代码如下:
void App_Init(void)
{
/* 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) */
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}
2)操作系统启动后永不返回(除非启动出错)。
总结,本文介绍了基于RTOS的程序基本框架。