GD32F303移植FreeRTOS

2023-05-16

GD32F303移植FreeRTOS

一、移植环境
系统:WIN7
MDK:keil v5.26
开发板:GD32F303C-EVAL
固件库:V1.0.2
FreeRTOS版本:V10.4.0
二、复制FreeRTOS到工程文件中
1> FreeRTOS简要介绍
FreeRTSO下载链接:https://www.freertos.org/a00104.html
在这里插入图片描述
将下载的文件解压,内容如下:FreeRTOS就是我们需要移植用到的,里面包含了官方移植的demo和内核文件,FreeRTOS-Plus里面包含了一些第三方的组件。
在这里插入图片描述
FreeRTOS文件夹内容如下:Demo文件夹下是官方在开发板移植好的demo,可以参考,Source文件夹下就是我们需要移植的内核文件。
在这里插入图片描述
Source文件夹内容如下:

内核文件

2> 在准备好的工程下创建一个FreeRTOS文件夹下,将1>提到的Source文件中所有的内容复制到这个文件夹下:
在这里插入图片描述
删除上图中红框中的内容,如下:
在这里插入图片描述
在当前目录下新建一个文件夹src,将红框中的内容剪切到src文件夹下,如下图:
在这里插入图片描述
进入到portable文件夹下,只保留下图三个文件夹,其余全部删除,如下图:
在这里插入图片描述
其中keil文件夹下没有可以用的内容,MemMang下是官方给的5种内存管理的方法,没有好坏之分,都有优缺点,根据需要选一种方式即可。
三、添加FreeRTOS文件到工程
1> 添加src下的文件到工程
在这里插入图片描述
2> 添加portable/MemMang/heap_4文件到工程
在这里插入图片描述
3> 添加portable/RVDS/ARM_CM4F/port文件到工程,因为GD32F303内核是Cortex-M4F内核。
在这里插入图片描述
4> 添加相应的头文件路径
在这里插入图片描述
5>编译一下,提示如下错误
在这里插入图片描述
缺少FreeRTOSConfig.h这个头文件,我们在FreeRTOS源码中复制一个将这个路径下的(FreeRTOS\FreeRTOS\Demo\CORTEX_STM32F103_Keil)FreeRTOSConfig.h文件复制到工程中,并且添加到工程中,如下图:
在这里插入图片描述
6>再次编译,提示如下错误:
在这里插入图片描述
其实就是缺少一个宏定义,这里可以在FreeRTOSConfig.h中定义一个
在这里插入图片描述
再次编译发现没有错误了。
7>写一个简单的LED任务测试一下,如下图:

#include "gd32f30x.h"
#include "led.h"
#include "systick.h"
#include <stdio.h>

#include "FreeRTOS.h"
#include "task.h"

#define LED1_TASK_PRIO    ( tskIDLE_PRIORITY + 2 )

void LED1_task(void * pvParameters);

int main(void)
{
	/* 设置优先级分组为4,16个优先级全是抢占优先级 */
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
	
	GW_LedInit(LED1);
	GW_LedInit(LED2);
	xTaskCreate(LED1_task, "LED1", configMINIMAL_STACK_SIZE, NULL, LED1_TASK_PRIO, NULL);
	/* start scheduler */
    vTaskStartScheduler();
    while(1){
    }
}
void LED1_task(void * pvParameters)
{  
    for( ;; ){
        /* toggle LED2 each 500ms */
        GW_LedToggle(LED1);
        vTaskDelay(300);
    }
}

下载到开发板,发现并没有LED运行,仿真调试发现,MCU进入了硬件中断,如下图:
在这里插入图片描述
这里我们仔细看一下,FreeRTOSConfig.h这个文件的配置,源码如下:

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. 
 *
 * See http://www.freertos.org/a00110.html
 *----------------------------------------------------------*/

#define configUSE_PREEMPTION		1
#define configUSE_IDLE_HOOK			0
#define configUSE_TICK_HOOK			0
#define configCPU_CLOCK_HZ			( ( unsigned long ) 72000000 )	
#define configTICK_RATE_HZ			( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES		( 5 )
#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE		( ( size_t ) ( 17 * 1024 ) )
#define configMAX_TASK_NAME_LEN		( 16 )
#define configUSE_TRACE_FACILITY	0
#define configUSE_16_BIT_TICKS		0
#define configIDLE_SHOULD_YIELD		1

由上面代码可以看出,这里系统时钟是需要更改的,configCPU_CLOCK_HZ这个是系统时钟,GD32F303是120Mhz的主频;configTOTAL_HEAP_SIZE设置堆得大小,这里设置了17KB的大小,而在启动代码里,堆设置了1KB,栈的大小也是设置的1KB,***注意:这三者的总和不能超过MCU自身的RAM大小。***如下图:
在这里插入图片描述
这里,我们将启动文件里的堆改成0x00000200(0.5KB),configTOTAL_HEAP_SIZE也更改成20KB,更改如下:

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include "gd32f30x.h"
/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. 
 *
 * See http://www.freertos.org/a00110.html
 *----------------------------------------------------------*/
extern uint32_t SystemCoreClock;

#define configUSE_PREEMPTION		1
#define configUSE_IDLE_HOOK			0
#define configUSE_TICK_HOOK			0
#define configCPU_CLOCK_HZ			( ( unsigned long ) SystemCoreClock )	
#define configTICK_RATE_HZ			( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES		( 5 )
#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE		( ( size_t ) ( 20 * 1024 ) )
#define configMAX_TASK_NAME_LEN		( 16 )
#define configUSE_TRACE_FACILITY	0
#define configUSE_16_BIT_TICKS		0
#define configIDLE_SHOULD_YIELD		1

接下来编译进行下载,发现依旧会进入硬件中断,这就可能让人很崩溃了,这里需要了解一下FreeRTOS在Cortex内核中如何实现任务切换的机制,这里可以参考SVC & PendSV这篇博客,总的来说,既然想实现任务切换,就需要重新写这两个函数,之后在查看一下内核文件port.c,发现这里已经帮我们写好了,那就简单了,我们将gd32f30x_it.c文件里这两个中断函数给删掉,如下:
在这里插入图片描述
这里再次进行仿真下载调试,本以为可以万事大吉了,却还是被显示狠狠打脸了,仿真发现,程序死在了下面的循环中:
在这里插入图片描述
如上图,程序死在了SVC_Handler中断这,而我们上一步是把这个函数给删了,因为在上一步操作时,我们分析,内核文件port.c中帮我们重新写了这个函数,我们找到这个对应的函数如下:
在这里插入图片描述
呵呵,这就尴尬了,官方写的这个函数名称和启动文件中的中断入口函数名称不一致,既然如此,只能让这两个函数名联系到一起才行,我们在FreeRTOS.h中添加如下代码:

#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler

这下总应该可以了吧,下载编译,发现灯点亮了,心里那个开心啊,可是下一秒哭的心都有了,创建的任务是灯闪烁,现在灯只是点亮了并没有闪烁。仿真调试,发现如下:
在这里插入图片描述
看到这个现象,心情放松了一下,和之前现象类似,那我们接着去port.c文件去找一下,果真被我找到了:如下:
在这里插入图片描述
那仿照之前的操作,在FreeRTOSConfig.h中添加:

#define xPortSysTickHandler SysTick_Handler

LED终于亮了,至此,FreeRTOS最基本的移植完成。

工程下载链接:GD32F303_FreeRTOS10400

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GD32F303移植FreeRTOS 的相关文章

  • FreeRTOS例程4-串口DMA收发不定长数据

    FreeRTOS例程4 串口DMA收发不定长数据 知乎 zhihu com
  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • 【FreeRTOS 信号量】互斥信号量

    互斥信号量与二值信号量类似 但是互斥信号量可以解决二值信号量出现的优先级翻转问题 解决办法就是优先级继承 普通互斥信号量创建及运行 参阅安富莱电子demo 互斥信号量句柄 static SemaphoreHandle t xMutex NU
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • freertos————互斥锁

    线程安全 多线程程序处于一个多变的环境 可访问的全局变量和堆数据随时可能被其他的线程改变 多个线程同时访问一个共享数据 可能造成严重的后果 出现问题的是之前移植了一个freemodbus的从站 多个任务访问全局变量保持寄存器区 导致最后读出
  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • FreeRTOS多任务调度器基础

    Cortex M4中SysTick调度器核心 Cortex M4中的中断管理 Cortex M4中影子栈指针 Cortex M4中SVC和PendSV异常 1 Cortex M4中SysTick调度器核心 systick每一次中断都会触发内
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 防止GCC LTO删除函数

    我使用 GCC ARM Embedded 和 FreeRTOS FreeRTOS具有的功能vTaskSwitchContext 仅在某些情况下使用 内联汇编代码 问题是 当我使用LTO时 GCC不考虑内联汇编代码并认为该函数没有被使用 因此

随机推荐

  • python 函数里面直接修改函数外部的全局变量

    python函数内部对全局变量进行修改 全局变量为immutable 不可变的 全局变量为mutable 可变的 全局变量为immutable 不可变的 a span class token operator 61 span span cl
  • ubuntu20.04中安装ROS系统

    自从在自己的电脑上安装了ubuntu20 04 43 window10双系统之后 xff0c 为了下一步开展研究 xff0c 所以安装ROS系统 把安装过程记录下来 xff0c 方便以后学习 亲测有效 xff01 xff01 xff01 x
  • Linux编程的第三方库引用------gcc、pkg-config与CMake一文讲解

    众所周知 linux 下库文件编译三部曲 config make makeinstall configure过程中可能会遇到无法找到某些头文件和动态库 xff1b 原因有两个 xff1a xff08 1 xff09 系统没有这些头文件和动态
  • 论文阅读 Global Localization with Object-Level Semantics and Topology

    摘要 全局定位是SLAM的核心要素 基于外观的方法虽然很成功 xff0c 但是在视觉条件随时间变化很大的环境中仍然面临许多开放的挑战 xff0c 随着时间的变化 xff0c 外观会发生巨大的变化 在本文中 xff0c 我们提出了一种集成解决
  • DOCKER VNC

    reference https www bilibili com video av882822967 以及泡泡机器人公众号文章 泡泡机器人创建了docker镜像 xff0c 极大的提升了环境配置的效率 docker 简介 准备 安装dock
  • GTSAM:使用gtsam的C++

    GTSAM 是一个在机器人领域和计算机视觉领域用于平滑 xff08 smoothing xff09 和建图 xff08 mapping xff09 的C 43 43 库 它与g2og2o不同的是 xff0c g2og2o采用稀疏矩阵的方式求
  • ROS - 用POSE展示方向或向量 vector - pose

    昨天想在rviz里用pose表示一个vector xff0c 搞了半天 Pose的属性 xff0c point是起点 xff0c orientation是表示由坐标系原点将 1 0 0 这个向量旋转到想要显示的方向所需的旋转的四元数表示 假
  • 目录导读

    SLAM基础 xff1a SLAM基础 xff1a 计算相机运动 SLAM基础 xff1a 单目初始化问题 SLAM基础 xff1a 计算相机运动 3D 2D SLAM基础 xff1a 计算相机运动 3D 3D SLAM基础 xff1a I
  • 特定标志检测算法流程-棋盘格

    ROS标定工具是采用棋盘格 xff0c 具体实现是OPENCV 将输入图像降采样到大约VGA分辨率 xff0c 并在全尺寸图像中检测校准目标角点 结合这些明显正交的职责作为一个优化 棋盘式检测在大图像上太昂贵 xff0c 所以最好在较小的显
  • 无人驾驶——激光雷达篇

    激光雷达技术简介 无人驾驶技术是多项技术的集成 xff0c 包括传感器 定位与深度学习 高精地图 路径规划 障碍物检测与规避 机械控制 系统集成与优化 能耗与散热管理等 无人车系统的感知端由不同的传感器组成 xff0c 其中包括GPS xf
  • simulink搭建简单的陷波滤波器

    simulink搭建简单的陷波滤波器 陷波滤波器的设计模型的搭建通过matlab自带软件设计的滤波器与simulink自带滤波器模块对比 陷波滤波器的设计 具体设计方法可参见这篇 xff1a 算法学习笔记之50HZ陷波滤波器设计 下面给出各
  • docker——常用指令

    docker pull url 从url拉取容器 docker run d url 后台运行镜像 xff0c 如果不存在该镜像 xff0c 则会自动下载 docker exec it 容器id bash 进入镜像容器 xff0c 容器的id
  • Realsense、kinect在ROS环境下的骨骼识别(基于NuiTrack)

    ps 出售我购买的nuitrack liecense xff0c 支持月付 在弄不明白ROS Kinectic之后的openNI之后终于还是向Nuitrack骨骼识别屈服了 xff1a 那么先看看NuiTrack是啥 xff1a https
  • 深度图像帧差法处理以及CV16UC1深度图像的存储方式

    最近为了拾取桌面上的任务目标 xff0c 采用了实时图像与背景图像相减的方法来进行 xff0c 因为采用彩色图像相减会有影子的干扰 xff0c 所以采用了深度图像 但是深度图像的Mat是CV16UC1格式的 矩阵内部数据采用uint 16格
  • Couldn't find executable named joy_node below /opt/ros/kinetic/share/joy解决方法

    最近想用joy node这个节点 xff0c 然后就通过 sudo apt get install ros kinetic joy 去安装 xff0c 然后运行rosrun joy joy node时候一直错误显示Segmentation
  • ros修改map_server地图发布的map关联的坐标系frame_id(多机器人联合建图用)

    帮师弟做多机器人联合建图的时候 遇到了map的坐标系问题如下 map server发布的 map话题包含了frame坐标系关联 想要正确的让多个机器人共同建图导航需要修改 map话题以及其绑定的frame坐标系 防止机器人之间的相互冲突 下
  • ROS传输图像带宽不够用的解决方法(realsenseD415压缩图像)

    最近在做图像的深度学习识别 xff0c 但是移动机器人上的电脑配置不够 xff0c 只能用我的电脑远程的去处理图像 xff0c 但是遇到了严重的带宽瓶颈 xff0c 按照我的电脑150Mbps的无线网卡来算 xff0c 每秒的极限传输速度就
  • dockerfile配置运行

  • 气压计高度融合—卡尔曼滤波

    实验平台 xff1a 自制飞控板 xff0c STM32F407主控 xff0c 传感器 xff1a MPU6050 MS5611 正文 xff1a 前几天看了这篇文章 xff0c 做了气压计的高度融合 http www zxiazai c
  • GD32F303移植FreeRTOS

    GD32F303移植FreeRTOS 一 移植环境 系统 xff1a WIN7 MDK xff1a keil v5 26 开发板 xff1a GD32F303C EVAL 固件库 xff1a V1 0 2 FreeRTOS版本 xff1a