[STM32F4] 基于stm32F407的hal库,移植FreeRTOS的具体步骤和遇到的问题

[复制链接]
8946|39
 楼主| g36xcv 发表于 2023-12-26 19:15 | 显示全部楼层
修改delay_ms()函数
  1. void delay_ms(uint16_t nms)
  2. {
  3. //    if (delay_osrunning && delay_osintnesting == 0)     /* 如果OS已经在跑了,并且不是在中断里面(中断里面不能任务调度) */
  4. //    {
  5. //        if (nms >= g_fac_ms)                            /* 延时的时间大于OS的最少时间周期 */
  6. //        {
  7. //            delay_ostimedly(nms / g_fac_ms);            /* OS延时 */
  8. //        }
  9. //        nms %= g_fac_ms;                                /* OS已经无法提供这么小的延时了,采用普通方式延时 */
  10. //    }                                       
  11. //    delay_us((uint32_t)(nms * 1000));                   /* 普通方式延时 */
  12.         uint32_t i;

  13. for (i=0; i<nms; i++)
  14. {
  15. delay_us(1000);
  16. }
  17. }
 楼主| g36xcv 发表于 2023-12-26 19:16 | 显示全部楼层
包含头文件
/* 添加公共头文件 ( ucos需要用到) */
//#include "includes.h"
#include "FreeRTOS.h"
#include "task.h"
 楼主| g36xcv 发表于 2023-12-26 19:16 | 显示全部楼层
修改中断相关文件,修改stm32f4xx_it.c文件
//void SVC_Handler(void)
//{
//}

//void PendSV_Handler(void)
//{
//}

//void SysTick_Handler(void)
//{
//  HAL_IncTick();
//}
 楼主| g36xcv 发表于 2023-12-26 19:16 | 显示全部楼层
修改FreeRTOSConfig.h文件。
#define configPRIO_BITS __NVIC_PRIO_BITS
//#define __NVIC_PRIO_BITS            4U     
#define __NVIC_PRIO_BITS              4
 楼主| g36xcv 发表于 2023-12-26 19:16 | 显示全部楼层
2.6 移除USMART调试组件
因为没有使用到 USMART 调试组件,所以把这个组件删掉。
23796658ab60decced.png
 楼主| g36xcv 发表于 2023-12-26 19:16 | 显示全部楼层
注释掉main.c中的有关USMART代码。

//#include "./USMART/usmart.h"
//int main(void){
//    usmart_dev.init(84);                /* 初始化USMART */
}
 楼主| g36xcv 发表于 2023-12-26 19:16 | 显示全部楼层
2.7 添加定时器驱动
把基本定时器工程中的TIMER文件夹,复制到移植工程中的BSP文件夹中。

96048658ab62389a6b.png
 楼主| g36xcv 发表于 2023-12-26 19:17 | 显示全部楼层
 楼主| g36xcv 发表于 2023-12-26 19:17 | 显示全部楼层
将定时器的相关驱动文件添加到工程的 Drivers/BSP 文件分组中。 46657658ab6380576a.png
 楼主| g36xcv 发表于 2023-12-26 19:17 | 显示全部楼层
3. 实验验证
把FreeRTOS例程中的demo复制到移植工程中User中。 30731658ab6464f16a.png
 楼主| g36xcv 发表于 2023-12-26 19:17 | 显示全部楼层
 楼主| g36xcv 发表于 2023-12-26 19:17 | 显示全部楼层
将demo的驱动文件添加到工程的User文件分组中。 92220658ab659d7f77.png
 楼主| g36xcv 发表于 2023-12-26 19:17 | 显示全部楼层
删减之后的部分代码如下:int main(void)
{
HAL_Init(); /* 初始化 HAL 库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为 115200 */
led_init(); /* 初始化 LED */
lcd_init(); /* 初始化 LCD */
key_init(); /* 初始化按键 */
sram_init(); /* SRAM 初始化 */
my_mem_init(SRAMIN); /* 初始化内部 SRAM 内存池 */
my_mem_init(SRAMEX); /* 初始化外部 SRAM 内存池 */
freertos_demo(); /* 运行 FreeRTOS 例程 */
}
 楼主| g36xcv 发表于 2023-12-26 19:18 | 显示全部楼层
void freertos_demo(void)
{
    xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */
                (const char*    )"start_task",          /* 任务名称 */
                (uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */
                (void*          )NULL,                  /* 传入给任务函数的参数 */
                (UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */
                (TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */
    vTaskStartScheduler();
}

void task1(void *pvParameters)
{
    while(1)
    {
        LED0_TOGGLE();                                                  /* LED0闪烁 */
        vTaskDelay(1000);                                               /* 延时1000ticks */
    }
}
void task2(void *pvParameters)
{
    while(1)
    {
                        LED1_TOGGLE();                                         /* LED1闪烁 */
                         vTaskDelay(500);                                      /* 延时500ticks */
                         
    }
}
 楼主| g36xcv 发表于 2023-12-26 19:19 | 显示全部楼层
把程序烧到开发板中,实验结果如下,可以看到与预设程序一致,红色LED,1000ms亮灭一次,蓝色LED,500ms亮灭一次.
 楼主| g36xcv 发表于 2023-12-26 19:19 | 显示全部楼层
FreeRTOS移植

4. 总结
遇到如下报大量语法错误,原因是keil编译器问题,把编译器的版本设置为V5即可。

57557658ab6d6c83bd.png
 楼主| g36xcv 发表于 2023-12-26 19:20 | 显示全部楼层
 楼主| g36xcv 发表于 2023-12-26 19:20 | 显示全部楼层
最后把程序烧到开发板中,如果LED灯没有亮,复位几次,观察LED是否亮。
sfd123 发表于 2023-12-27 08:47 | 显示全部楼层
这个不错,有详细的步骤!顶起!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部