兆易创新GD32 (四)FreeRTOS 移植 与 CMSIS OS2

news2025/2/27 3:06:42

可以完全参考STM32系列的方法
FreeRTOS 逛网下载 FreeRTOS源码
https://www.freertos.org/a00104.html
GitHub地址
https://github.com/FreeRTOS/FreeRTOS-Kernel
下载后的FreeRTOS-Kernel复制到LIB文件夹下
在这里插入图片描述
在KEIL中添加文件,首先是公共部分
在这里插入图片描述
添加MDK移植文件CM4F ,F代表浮点运算单元 。R在这里插入图片描述

然后添加heep4

在这里插入图片描述

编译后提示错误
在这里插入图片描述
.\Objects\gd32_prj.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).

Hook是钩子文件是在一定的流程下空出一个位置,用户可以加入代码去增加调试信息。
正常情况下是不需要的在FreeRTOSConfig.h 中搜索HOOK,把对应的define关掉
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configUSE_MALLOC_FAILED_HOOK 0
还有一个堆栈溢出检测的HOOK
#define configCHECK_FOR_STACK_OVERFLOW 0
在这里插入图片描述
到此编译成功
文件目录如下,LIB全是GD32标准库和S启动文件
在这里插入图片描述

从新编辑一下main.c
使用FreeRTOS延时来闪烁LED灯

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

void AppLedinit(void)
{
	rcu_periph_clock_enable(RCU_GPIOC);
	
	gpio_mode_set(GPIOC,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_0);
	
	gpio_output_options_set(GPIOC,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,GPIO_PIN_0);
}
void testTask( void *pvParameters )
{
	while(1)
	{
		gpio_bit_toggle(GPIOC,GPIO_PIN_0);
		vTaskDelay(1000);
	}
}
int main(void)
{
   
	
	AppLedinit();
	/* Start the tasks defined within this file/specific to this demo. */
	xTaskCreate( testTask, "testTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL );


	/* Start the scheduler. */
	vTaskStartScheduler();

	/* Will only get here if there was not enough heap space to create the
	idle task. */
	return 0;
}

	
	
	

ARM Cortex™ 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层(英文原文为:a vendor-independent hardware abstraction layer for the Cortex-M processor series and defines generic tool interfaces–来自ARM官方定义)。 使用CMSIS,可以为处理器和外设实现一致且简单的软件接口,从而简化软件的重用、缩短微控制器新开发人员的学习过程,并缩短新设备的上市时间。软件的创建被嵌入式行业公认为主要成本系数。通过在所有Cortex-M 芯片供应商产品中标准化软件接口,这一成本会明显降低,尤其是在创建新项目或将现有软件迁移到新设备时

RTOS系统现在的种类可以说是五花八门,国内就有很多加,国外就不用说了,每家都有自己的API,所以ARM对RTOS的API做了一个统一的命名规则,在各家的RTOS上包了一层,统一了访问接口

Github 文件地址
https://github.com/ARM-software/CMSIS-FreeRTOS
在这里插入图片描述
复制include和Source到工程目录
打开,Example 工程,其主要的C文件如下红框所示
在这里插入图片描述
在我们的工程目录下,添加这两个C文件,并且包含相应的头文件目录
在这里插入图片描述
编译工程,报错。我们回到官方例程中查找一下h文件的目录,复制到本项目中

在这里插入图片描述
其目录位于ARM CMSIS Packs 复制到工程目录
在这里插入图片描述
再次编译,还是会报错找不到h文件按照这个方法补全h文件

直到RTE_Components.h
我当前用的是F450是属于ARMCM4_FP
#define CMSIS_device_header “ARMCM4_FP.h”
并且注释调最后的EVENTRECODER

编译后报错
…\LIB\CMSIS_OS\Include\freertos_os2.h(126): error: #35: #error directive: “Definition INCLUDE_xSemaphoreGetMutexHolder must equal 1 to implement Mutex Management API.”

FreeRTOSConfig.h中按照官方CMSIS例程FreeRTOSConfig.h中的配置更改

#define configCPU_CLOCK_HZ                      (SystemCoreClock)
#define configSUPPORT_STATIC_ALLOCATION         1
#define configSUPPORT_DYNAMIC_ALLOCATION        1
#define configUSE_PREEMPTION                    1
#define configUSE_TIMERS                        1
#define configUSE_MUTEXES                       1
#define configUSE_RECURSIVE_MUTEXES             1
#define configUSE_COUNTING_SEMAPHORES           1
#define configUSE_TASK_NOTIFICATIONS            1
#define configUSE_TRACE_FACILITY                1
#define configUSE_16_BIT_TICKS                  0
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#define configMAX_PRIORITIES                    56
#define configKERNEL_INTERRUPT_PRIORITY         255



#define INCLUDE_xEventGroupSetBitsFromISR       1
#define INCLUDE_xSemaphoreGetMutexHolder        1
#define INCLUDE_vTaskDelay                      1
#define INCLUDE_xTaskDelayUntil                 1
#define INCLUDE_vTaskDelete                     1
#define INCLUDE_xTaskGetCurrentTaskHandle       1
#define INCLUDE_xTaskGetSchedulerState          1
#define INCLUDE_uxTaskGetStackHighWaterMark     1
#define INCLUDE_uxTaskPriorityGet               1
#define INCLUDE_vTaskPrioritySet                1
#define INCLUDE_eTaskGetState                   1
#define INCLUDE_vTaskSuspend                    1
#define INCLUDE_xTimerPendFunctionCall          1

__WEAK 报错改为__weak

FreertosConfig.h注释掉 //#define xPortSysTickHandler SysTick_Handler

修改一下main.c

#include "gd32f4xx.h"
#include "FreeRTOS.h"
#include "task.h"
#include "cmsis_os2.h"
void AppLedinit(void)
{
	rcu_periph_clock_enable(RCU_GPIOC);
	
	gpio_mode_set(GPIOC,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_0);
	
	gpio_output_options_set(GPIOC,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,GPIO_PIN_0);
}
void testTask( void *pvParameters )
{
	while(1)
	{
		gpio_bit_toggle(GPIOC,GPIO_PIN_0);
		vTaskDelay(1000);
	}
}
int main(void)
{
   
	
	AppLedinit();
	osKernelInitialize();  /* Call init function for freertos objects (in freertos.c) */
	
	/* Start the tasks defined within this file/specific to this demo. */
	xTaskCreate( testTask, "testTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL );


	/* Start the scheduler. */
	//vTaskStartScheduler();
    osKernelStart();
	/* Will only get here if there was not enough heap space to create the
	idle task. */
	return 0;
}

	
	
	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

含抽水蓄能电站系统的调峰经济调度研究matlab程序(粒子群算法)

含抽水蓄能电站系统的调峰经济调度研究matlab程序(粒子群算法) 参考文献:抽水蓄能电站的最佳调度方案研究 调峰电源的优化调度是促进电力系统安全稳定运行,实现可靠供电的要措施。因为目前我国的调峰电源严重不足,尤其…

【畅购商城】订单模块之收货人列表

目录 构建订单服务&#xff1a;8100 收货人列表 接口 后端实现&#xff1a;JavaBean 后端实现 前端实现 构建订单服务&#xff1a;8100 步骤一&#xff1a;构建项目&#xff0c;changgou4-service-orders 步骤二&#xff1a;修改pom.xml文件&#xff0c;添加依赖 <de…

Spring核心与设计思想

文章目录Spring 是什么&#xff1f;什么是容器&#xff1f;什么是IoC&#xff1f;传统程序开发控制反转式程序开发对比总结规律理解 Spring IoCDI 概念Spring 是什么&#xff1f; 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff…

ignite集群

ignite集群 基础知识 集群中的结点 Ignite 是一个分布式系统&#xff0c;集群是标配功能。 集群中的 节点&#xff0c;有两类&#xff1a; 服务器结点。具备完全功能的结点。 客户端结点&#xff1a;这个我没有完全理解&#xff0c;但从编程的角度&#xff0c;我初步认为这个…

Jenkins-CentOS安装jenkins

CentOS安装jenkins jenkins适配的jdk版本是17和11 第一步&#xff1a;安装jdk11 &#xff08;1&#xff09;在oracle下载jdk11 jdk-11.0.16.1_linux-x64_bin.tar,放到非root用户的家目录下 &#xff08;2&#xff09;解压&#xff0c;tar -zxvf jdk-11.0.16.1_linux-x64_bin…

校园论坛设计(Java)——介绍篇

校园论坛设计&#xff08;Java&#xff09; 文章目录校园论坛设计&#xff08;Java&#xff09;0、写在前面1、项目介绍2、项目背景3、项目功能介绍3.1 总体设计图3.2 帖子模块3.3 学习模块3.4 个人信息模块3.5 数据报表模块3.6 校园周边模块3.7 用户管理模块3.8 登录注册模块4…

基于桶的排序之基数排序以及排序方法总结

基于桶的排序之基数排序以及排序方法总结 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;基于桶的排序之基数排序以及排序方法总结 CSDN&#xff1a;基于桶的排序之基数排序以及排序方法总结 说明 基于桶的排序有两种&#xff0c;分别是计数排序和基数排…

智源社区AI周刊No.107:英伟达推出Magic3D;Stable Diffusion2.0发布

汇聚每周AI热点&#xff0c;不错过重要资讯&#xff01;欢迎扫码&#xff0c;关注并订阅智源社区AI周刊。英伟达推出Magic3D&#xff0c;性能超过谷歌DreamFusion近一段时间&#xff0c;让AI生成3D点云成为业界研究的重点。谷歌曾在9月提出DreamFusion&#xff0c;引起广泛关注…

【LEACH协议】最佳簇半径的无线传感器网络分簇路由算法【含Matlab源码 2087期】

⛄一、 数据融合的LEACH协议简介 1 基于自适应数据融合的LEACH协议 1.1 基本定义和概念 无线传感器网络中的一个簇可以用一个无向加权全连通图G(V,E)来表示,V是簇中所有传感器节点的集合,E使簇中两个节点之间可以直接通信。假设顶点v∈V代表簇中的一个传感器节点,边euv(u,v)∈…

合作共赢,就在2022亚马逊云科技re:Invent全球大会

一年一度的科技狂欢盛会&#xff0c;2022年亚马逊云科技re:Invent全球大会即将于北京时间2022年11月29日盛大开启&#xff01;届时全球各领域关注“云计算圈”发展的人都将齐聚一堂&#xff0c;共同聆听5大重磅嘉宾的主题演讲&#xff0c;700前沿技术话题…… 携全球合作伙伴…

APP逆向案例之(三)sign 参数破解

说明&#xff1a;某新闻APP sign 参数 抓包发现包含内容&#xff1a; url: https://124.*.*.*/api/categorynews/lists 参数&#xff1a; 其中 sign 参数是需要变化的否则访问失败&#xff0c;其余都是固定的 page: 3, size: 10, category: -2, from: -1, lng: 116.363…

快收藏!最全GO语言实现设计模式【下】

点个关注&#x1f446;跟腾讯工程师学技术导语| 继上篇【快收藏&#xff01;最全GO语言实现设计模式】&#xff0c;本文继续列出GO语言实现的经典设计模式示例&#xff0c;每个示例都精心设计&#xff0c;力求符合模式结构&#xff0c;可作为日常编码参考&#xff0c;同时一些常…

基于遗传算法的自主式水下潜器路径规划问题附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Pycharm配置python3环境

一、打开pycharm 二、选择preferences 三、选择项目所属Python解释器&#xff0c;点击设置icon&#xff0c;选择“全部显示” 四、选择“添加”&#xff0c;选择最新的python路径进行添加 五、验证是否配置成功 打印输出内容&#xff0c;则配置成功

JMETER也会遇到加密难题,中文乱码也能一并处理

文章目录加密的接口测试导出jar包&#xff0c;放入jmeter的lib/ext扩展目录JMeter输出中文乱码总结加密的接口测试 不管是接口测试还是性能测试&#xff0c;在遇到接口有加密入参的时候&#xff0c;该怎么办&#xff1f; 毫无疑问&#xff0c;放弃自己实现的想法&#xff0c;除…

YOLOv4 NCNN 量化模型和实时推理

又搬来了大佬的啊 膜拜大佬 2021年5月7日&#xff0c;腾讯优图实验室正式推出了ncnn新版本&#xff0c;这一版本的贡献毫无疑问&#xff0c;又是对arm系列的端侧推理一大推动&#xff0c;先剖出nihui大佬博客上关于新版ncnn的优化点&#xff1a;继续保持优秀的接口稳定性和兼…

代码随想录——字符串篇

1、反转字符串 344.反转字符串 力扣题目链接 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数…

必知必会的Java多线程可算是被讲透彻了,让我们一起深入浅出多线程!

Java 提供了多线程编程的内置支持&#xff0c;让我们可以轻松开发多线程应用。 Java 中我们最为熟悉的线程就是 main 线程——主线程。 一个进程可以并发多个线程&#xff0c;每条线程并行执行不同的任务。线程是进程的基本单位&#xff0c;是一个单一顺序的控制流&#xff0c;…

计算机网络——HTTPS协议

目录 1、HTTPS是什么&#xff1f; 2、“加密”是什么&#xff1f; 3、HTTPS的加密机制 3.1、对称加密 3.2、非对称加密 3.3、“中间人问题” 1、HTTPS是什么&#xff1f; HTTPS是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层&#xff0c;进一步来保证…

23-职位分类展示平台响应式网页模板{HTML JS CSS)

扫码或搜索添加文末公众号「搞前端的半夏」&#xff1a;&#x1f357; 回复 ”网站模板“&#xff0c;免费送网站模板&#xff01; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 私信&#x1f4c4; 你还在未HTML网页设计作业头大吗&#xff1f; 你还在为自学前端&#xf…