发新帖我要提问
12
返回列表
打印
[STM32F4]

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

[复制链接]
楼主: g36xcv
手机看帖
扫描二维码
随时随地手机跟帖
21
g36xcv|  楼主 | 2023-12-26 19:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
修改delay_ms()函数
void delay_ms(uint16_t nms)
{
//    if (delay_osrunning && delay_osintnesting == 0)     /* 如果OS已经在跑了,并且不是在中断里面(中断里面不能任务调度) */
//    {
//        if (nms >= g_fac_ms)                            /* 延时的时间大于OS的最少时间周期 */
//        {
//            delay_ostimedly(nms / g_fac_ms);            /* OS延时 */
//        }
//        nms %= g_fac_ms;                                /* OS已经无法提供这么小的延时了,采用普通方式延时 */
//    }                                       
//    delay_us((uint32_t)(nms * 1000));                   /* 普通方式延时 */
        uint32_t i;

for (i=0; i<nms; i++)
{
delay_us(1000);
}
}

使用特权

评论回复
22
g36xcv|  楼主 | 2023-12-26 19:16 | 只看该作者
包含头文件
/* 添加公共头文件 ( ucos需要用到) */
//#include "includes.h"
#include "FreeRTOS.h"
#include "task.h"

使用特权

评论回复
23
g36xcv|  楼主 | 2023-12-26 19:16 | 只看该作者
修改中断相关文件,修改stm32f4xx_it.c文件
//void SVC_Handler(void)
//{
//}

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

//void SysTick_Handler(void)
//{
//  HAL_IncTick();
//}

使用特权

评论回复
24
g36xcv|  楼主 | 2023-12-26 19:16 | 只看该作者
修改FreeRTOSConfig.h文件。
#define configPRIO_BITS __NVIC_PRIO_BITS
//#define __NVIC_PRIO_BITS            4U     
#define __NVIC_PRIO_BITS              4

使用特权

评论回复
25
g36xcv|  楼主 | 2023-12-26 19:16 | 只看该作者
2.6 移除USMART调试组件
因为没有使用到 USMART 调试组件,所以把这个组件删掉。

使用特权

评论回复
26
g36xcv|  楼主 | 2023-12-26 19:16 | 只看该作者
注释掉main.c中的有关USMART代码。

//#include "./USMART/usmart.h"
//int main(void){
//    usmart_dev.init(84);                /* 初始化USMART */
}

使用特权

评论回复
27
g36xcv|  楼主 | 2023-12-26 19:16 | 只看该作者
2.7 添加定时器驱动
把基本定时器工程中的TIMER文件夹,复制到移植工程中的BSP文件夹中。

使用特权

评论回复
28
g36xcv|  楼主 | 2023-12-26 19:17 | 只看该作者

使用特权

评论回复
29
g36xcv|  楼主 | 2023-12-26 19:17 | 只看该作者
将定时器的相关驱动文件添加到工程的 Drivers/BSP 文件分组中。

使用特权

评论回复
30
g36xcv|  楼主 | 2023-12-26 19:17 | 只看该作者
3. 实验验证
把FreeRTOS例程中的demo复制到移植工程中User中。

使用特权

评论回复
31
g36xcv|  楼主 | 2023-12-26 19:17 | 只看该作者

使用特权

评论回复
32
g36xcv|  楼主 | 2023-12-26 19:17 | 只看该作者
将demo的驱动文件添加到工程的User文件分组中。

使用特权

评论回复
33
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 例程 */
}

使用特权

评论回复
34
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 */
                         
    }
}

使用特权

评论回复
35
g36xcv|  楼主 | 2023-12-26 19:19 | 只看该作者
把程序烧到开发板中,实验结果如下,可以看到与预设程序一致,红色LED,1000ms亮灭一次,蓝色LED,500ms亮灭一次.

使用特权

评论回复
36
g36xcv|  楼主 | 2023-12-26 19:19 | 只看该作者
FreeRTOS移植

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


使用特权

评论回复
37
g36xcv|  楼主 | 2023-12-26 19:20 | 只看该作者

使用特权

评论回复
38
g36xcv|  楼主 | 2023-12-26 19:20 | 只看该作者
最后把程序烧到开发板中,如果LED灯没有亮,复位几次,观察LED是否亮。

使用特权

评论回复
39
sfd123| | 2023-12-27 08:47 | 只看该作者
这个不错,有详细的步骤!顶起!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则