FreeRTOS - 初探

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tq384998430/article/details/87874187

之前一直使用自己写的一个RTOS系统进行开发,出于强迫症的原因一直不愿意使用UCOS-II或者FreeRTOS,因为我想一切都掌控在自己手里,甚至写了一个的GUI系统进行人机交互系统开发,现在发现这样的局限性还是很大的,别人看不懂我的RTOS系统代码,我看不懂别人的RTOS系统代码,所以要么将我的RTOS发展为世界通用的系统,要么随波逐流使用当今主流的系统。

我决定随波逐流。很早就了解FreeRTOS是一个非常优秀的嵌入式实时操作系统,和UCOS系统类型,都是由外国牛人写出来的,可移植性、稳定性、维护更新、文档资料都非常全,至于为什么不使用UCOS-II系统,是因为UCOS-II系统一开始就分配了很大的RAM空间(很多链表),总感觉有点变扭,而且FreeRTOS是一个比较新的系统,使用的人也非常多,加上UCOS-II系统之前有用过很久,也很熟悉了,现在还是探索FreeRTOS系统。

我手上有现成的STM32F103的板子,准备直接使用这个板子能够打印串口数据就够了。下载FreeRTOS系统,官方网址:https://www.freertos.org/。下载下来的是一个压缩文件:

解压之后得到:

FreeRTOS/source contains the FreeRTOS real time kernel source code.

FreeRTOS/demo contains a pre-configured demo project for every official FreeRTOS port.

FreeRTOS-Plus contains additional FreeRTOS components and third party complementary products.  THESE ARE LICENSED SEPARATELY FROM FreeRTOS although all contain open source options.  See the license files in each respective directory for information.

上面的引自源码中的readme.txt文件内容,我们主要使用FreeRTOS文件夹中的源码即可:

扫描二维码关注公众号,回复: 5701603 查看本文章

所以说主流的就是最好的!FreeRTOS已经做了很多porting了,根本不需要我们自己做移植工作,打开Demo中的CORTEX_STM32F103_Keil工程,里面就是一个完整的STM32F103芯片的FreeRTOS例程,可以打开工程观摩一下。在我们自己的工程文件夹中创建一个freertos文件夹并复制CORTEX_STM32F103_Keil工程中的FreeRTOSConfig.h文件到freertos文件夹中去作为FreeRTOS的配置文件,然后将Source文件夹全部复制到freertos目录下,工程中模仿CORTEX_STM32F103_Keil例程添加以下源文件:

注意查看这些源文件的地址,例如这里面的port.c文件的地址为:

然后再添加头文件搜索路径:

工程配置完成之后接下来进行程序设计工作,打开工程的启动文件,将xPortPendSVHandler、xPortSysTickHandler、vPortSVCHandler中断加入到中断向量表中去:

然后在主函数文件中添加FreeRTOS.h和task.h头文件,注意必须先添加FreeRTOS.h才行,不然会报错提示。随后创建任务并启动调度:

int main(void)
{
	Initialization();
	
	/* Start the tasks defined within this file/specific to this demo. */
    xTaskCreate( Task1, "task1", 256, NULL, 2, NULL );
	xTaskCreate( Task2, "task2", 256, NULL, 1, NULL );
	
	
	/* Start the scheduler. */
	vTaskStartScheduler();
	
	while(1);
	
}

static void Task1( void *pvParameters )
{
	while(1)
	{
		printf("%s\r\n",__FUNCTION__);
		vTaskDelay(1000);
	}
}

static void Task2( void *pvParameters )
{
	while(1)
	{
		printf("%s\r\n",__FUNCTION__);
		vTaskDelay(1000);
	}
}

运行结果:

直接就可以运行了,简直不要太方便!有点不可思议了,因为我还在想Systick还没有开启呢,怎么就能运行了呢,后面看见在port.c中的vPortSetupTimerInterrupt函数中已经做了,vPortSetupTimerInterrupt又被xPortStartScheduler函数调用了 ,而在task.c中的vTaskStartScheduler函数中调用了xPortStartScheduler函数,所以在启动调度的时候会完成一系列和内核相关的初始化操作。

正常使用FreeRTOS系统的时候有很多功能需要配置和剪裁,例如最高任务优先级、系统时钟频率、时间片轮转功能、抢占任务功能等,具体的配置可以在官网上查看到:

这个页面详细说明了各种配置,可以在自己工程的FreeRTOSConfig.h文件中按需进行修改。CSDN上有一个牛人翻译了这个页面:https://blog.csdn.net/liyuanbhu/article/details/7912170,可以作为辅助查看。同时在官方提供的FreeRTOS V10.0.0 Reference Manual文档中的Chapter 7:Kernel Configuration中也有详细的说明。

 

 

 

猜你喜欢

转载自blog.csdn.net/tq384998430/article/details/87874187