CMSIS-RTOS2 RTX5移植到GD32L233

1、CMSIS-RTOS2是什么?

关于CMSIS-RTOS2的官方描述如下:

CMSIS-RTOS v2 (CMSIS-RTOS2) 为基于 Arm® Cortex® 处理器的设备提供通用 RTOS 接口。它为需要RTOS功能的软件组件提供了一个标准化的API,因此为用户和软件行业带来了巨大的好处:

  • CMSIS-RTOS2 提供了许多应用所需的基本功能。
  • CMSIS-RTOS2 的统一功能集减少了学习工作,并简化了软件组件的共享。
  • 使用 CMSIS-RTOS2 的中间件组件与 RTOS 无关,并且更易于调整。
  • CMSIS-RTOS2 的标准项目模板可以附带免费提供的 CMSIS-RTOS2 实现。

CMSIS-RTOS2 是一个通用 API,与底层 RTOS 内核无关。应用程序程序员在用户代码中调用 CMSIS-RTOS2 API 函数,以确保从一个 RTOS 到另一个 RTOS 的最大可移植性。使用 CMSIS-RTOS2 API 的中间件通过避免不必要的移植工作来利用这种方法。
在这里插入图片描述

2、RTX5是什么?

全称Keil RTX5,是一个开源的、确定性的实时操作系统,实现了 CMSIS-RTOS v2 API,这是一个用于基于 Cortex-M处理器的设备的通用 RTOS 接口。
支持抢占、轮询、协作调度;已通过 PSA 认证;Apache 2.0许可证下发布的,并在GitHub上完全开放。
在这里插入图片描述

3、CMSIS-RTOS2 RTX5移植要点

(1)准备一个工程模板
(2)点击“Manage Rub-Time Environment”
在这里插入图片描述
(3)依次选择CMSIS,RTOS2,Keil RTX5 (这里用Library)
在这里插入图片描述
(4)相关代码添加到工程中
在这里插入图片描述
(5)编译报错,
在这里插入图片描述
可以看到void SVC_Handler(void)void PendSV_Handler(void)void SysTick_Handler(void)三个函数重复定义,这三个中断已经在RTOS中实现了,在gd32l23x_it文件中屏蔽掉即可。
在这里插入图片描述
(6)RTX5系统配置
通过RTX_Config.h文件配置,可以使用代码配置也可以使用配置向导配置
在这里插入图片描述
在这里插入图片描述
System Configuration:系统配置
Thread Configuration:线程配置
Timer Configuration:定时器配置
Event Flags Configuration:事件标志配置
Mutex Configuration:互斥量配置
Semaphore Configuration:信号量配置
Memory Pool Configuration:内存池配置
Message Queue Configuration:消息队列配置
Event Recorder Configuration:事件记录配置

(7)关于系统配置(System Configuration)
在这里插入图片描述
配置RTX5使用的动态内存为20480字节;
内核时钟为1000hz,默认使用的是systick;
使能RTX5轮询功能。

(8)关于线程配置(Thread Configuration)
在这里插入图片描述
默认的线程栈为512字节;
空闲线程栈为512字节;
使能栈溢出检测。

(9)CMSIS-RTOS2 API
所有的API都可以在cmsis_os2.h文件中找到。
相关文档可查看https://www.keil.com/pack/doc/CMSIS/RTOS2/html/genRTOS2IF.html。

4、CMSIS-RTOS2多任务

建立三个任务,在主任务中创建LED闪烁任务和 adc采样任务,之后主任务永久延时。

(1)主线程

uint8_t os_main_thread_stack_mem[512];

const osThreadAttr_t  os_main_thread_attr={
											.name="main",
											.priority=osPriorityLow,
											.stack_size=sizeof(os_main_thread_stack_mem),
											.stack_mem=os_main_thread_stack_mem,
										  };//线程参数
    osThreadNew(MainThreadFunc, NULL, &os_main_thread_attr);    // 创建主

//线程体
void MainThreadFunc(void *argument)
{
	LedThreadInit();
	AdcThreadInit();
	osDelay(osWaitForever);
}

(2)led线程

void LedThreadInit(void) //自定义的线程初始化函数
{
	LedInit();//led初始化函数
	osThreadNew(LedThreadFunc, NULL, NULL);    // 创建线程
}
//线程体
void LedThreadFunc(void *argument)
{
	while(1)
	{
		printf("\r\nLED %s\r\n",gpio_output_bit_get(GPIOA,GPIO_PIN_7 | GPIO_PIN_8)?"on":"off");
		gpio_bit_toggle(GPIOA, GPIO_PIN_7 | GPIO_PIN_8);
		osDelay(500);
	}
}

(3)adc采样线程

const osThreadAttr_t os_adc_thread_attr={
											.name="adc",
											.priority=osPriorityNormal2,
										};//adc线程参数

void AdcThreadInit(void)   //自定义的线程初始化函数
{
	AdcInit();//adc初始化函数
	osThreadNew(AdcThreadFunc,NULL,&os_adc_thread_attr); //创建线程
}
//线程体
void AdcThreadFunc(void *argument)
{
	float temperature=0;
	uint16_t ref=0;
	float Vdd=0;
	
	while(1)
	{
		ref=AdcSample(ADC_CHANNEL_17);
	
		Vdd=1.2/(float)ref*4095;
		
		printf("\r\nVdd=%.3f V\r\n",Vdd);
		printf("Channel 1=%.3fV\r\n",AdcSample(ADC_CHANNEL_1)*Vdd / 4095);
		temperature = ((float)((int16_t)AdcSample(ADC_CHANNEL_16) - (*(int16_t *)(0x1FFFF7F8)))* Vdd / 4095 * 1000 / Vdd) + 30;

		printf("Temp=%.3f\r\n\r\n",temperature);
		
		osDelay(2000);
	}
}

(4)主函数

int main(void)
{
    SerialInit();
	printf("GD32L233:%s,%s\r\n\r\n",__DATE__,__TIME__);
	
	osVersion_t ver;
	char id[20];
	
	osKernelGetInfo(&ver,id,sizeof(id));//获取版本并打印
	
	printf("\r\nVersion api:%d,kernel:%d, %s\r\n",ver.api,ver.kernel,id);
	
	osKernelInitialize();                 // 初始化 CMSIS-RTOS
	
    osThreadNew(MainThreadFunc, NULL, &os_main_thread_attr);    // Create application main thread

	if (osKernelGetState() == osKernelReady) 
	{
		osKernelStart();                    // 启动内核
	}
	while(1);  
}

5、实验现象

在这里插入图片描述
可以看出CMSIS-RTOS2API版本为2.1.3,RTX5内核版本为5.5.2;
LED 500ms闪烁一次,adc2000ms采样一次。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb《三》Request请求转发与Response响应

🍎道阻且长,行则将至。🍓 本文是javaweb的第三篇,介绍了Request请求转发与Response响应。 上一篇:JavaWeb《二》Servlet、Request请求 下一篇:敬请期待 目录一、Request请求转发🍏二、Response对…

FPGA基于RIFFA实现PCIE采集ov5640图像传输,提供工程源码和QT上位机

目录1、前言2、RIFFA理论基础3、设计思路和架构4、vivado工程详解5、上板调试验证并演示6、福利:工程代码的获取1、前言 PCIE是目前速率很高的外部板卡与CPU通信的方案之一,广泛应用于电脑主板与外部板卡的通讯,PCIE协议极其复杂&#xff0c…

探索css渐变-实现饼图-加载图-灯柱

文章目录linear-gradient()线性渐变radial-gradient()圆形渐变conic-gradient() 锥形渐变锥形渐变实现加载动画渐变实现发廊灯柱css的渐变分为三种: 线性渐变:linear-gradient() 圆形渐变:radial-gradient() 锥形渐变:conic-gradi…

C#等高级语言运行过程

C#等高级语言运行流程:假设您编写了一个 C# 程序并将其保存在一个称为源代码的文件中。特定于语言的编译器将源代码编译成 MSIL(Microsoft 中间语言),也称为 CIL(通用中间语言)或 IL(中间语言&a…

Python基础总结

目录 Python数据容器 list(列表) tuple(元祖) str(字符串) 数据容器(序列)的切片 set(集合) dict(字典、映射) 数据容器对比: Python函数 多个返回值: 函数多种传参: 匿名函数: lambda匿名函数: Python文…

小菜鸟Python历险记:(第四集)

今天写的文章是记录我从零开始学习Python的全过程。在Python中函数是非常重要的,这里也可以称为方法。在前面分享的几篇文章中用到的方法有print(),str(),int().这些都是方法,而除了上面写的这几种内置方法以外,我们也可以自己在程序中自定义…

Java分布式事务(九)

文章目录🔥XA强一致性分布式事务实战_Atomikos介绍🔥XA强一致性分布式事务实战_业务说明🔥XA强一致性分布式事务实战_项目搭建🔥XA强一致性分布式事务实战_多数据源实现🔥XA强一致性分布式事务实战_业务层实现&#x1…

JS判断是否为base64字符串如何转换为图片src格式

需求背景 : 如何判断后端给返回的 字符串 是否为 base-64 位 呢 ? 以及如果判断为是的话,如何给它进行转换为 img 标签可使用的那种 src 格式 呢 ? 1、判断字符串是否为 base64 以下方法,可自行挨个试试,…

蓝桥杯倒计时 | 倒计时20天

作者🕵️‍♂️:让机器理解语言か 专栏🎇:蓝桥杯倒计时冲刺 描述🎨:蓝桥杯冲刺阶段,一定要沉住气,一步一个脚印,胜利就在前方! 寄语💓&#xff1a…

第十四届蓝桥杯三月真题刷题训练——第 16 天

目录 第 1 题:英文字母 问题描述 输入格式 输出格式 样例输入 1 样例输出 1 样例输入 2 样例输出 2 评测用例规模与约定 运行限制 代码: 第 2 题:单词分析 题目描述 输入描述 输出描述 输入输出样例 运行限制 数组代码&…

【MySQL】聚合查询

目录 1、前言 2、插入查询结果 3、聚合查询 3.1 聚合函数 3.1.1 count 3.1.2 sum 3.1.3 avg 3.1.4 max 和 min 4、GROUP BY 子句 5、HAVING 关键字 1、前言 前面的内容已经把基础的增删改查介绍的差不多了,也介绍了表的相关约束, 从本期开始…

C语言实现队列(Push Pop Size Front EmptyBack)

队列是一个重要的数据结构,他的特性是先进先出,所以由于这个特性,队列只有一个入口和一个出口,所以只有push和pop 下面我们看一下他如何实现 首先我们来看一下他的结构体 这里我们看到我们定义了两个结构体,其中一个…

关于多层板,你了解多少?

01 前言 大家好,我是张巧龙。好久没写原创了,记得之前刚接触PCB时,还在用腐蚀单层板,类似这种。 慢慢随着电子产品功能越来越多,产品越来越薄,对PCB设计要求越来越高了,复杂程度也随之增加。因此…

第十四届蓝桥杯三月真题刷题训练——第 17 天

目录 第 1 题:ASC 运行限制 代码: 第 2 题:递增三元组_双指针_long 输出描述 输入输出样例 运行限制 代码: 第 3 题:环境治理 代码: 第 4 题:小球称重 代码: 第 1 题&a…

小白学Pytorch系列--Torch API (7)

小白学Pytorch系列–Torch API (7) Comparison Ops allclose 此函数检查输入和其他是否满足条件: >>> torch.allclose(torch.tensor([10000., 1e-07]), torch.tensor([10000.1, 1e-08])) False >>> torch.allclose(torch.tensor([10000., 1e-…

48天强训 Day1 JavaOj

48天强训 & Day1 & JavaOj 1. 编程题1 - 组队竞赛 组队竞赛_牛客笔试题_牛客网 (nowcoder.com) 1.1 读题 1.2 算法思想基础 我们应该尽量的让每一个队伍的中间值都最大化~我们应该尽量的让每一个队伍的最小值都足够小~前33%的不应该都作为每个队伍的最大值~ 接下来…

LeetCode算法 不同路径 和 不同路径II C++

目录题目 不同路径参考答案题目 不同路径II参考答案题目 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finis…

Git 入门最佳实践

Git 入门最佳实践 前言 Git简介 实用主义 深入探索 总结 参考资料 前言 Git 是程序员学习和工作都离不开发工具,今天和大家分享 Git 常用命令总结。 Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优…

【Java】UDP网络编程

文章目录前言DatagramSocketDatagramPacket注意事项与区别代码演示前言 UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层。 UDP是面向非连接的协议,它不与对方建立连接,而是直接把我要发的数据报发给对…

html+css 实现 熊猫样式

效果 html代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible"…