你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F103移植FreeRTOS经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 15:28
1.下载源码
下载FreeRTOSv9.0.0.zip解压如下图

19e323b668614914b5ff1c3650318367.png

只用关注第一个文件夹FreeRTOS中的内容
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
Source是源文件。


2.拷贝源码
在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
将Source/include文件夹拷贝到FreeRTOS下

0e6a2341df8d4aebbfc03d0c85c6f52b.png

将Source中的C文件拷贝到FreeRTOS/src下

8084ebe3b4ff42ceaf1f92bb20c56e8d.png

将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,

其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。

3d367e236be94ca5ae616b13bd3072ec.png
3.添加到工程

2529a830445449c6ae890e724efa39fe.png

新建FreeRTOS/src和FreeRTOS/port组
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和
FreeRTOS\port\RVDS\ARM_CM3中的port.c


添加头文件路径

ae4795e36a2d44f09b120be18c5d4c56.png

拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程


4.修改配置
在FreeRTOSConfig.h中添加
  1. #define xPortPendSVHandler         PendSV_Handler
  2. #define vPortSVCHandler         SVC_Handler
复制代码

在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断

最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。
  1. /**
  2.   * @brief  This function handles SysTick Handler.
  3.   * @param  None
  4.   * @retval None
  5. */
  6. extern void xPortSysTickHandler(void);
  7. void SysTick_Handler(void)
  8. {
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  11.       {
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  
  13.         xPortSysTickHandler();
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )
  15.       }
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */
  17. }
复制代码


5.验证demo
  1. #include "stm32f10x.h"
  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. #include "portmacro.h"
  5. #include "bsp_led.h"  
  6. #include "log.h"

  7. static TaskHandle_t led_task_handle = NULL;

  8. void led_task(void *arg)
  9. {
  10.         while(1)                           
  11.         {
  12.                 led_status_set(LED_STATUS_ON);
  13.                 LOG_DEBUG("LED_STATUS_ON\r\n");
  14.                 vTaskDelay(500/portTICK_PERIOD_MS);
  15.                 led_status_set(LED_STATUS_OFF);
  16.                 LOG_DEBUG("LED_STATUS_OFF\r\n");
  17.                 vTaskDelay(500/portTICK_PERIOD_MS);
  18.         }
  19. }

  20. int main(void)
  21. {
  22.         led_init();

  23.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);

  24.         // 开启调度
  25.         vTaskStartScheduler();
  26.         while(1);
  27. }

复制代码


6.完整工程

2ea8ac08b3934dfb89592333f3832937.png

————————————————
版权声明:无聊到发博客的菜鸟
如有侵权请联系删除



652df39d09bf4de399b0792b897a4205.png
收藏 评论0 发布时间:2023-5-1 15:28

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版