回忆杀STM32中的FreeRTOS的移植

    技术2026-04-11  5

    一、获取RTOS源码获取到的源码,并获取到需要的文件

    可以从官网获取,可以直接搜rtos,进去FreeRTOS文件夹下的Source文件夹下的内容使我们需要的FreeRTOS的所有的源文件, 啊include文件,这个文件是包含的所有的.h头文件,这是我们都需要的,我们添加的时候都需要添加到工程中去。 portable这个文件主要是不同平台下的差异化文件,比如说M3.M4等等,我使用F103zet6,就需要对应使用M3的在此文 件夹下我们需要哪些文件夹 1.MemMang文件夹:保存了硬件的内存管理文件 2.RVDS文件夹,里面保存了一些针对硬件平台的文件,此文件夹下的ARM_CM3文件夹使我们STM32F103需要的 Source文件夹下的其他.c与.h文件是我们需要的最后添加的文件夹如下图所示 以上是我们需要加载到项目中的文件,这些文件根据上面的提示能够轻松找到,但是FreeRTOSConfig.h 我们是无法找到的,我们就要从别人的DEMO中去查找,找到和我们硬件平台相近的就行 上面的DEMO文件夹有些下载源码中可能没有,因为你在官网的时候没有选择下载附带DEMO的源,这些都能在官网中获得,获取到FreeRTOSConfig.h文件加到自己的工程中吗,这个文件主要是管理全局的一个宏,能够实现一些功能的打开和关闭。也是我们配置我们的系统的地方,我们第一次移植需要使用上的话就先不管里面的那些宏是用来干什么的,我们只需要先以最简单的操作用上再说,下面开始代码的修改。

    二、修改代码

    首先我们要知道RTOS的在工程或者是硬件平台是一个什么样的理念,可能学过多线程多进程对Linux了解的更能理解一点,设计到时间片轮训管理,任务的切换等等,这些就要详细的学习RTOS的源码了,这个还是以后有时间多学学吧,首先理清楚我们要将RTOS一直到我们的平台我们要配置些什么? RTOS是已经将功能完善的一个中间层代码,他可能需要基本的底层接口,而且我们使用也是使用他给我们的接口也就是我们在RTOS的上层调用它,我们现在要做的就是将RTOS能够在我们的硬件上运行也就是配置好它的底层,其实我们提供一个心跳就可以使我们的系统跑起来,我们的逻辑跑代码是由时钟来控制寄存器来一步步完成代码的解析,而我们的RTOS就是通过心跳完成任务的调度,也就是本身的运行,某种意义上说,我们完成心跳函数的接口RTOS就能在我们的硬件上移植成功了, 下面吗看我们的操作:注意三个中断函数 #define xPortPendSVHandler PendSV_Handler #define xPortSysTickHandler SysTick_Handler #define vPortSVCHandler SVC_Handler

    这三个函数是我们单片机中的中断函数有些在我们的stm32f10x_it.c文件中声明,我们需要将它注释掉,这三个都要,然后在我们的FreeRTOSConfig.h文件中完成这三个宏的定义,也就是吧这三行复制到这个文件中就行,那么代码修改完成,是不是有点过分,这就结束了,其实不是, 这里需要注意FreeRTOSConfig.h文件中定义了时钟宏和中断周期频率,所以我们要根据这个时间配置好系统定时器的中断时间,我们一般是以1ms中断一次,也就是配置滴答定时器为1ms中断,而中断函数有RTOS来重写的,也就是我们上面复制的三个宏来完成。现在差不多就完成了,可以在主函数中创建任务了,粘贴截图,就不细说了,百度一大把详细介绍,这里只是做个笔记,说的简单点

    void vTaskStart( void * pvParameters ) { BSP_Init(); xTaskCreate( vTaskLed1, "Task Led1", 512, NULL, 1, NULL ); xTaskCreate( vTaskLed2, "Task Led2", 512, NULL, 1, NULL ); xTaskCreate( vTaskLed3, "Task Led3", 512, NULL, 1, NULL ); vTaskDelete( NULL ); } #define START_TASK_PRIO 1 //任务优先级 #define START_STK_SIZE 120 //分配任务栈大小 void start_task(void * pvParameters); //任务函数 TaskHandle_t StartTask_Handler; //任务句柄 //下面没有使用这下宏,但是写大项目的时候就不能直接用数据 //或者NULL了,最好这样定义宏 int main ( void ) { xTaskCreate( vTaskStart, //任务函数指针 "Task Start", //给任务的命名 512, //分配栈内存大小 NULL, //给任务传参 1, //任务的优先级 NULL ); //任务的句柄,别的任务可以通过这个句柄操作这个任务 vTaskStartScheduler(); //一定要有这个函数的调用,这个函数是个开关,、 //是个管理器,他是管理所有的任务的 }
    Processed: 0.010, SQL: 9