当前位置:   article > 正文

FreeRtos移植到STM32

freertos移植到stm32

1、freertos简介

        freertos是轻量级,简单、免费、开源的RTOS


2、源码下载

        源码仓库地址 https://gitee.com/free-rtos_1/FreeRTOS.git


3、移植条件

        本次移植代码标签为V9.0.0的节点, 移植到STM32F103VET6

        基础工程由 cubemx 生成,配置项:

                配置一路串口,用来打印日志。

                配置系统时钟为72MHZ。

                配置滴答时钟,1ms周期。

        创建OsCore文件夹,用来存放系统核心源码

        创建OsApp文件夹,用来存放系统初始化,用户任务创建,系统配置等文件


4、FreeRtos源码文件结构 

从git仓库下载下来是这样的,如下图所示:

Demo:测试验证的demo源码。

将 Demo\CORTEX_STM32F103_Keil 中的如下两个文件拷贝到工程目录下OsApp,main.c重命名为rtos_main.c


License:暂不关心。
Source:系统核心源码,重点关注,如下图所示:

Source\include: 核心源码的头文件 ,如下图所示:


Source\portable: 不同平台对应的底层操作源码,重点关注下图圈住文件夹


MemMang\*.c 内存管理相关代码,这里包含五种管理方案,我们选择heap_4.c

注意添加工程时只需要添加一种


RVDS\ARM_CM3 根据不同平台选择不同文件,本次移植到STM32F103,所以选择M3

 将 Source 中的文件拷贝到工程目录下OsCore下(绿框圈住的的全部拷贝)

 portable 根据不同平台选择性拷贝,STM32F104VET6 只需要拷贝 RVDS\ARM_CM3和MemMang中heap_4.c文件。

拷贝后完整结果如下图所示

 

 

 

5、RTOS配置

 修改FreeRTOSConfig.h中 系统时钟72MHZ,滴答时钟频率1000HZ,总堆大小17KB

6、编译

将上述文件,加入到keil工程中,编译。


7、重点接口调用 

        将 xPortPendSVHandler 接口在系统悬起中断函数中调用,如下图所示:


        将 xPortSysTickHandler 接口在系统滴答时钟函数中调用,如下图所示:

 

        将vPortSVCHandler 接口在系统服务中断函数中调用,如下图所示:

rtos_main.c创建如下测试任务

  1. /*-----------------------------------------------------------*/
  2. void vLED1Task( void *pvParameters )
  3. {
  4. static GPIO_PinState PinState = GPIO_PIN_SET;
  5. while(1)
  6. {
  7. PinState = (PinState == GPIO_PIN_SET ? GPIO_PIN_RESET : GPIO_PIN_SET);
  8. HAL_GPIO_WritePin(GPIOD, PIN_LED1_Pin, PinState);
  9. vTaskDelay(100);
  10. }
  11. }
  12. void vLED2Task( void *pvParameters )
  13. {
  14. static GPIO_PinState PinState = GPIO_PIN_SET;
  15. while(1)
  16. {
  17. PinState = (PinState == GPIO_PIN_SET ? GPIO_PIN_RESET : GPIO_PIN_SET);
  18. HAL_GPIO_WritePin(GPIOD, PIN_LED2_Pin, PinState);
  19. vTaskDelay(100);
  20. }
  21. }
  22. int rtos_main( void )
  23. {
  24. #ifdef DEBUG
  25. debug();
  26. #endif
  27. xTaskCreate( vLED1Task, "LED1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
  28. xTaskCreate( vLED2Task, "LED2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
  29. /* Start the scheduler. */
  30. vTaskStartScheduler();
  31. /* Will only get here if there was not enough heap space to create the
  32. idle task. */
  33. return 0;
  34. }

编译通过后,下载到板子,闪灯,正常运行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/730314
推荐阅读
相关标签
  

闽ICP备14008679号