当前位置: 首页 > news >正文

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-RTOSosThreadNew(MainThreadFunc, NULL, &os_main_thread_attr);    // Create application main threadif (osKernelGetState() == osKernelReady) {osKernelStart();                    // 启动内核}while(1);  
}

5、实验现象

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

相关文章:

CMSIS-RTOS2 RTX5移植到GD32L233

1、CMSIS-RTOS2是什么? 关于CMSIS-RTOS2的官方描述如下: CMSIS-RTOS v2 (CMSIS-RTOS2) 为基于 Arm Cortex 处理器的设备提供通用 RTOS 接口。它为需要RTOS功能的软件组件提供了一个标准化的API,因此为用户和软件行业带…...

[网络原理] 网络中的基本概念

人生,本就是苦乐参半,这样的生活才是丰富多彩. 文章目录前言1. IP地址2. 端口号3. 协议4. 五元组5. 协议分层6. OSI七层模型7. TCP/IP协议8. 封装和分用9. 客户端与服务端10. 请求与响应前言 本章开始,我们开启网络部分的知识大门. 1. IP地址 1.定义: IP地址主要用于表示网络…...

BeanPostProcessor原理分析

文章目录一、BeanPostProcessor的作用1. 源码2. 使用案例二、Spring生命周期中的BeanPostProcessor三、BeanPostProcessor对PostConstruct的支持四、BeanPostProcessor中的顺序性五、总结一、BeanPostProcessor的作用 BeanPostProcessor提供了初始化前后回调的方法,…...

人工智能和网络安全,应该如何选择?

随着数字时代的到来,网络安全和人工智能成了科技创新产业的重要组成部分。也逐渐成了大多数人心中热门的行业选择。那么该如何抉择呢? 首先我们来了解下人工智能的发展前景: ​ 如今,人工智能技术无论是在核心技术方面&#xff0…...

Flink预加载分区维表,实时更新配置信息

当前我们的业务场景,是基于dataStream代码, 维表数据量很大, 实时性要求很高,所以采用预加载分区维表模式, kafka广播流实时更新配置。 实现方案 1:job初始化时 每个分区open 只加载自己那部分的配置&…...

大数据现在找工作难么

大数据行业工作好找还是难找不是光靠嘴说出来的结合实际,看看市场上的招聘需求和岗位要求就大致知道了 要想符合企业用人规范,学历,工作经验,掌握技能都是非常重要的~ 先来看几个招聘网站的报告数据: Boss直聘发布的…...

【Linux】学会这些基本指令来上手Linux吧

前言上篇文章介绍了一些常用的指令,这篇文章再来介绍一下Linux必须学会的指令。一.时间相关的指令ate显示date 指定格式显示时间: date %Y:%m:%d date 用法:date [OPTION]... [FORMAT]1.在显示方面,使用者可以设定欲显示的格式&am…...

【沐风老师】3DMAX交通流插件TrafficFlow使用方法详解

TrafficFlow交通流插件,模拟生成车流、人流动画。 【版本要求】 3dMax 2008及更高版本 【安装方法】 无需安装直接拖动插件脚本文件到3dMax视口中打开。 【快速开始】 1.创建车辆对象和行车路径。 2.打开TrafficFlow插件,先选择“车辆”对象&#xff0…...

c#实现视频的批量剪辑

篇首,完全没有技术含量的帖子,高手略过,只为十几年后重新捡起的我爱好玩玩。。。 起因,一个朋友说他下载了很多短视频,但只需要要其中的一小截,去头掐尾,在软件里搞来搞去太麻烦,让…...

小白怎么系统的自学计算机科学和黑客技术?

我把csdn上有关自学网络安全、零基础入门网络安全的回答大致都浏览了一遍,最大的感受就是“太复杂”,新手看了之后只会更迷茫,还是不知道如何去做,所以站在新手的角度去写回答,应该把回答写的简单易懂,“傻…...

scheduler 的使用实验对比和总结(PyTorch)

这篇文章是在完成 HW02 的过程中所产生的,是关于各 scheduler (ReduceLROnPlateau(),CosineAnnealingLR(),CosineAnnealingWarmRestarts())使用的对比实验。 起因是为了在 Kaggle 上跑出更高的成绩,但结果确…...

vue2 虚拟列表(优化版)

作用&#xff1a; 虚拟列表是优化长列表的一种手段&#xff0c;防止列表存在过多的dom元素导致页面卡顿&#xff08;包扣移动端下拉到底加载下一页这种列表加载的dom元素多了一样会卡&#xff09;。 原理&#xff1a; 如上图简单地说就是以 <div classlist-view">作…...

从应用层到MCU,看Windows处理键盘输入 [1.在应用层调试Notepad.exe (按键消费者)]

文本编辑器/文本编辑框是应用层常见的键盘处理程序。微软泄露的WinXP源码下有文本编辑器Notepad的实现&#xff1a;Microsoft_leaked_source_code\nt5src\Source\XPSP1\NT\shell\osshell\accesory\notepad文本编辑器的实现并不复杂&#xff0c;微软又(被迫)提供了Sample&#x…...

什么是大数据?大数据能做什么

大数据发现现在如火如荼&#xff0c;也吸引了很多有志人士想要加入这个行业&#xff0c;但是在正式入行之前了解大数据是什么以及能做什么是非常重要的~ 下面我们一起来看一下~ 比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff…...

Git 和 GitHub 超入门指南(四)

Git基本命令 以下是一些基本的Git命令&#xff1a; git add&#xff1a;将文件添加到Git索引中git commit&#xff1a;将索引中的文件提交到Git仓库中git status&#xff1a;查看工作目录和索引的状态git log&#xff1a;查看提交历史记录 Git高级命令 以下是一些高级的Git…...

Java 响应式编程 Reactor 框架

文章目录 Java 响应式编程 Reactor 框架FluxMono其它的关键对象Java 响应式编程 Reactor 框架 Reactor框架的核心理念是基于响应式编程的异步流处理。这意味着应用程序可以通过异步事件流来处理请求,而不是通过传统的同步请求-响应模型。在响应式编程中, 应用程序可以处理多个…...

Hazel引擎学习(十一)

我自己维护引擎的github地址在这里&#xff0c;里面加了不少注释&#xff0c;有需要的可以看看 参考视频链接在这里 很高兴的是&#xff0c;引擎的开发终于慢慢开始往深了走了&#xff0c;前几章的引擎UI搭建着实是有点折磨人&#xff0c;根据课程&#xff0c;接下来的引擎开发…...

深度学习(22):如何判断训练过程中深度学习模型损失值不再下降

2023年3月22日&#xff0c;与 chatGPT 的沟通如何判断训练过程中深度学习模型损失值不再下降在深度学习中&#xff0c;判断模型是否收敛是非常重要的&#xff0c;这可以通过监控模型损失值来实现。一般来说&#xff0c;当训练模型的损失值不再下降&#xff0c;我们就可以认为模…...

一个比较全面的C#公共帮助类

上次跟大家推荐过2个C#开发工具箱&#xff1a;《推荐一个不到2MB的C#开发工具箱&#xff0c;集成了上千个常用操作类》、《推荐一个.Net常用代码集合&#xff0c;助你高效完成业务》。 今天再给大家推荐一个&#xff0c;这几个部分代码功能有重合的部分&#xff0c;大家可以根…...

人脸识别经典网络-MTCNN(含Python源码实现)

人脸检测-mtcnn 本文参加新星计划人工智能赛道&#xff1a;https://bbs.csdn.net/topics/613989052 文章目录人脸检测-mtcnn1. 人脸检测1.1 人脸检测概述1.2 人脸检测的难点1.3 人脸检测的应用场景2. mtcnn2.1 mtcnn概述2.2 mtcnn的网络结构2.3 图像金字塔2.4 P-Net2.5 R-Net2…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...

uni-app学习笔记二十三--交互反馈showToast用法

showToast部分文档位于uniapp官网-->API-->界面&#xff1a;uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容&#xff0c;长度与 icon 取值有关。iconString否图…...