目录

  • 一,移植文件
    • 1.1 建立文件夹
    • 1.2 移植底层文件
      • 1.2.1 Source
      • 1.2.2 RVDS
      • 1.2.3 MemMang
      • 1.2.4 FreeRTOSConfig.h
      • 1.2.5 user_app_task.C
    • 1.3 添加到工程,添加路径
  • 二,处理
    • 2.1 FreeRTOSConfig.h
    • 2.2 stm32f4xx_it.h
  • 三,测试
    • 3.1 main.c
    • 3.2 #include "user_app_task.c"
    • 3.3 #include "user_app_task.h"
    • 3.4 处理报错

一,移植文件

1.1 建立文件夹

工厂目录建立文件夹:FreeRTOS

1.2 移植底层文件
1.2.1 Source

路径:FreeRTOSv9.0.0\FreeRTOS\Source
除文件夹portable全部复制到FreeRTOS文件夹下。

1.2.2 RVDS

路径:FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM4F
port.c portmacro.h里面两个也复制到FreeRTOS文件夹下。

1.2.3 MemMang

路径:FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang
heap_4.c复制到FreeRTOS文件夹下。

1.2.4 FreeRTOSConfig.h

FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK
FreeRTOSConfig.h复制到FreeRTOS文件夹下。

1.2.5 user_app_task.C

user_app_task.c user_app_task.h自建函数

1.3 添加到工程,添加路径

二,处理

2.1 FreeRTOSConfig.h

改成这个

#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)#include <stdint.h>extern uint32_t SystemCoreClock;
#endif

最下面的SysTick_Handler注释掉
不注释掉会跟系统SysTick_Handler冲突

// #define xPortSysTickHandler SysTick_Handler
//这两个如果冲突,把stm32f4xx_it.h里的两个给注释掉,反正我没用到
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler


四个钩子函数关了,以后用到再开:
不关会有一堆函数未定义

#define configUSE_IDLE_HOOK              0
#define configUSE_TICK_HOOK             0
#define configCHECK_FOR_STACK_OVERFLOW  0
#define configUSE_MALLOC_FAILED_HOOK    0

加上这个:

/*****************************************************************FreeRTOS与内存申请有关配置选项
*****************************************************************/
//支持动态内存申请
#define configSUPPORT_DYNAMIC_ALLOCATION        1
//支持静态内存
#define configSUPPORT_STATIC_ALLOCATION                 1
//系统所有总的堆大小
#define configTOTAL_HEAP_SIZE                   ((size_t)(36*1024))
2.2 stm32f4xx_it.h

添加:

#include "FreeRTOS.h"
#include "task.h"void SysTick_Handler(void)
{#if (INCLUDE_xTaskGetSchedulerState == 1 )
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {#endif xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState == 1 )}
#endifSysTick_IRQHandle();//我自己的软件定时器,不用,可以注释的
}

到这算是移植成功了,也不会报错(前面都提前改了),FreeRTOS的心跳是通过SysTick_Handler连接的。

三,测试

3.1 main.c
static StackType_t AppTaskCreate_Stack[128];
static StaticTask_t AppTaskCreate_TCB;StaticTask_t Idle_Task_TCB;
StaticTask_t Timer_Task_TCB;StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];
TaskHandle_t AppTaskCreate_Handle;int main(void)
{   NVIC_Configuration();SysTick_Init();debug_Init(); AppTaskCreate_Handle = xTaskCreateStatic((TaskFunction_t )AppTaskCreate,     //任务函数(const char*  )"AppTaskCreate",     //任务名称(uint32_t         )128,   //任务堆栈大小(void*          )NULL,              //传递给任务函数的参数(UBaseType_t    )3,     //任务优先级(StackType_t*   )AppTaskCreate_Stack,    //任务堆栈(StaticTask_t*  )&AppTaskCreate_TCB); //任务控制块   if(NULL != AppTaskCreate_Handle)/* 创建成功 */vTaskStartScheduler();   /* 启动任务,开启调度 */while(1);
}
3.2 #include “user_app_task.c”
static StackType_t LED_Task_Stack[128];
static StackType_t LED1_Task_Stack[128];static StaticTask_t LED_Task_TCB;
static StaticTask_t LED1_Task_TCB;static void LED_Task(void* parameter)
{   while (1){Debug_Printf("LED_Task\r\n");vTaskDelay(2000);  }
}
static void LED1_Task(void* parameter)
{   while (1){  Debug_Printf("LED1_Task\r\n");vTaskDelay(1000);               }
}
/************************************************************************* @brief  获取空闲任务的任务堆栈和任务控制块内存*                    ppxTimerTaskTCBBuffer   :       任务控制块内存*                    ppxTimerTaskStackBuffer :   任务堆栈内存*                 pulTimerTaskStackSize   :       任务堆栈大小* @author  fire* @version V1.0* @date    2018-xx-xx***********************************************************************/
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize)
{*ppxIdleTaskTCBBuffer=&Idle_Task_TCB;/* 任务控制块内存 */*ppxIdleTaskStackBuffer=Idle_Task_Stack;/* 任务堆栈内存 */*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;/* 任务堆栈大小 */
}/************************************************************************ @brief  获取定时器任务的任务堆栈和任务控制块内存*                   ppxTimerTaskTCBBuffer   :       任务控制块内存*                    ppxTimerTaskStackBuffer :   任务堆栈内存*                 pulTimerTaskStackSize   :       任务堆栈大小* @author  fire* @version V1.0* @date    2018-xx-xx***********************************************************************/
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize)
{*ppxTimerTaskTCBBuffer=&Timer_Task_TCB;/* 任务控制块内存 */*ppxTimerTaskStackBuffer=Timer_Task_Stack;/* 任务堆栈内存 */*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;/* 任务堆栈大小 */
}void AppTaskCreate(void)
{taskENTER_CRITICAL();           //进入临界区/* 创建LED_Task任务 */xTaskCreateStatic((TaskFunction_t )LED_Task,      //任务函数(const char*  )"LED_Task",      //任务名称(uint32_t         )128,                   //任务堆栈大小(void*          )NULL,              //传递给任务函数的参数(UBaseType_t    )4,                 //任务优先级(StackType_t*   )LED_Task_Stack, //任务堆栈(StaticTask_t*  )&LED_Task_TCB);  //任务控制块   xTaskCreateStatic((TaskFunction_t )LED1_Task,     //任务函数(const char*  )"LED1_Task",     //任务名称(uint32_t         )128,                   //任务堆栈大小(void*          )NULL,              //传递给任务函数的参数(UBaseType_t    )4,                 //任务优先级(StackType_t*   )LED1_Task_Stack,    //任务堆栈(StaticTask_t*  )&LED1_Task_TCB); //任务控制块vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务taskEXIT_CRITICAL();            //退出临界区
}
3.3 #include “user_app_task.h”
extern StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
extern StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];extern StaticTask_t Idle_Task_TCB;
extern StaticTask_t Timer_Task_TCB;extern TaskHandle_t AppTaskCreate_Handle;
extern void AppTaskCreate(void);
3.4 处理报错


到这应该没什么错误了,有问题可以在下面留言大家一起讨论。
只有一条很坑爹的地方:
不能为NVIC_PriorityGroup_1我还在找原因。

STM32F429IG移植FreeRTOS相关推荐

  1. FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS

     上一次,我们简单的测试了FreeRTOS的基于IAR EWARMv6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建 ...

  2. 2.STM32F407ZGT6 学习笔记-移植 FreeRTOS

    程序移植的代码: https://gitee.com/chejia12/free-rtos_-f407.git 1. 在工程下建议FreeRTOS文件夹 2. 在FreeRTOS文件夹下建立 src ...

  3. STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)

    STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级) STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级) ...

  4. 英飞凌TC397移植FreeRTOS

    英飞凌TC397移植FreeRTOS 一.准备工作 1.FreeRTOS源码 2.STM驱动代码 3.中断相关配置文件 4.AURIX Developement Studio初始工程(包含SDK) 二 ...

  5. 【FreeRTOS】在Cortex-M4开发板上移植FreeRTOS并且实现LED灯闪烁(保姆级教程)

    相信有不少小伙伴手上只有M4的开发板,想要移植FreeRTOS:但是,网上大部分都是M3移植教程.因此,陷入深深的迷茫中,难不成只能使用仿真了???

  6. STM32F103移植FreeRTOS

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.freeROTS是什么? 二.移植FreeRTOS步骤 1.移植工具 2.第一步建立一个工程 3.第二步下载Fre ...

  7. STM32F4基础工程移植FreeRTOS

    本篇目标:基于上一篇的基础工程(stm32f4_first_demo)上,移植freertos,建立移植工程(stm32f4_freertos). 资料准备: Freertos源文件 最后工程:项目工 ...

  8. 飞思卡尔 k60/k64 移植FreeRTOS+USB

            每年七八月份是智能车大赛的比赛时间,前段时间,学校车队的学弟问我嵌入式系统的问题,于是笔者拿起多年未碰的K60/K64芯片,搭建了一个FreeRTOS+USB的系统框架.文章结尾提供源 ...

  9. GD32F310移植FreeRTOS

    [GD32F310开发板试用]GD32F310移植FreeRTOS 项目地址:https://github.com/kings669/GD32F310-FreeRTOS 环境说明 首先我先说明我的环境 ...

最新文章

  1. 怎么看待传菜机器人_太科幻了!这家顺德菜餐厅里全是机器人,炒菜送菜样样行...
  2. 快速地创建快顶尖的医学图像处理控件ImageGear Medical
  3. python卸载干净_Python卸载不干净?Mac完全卸载python方法
  4. CI学习 – header和footer
  5. 构建之法读书笔记05
  6. 数码相机成像原理CCD和CMOS及相机模组分析
  7. Java 买卖股票的最佳时机含手续费leetcode_714
  8. ion-refresher安卓移动端失效
  9. ORACLE ERP consolidation流程(二)
  10. 题解 - [POI2008]KUP-Plot purchase
  11. JAVA设计模式总结之六大设计原则(一)
  12. FILTER的使用与过滤器实现session登录案例
  13. python str转bool方法
  14. Android原生系统开发如何优雅的提供系统级的API供第三方程序调用?
  15. 云计算科普——入行半年,我这样看云计算
  16. CQJTU web学习之HTMLCSS学习总结
  17. 《浪潮之巅》以及移动互联网
  18. 金蝶K3供应链期初数据录入案例教程2
  19. 16bit 基4 fft c 语言,【C6678FFT】关于C64X与C66X DSPLIB中FFT的问题
  20. 从0到1学android:四大组件—活动Activity

热门文章

  1. 南京邮电大学计算机科学与技术分数线,南京邮电大学计算机科学与技术(中外合作办学)专业2016年在江苏理科高考录取最低分数线...
  2. windows隐藏文件dos命令
  3. Kubernetes详细教程
  4. Atals元数据治理-介绍/编译/安装
  5. 五大浏览器哪个最好用。。。
  6. Word文档如何进行加密操作
  7. 二本机械生对计算机的初次学习
  8. 百世快递api,百世快递一件代发api,百世快递礼品商城api,百世快递空包api
  9. nginx-rtmp多房间和授权实现
  10. 从日常开发说起,浅谈HTTP协议是做什么的