RT-Thread Studio 配置使用详细教程

文章目录

  • 一、新建工程
    • 1.1 创建基于芯片的工程
      • 1.1.1 选择创建的rtt版本
      • 1.1.2 配置工程基本属性
      • 1.1.3 初创工程目录结构
      • 1.1.4 修改时钟配置
      • 1.1.5 配置调试下载器
    • 1.2 创建基于开发板的工程
  • 二、配置内核
  • 三、配置组件
  • 四、配置软件包
  • 五、适配配置
  • 六、其它问题

一、新建工程

1.1 创建基于芯片的工程

1.1.1 选择创建的rtt版本

rt-thread有标准版和nano版两种版本,标准版支持丰富的软件包和各种组件,而nano版本仅支持msh shell功能,我们本次就创建标准版本的rtt工程,以便后面使用AT组件和mqtt软件包,选择rtt版本如图所示:

在这里插入图片描述

也可以使用图标来新建,如图所示:

在这里插入图片描述

1.1.2 配置工程基本属性

在上一步点击“RT-Thread项目”后,就进入了工程基本属性的配置界面,如图所示:

在这里插入图片描述

图中各项的作用描述如下表:

序号名称描述
工程名指定新建工程的名称。如果不想让此工程保存在默认的工作空间内,可以将此栏下面的使用缺省位置去勾选然后指定工程的保存路径
工程模板RT-Thread Studio支持两种模板,一种是基于芯片,另一种是基于开发板基于芯片目前只有ST公司的处理器支持的很好;基于开发板则有很多厂家提供他们的rtt bsp sdk
RT-Thread内核版本更新了RT-Thread Studio之后,选择最新版本即可
厂商RT-Thread Studio支持的芯片厂商,目前ST处理器支持的最好
芯片系列ST处理器有F1/F3/F4/F7/H7系列的MCU,根据实际情况选择
芯片子系列当选择号了芯片系列之后,芯片子系列就会列出该系列芯片的子系列,比如STM32F103系列
芯片型号根据芯片系列芯片子系列就圈定了芯片型号的范围,我们在此范围内找到我们要开发的目标芯片,比如STM32F103ZE
控制台串口就是msh shell功能使用的串口,这里指向我们板卡上用于输出调试信息的或者其它信息的串口,百问网的调试串口使用的是USART1,引脚是PA9和PA10
调试器调试芯片的工具,通常由j-link/st-link/daplink等,根据自己手里面的工具来选择
调试接口有JTAG接口和SWD接口,根据板卡的实际设计来选择

根据这些信息和我们板卡的实际情况,我们的配置如下图所示:

在这里插入图片描述

然后点击完成,等待工程初创成功:

在这里插入图片描述

1.1.3 初创工程目录结构

工程初创成功后,得到如下图的工程,其目录结构如图所示:
在这里插入图片描述

每项对应的功能描述如下表:

序号名称描述
1RT-Thread SettingsRTT Studio内置配置工具,可以配置内核、组件、软件包,并将配置保存生成到工程中
2CubeMX SettingsRTT Stduio内置STM32CubeMX工具,用以配置ST处理器的外设
3Includes其中展示了此工程包含使用的所有头文件
4applications其中包含了用户开发的应用层的源文件,默认包含了main.c,里面实现了main函数
5drivers里面包含了基于该芯片的外设驱动源文件和头文件,不一定所有的外设都支持,还有待持续维护开发。对于不支持的外设还是要用户自己去实现驱动函数
6libraries基于该芯片的库文件,一般是由厂商提供,RTT Studio将其整理打包放到了工程目录结构中。在ST芯片的工程中有CMSIS和STM32XXX_HAL_Driver,前者是存放CMSIS标准的头文件和库文件,后者是放STM32处理器的HAL库文件
7linkscripts存放该芯片编译时的链接文件
8rt-threadrtt的内核文件和组件、软件包源文件,使用RT-Thread Settings配置的内核、组件和软件包对应的源代码会在这一级中生效
9rtconfig.hrtt的配置文件,用以表明会用到哪些内核机制、组件和软件包,使用RT-Thread Settings配置后会覆盖之前的改动,所以不建议在rtt studio中手动修改此文件

1.1.4 修改时钟配置

在前面初创工程的时候有提示说:默认的时钟使用的是HSI来配置系统时钟,如果要使用别的时钟源来配置系统时钟就要去修改drv_clk.c,我们的开发板有使用精度更高的HSE,所以我们先去修改时钟配置。

重点要关注的是这几行代码:

// 原本的代码使用的HSI
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
...
...
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;// 修改成HSI
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
...
...
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

如果不会自己配置系统时钟,就可以打开Studio中内置的CubeMX Settings去配置,然后生成工程。如何配置STM32CubeMX并且生成工程就不再多说了,我们说一说生成工程之后的事儿。

先来记录下生成工程前,我们的工程结构,特别是drivers下的文件,如图所示:

在这里插入图片描述

使用CubeMX配置完生成工程之后:

在这里插入图片描述

可以看到多出了cubemx文件夹,而且drivers下的stm32f1xx_hal_conf.h被备份成了stm32f1xx_hal_conf_bak.h,为了保证工程在studio中能够编译成功,我们需要做以下几件事:

  • 将我们需要参考的配置源码复制到rtt studio工程中,比如我们现在想要做的事情就是利用cubemx配置系统时钟,然后我们这段代码复制到drv_clk.c中,如图所示:
    在这里插入图片描述
    我们可以将cubemx目录下main.c中配置系统时钟函数中的所有内容复制到rtt工程的drv_clk.c里面去,完成对时钟的配置。其它的外设配置,特别是rtt的drivers中没有支持的外设的驱动,我们就可以利用这个方法来快速完成初始化。

  • 将我们需要的代码添加到rtt studio工程之后,为了能够编译通过,我们需要将cubemx settings生成的文件夹cubemx中的一些文件或者全部文件排除构建,比如main.c,一个工程不可能存在两个同名的.c源文件,还有新生的stm32f1xx_hal_conf.h,它是有可能缺省原本的rtt studio中使用的外设的,所以我们需要将其排除构建,为了方便,我建议是将cubemx整个目录都排除构建。如图所示:
    在这里插入图片描述

对着cubemx目录右键,然后再资源配置那里选择排除构建。将某项排除构建后,该项就会从当前的工程目录被移除,但是还是存在工程文件夹中的,没有被删除掉。如果想要回复,可以去菜单栏打开“导航”,选择“打开资源”,如图所示:

在这里插入图片描述

然后点击左下角的“显示位置”,选择“C/C++项目”:

在这里插入图片描述

这样,在“项目资源管理器”的边上就有一个“C/C++项目”,如图所示:

在这里插入图片描述

可以看到外面之前选择排除构建的cubemx就出现了,图标上有个/,表示该项不会被构建,要恢复就鼠标右键此项,将此项选择加入构建,如图所示:

在这里插入图片描述

  • 恢复hal配置头文件
    在使用cubemx配置生成代码后,drivers下的stm32f1xx_hal_conf.h变成了stm32f1xx_hal_conf_bak.h,在cubemx目录下新生了一个stm32f1xx_hal_conf.h文件,我们现在已经将cubemx目录排除构建了,现在需要将被备份的hal库配置文件还原,即重命名回来即可:
    在这里插入图片描述

经过上面的配置,构建工程,查看是否有配置错误。构建成功,那么一个工程就新建好了,可以开始后面对具体外设、内核、组件和软件包的配置了。

1.1.5 配置调试下载器

在调试或者下载程序之前,需要先去配置调试下载器,如图所示:

在这里插入图片描述

点击图中红圈中的下拉图标进行配置,根据自己实际情况选择即可。

1.2 创建基于开发板的工程

基于开发板的和基于芯片的思路是一样的,只是基于开发板的会有更多厂商的芯片可以选择,不过他们对于驱动的支持可能没有ST那样好,很多驱动需要自己去完成。

二、配置内核

双击RT-Thread Settings进入配置界面:

在这里插入图片描述

点击红圈中的左拉箭头,进入细节配置:

在这里插入图片描述

在这里可以配置内核的参数,比如Tick频率、堆栈、线程通信、内存管理等等,按需配置,和FreeRTOS中修改FreeRTOSConfig.h类似的功能。

三、配置组件

还是使用RT-Thread Settings,打开后可以看到图形界面和细节配置,组件的配置既可以通过图形界面选择点击使用,也可以在细节配置中使能配置参数:

在这里插入图片描述

可以在这些组件中右键查看配置项,必须要先使能才能进入配置项:

在这里插入图片描述

在这里插入图片描述

这些同样是根据自己的内存、外设、中间组件选用等的实际需求来选择配置。

四、配置软件包

软件包可以在RT-Thread Settings的图形界面选择“添加软件包”进入软件包搜索添加界面:

在这里插入图片描述

在这里插入图片描述

这里可以搜索软件包也可以按分类查找软件包,比如我想要SPI OLED的软件包,但是我不知道有哪些软件包且属于哪一类,那我就搜索OLED,如图所示:

在这里插入图片描述

这里显示有3种,刚好我们使用的是SSD1306,我们就点进去看一下:

在这里插入图片描述

它说现在仅支持I2C,但是我们想要的是SPI接口的,不满足,所以就不添加软件包到工程,但是这个软件包依然有参考意义,看一下别人是如何实现RTT下的SSD1306驱动的,可以尝试移植,这时候我们就可以点击边上的“github”把源码clone下来参考。

我们同样也可以去细节配置里面的软件包去配置:

在这里插入图片描述

我们以paho mqtt为例,先使能这个软件包,然后去配置细节,比如模式、堆栈、是否使用示例等。

需要注意的是,使用软件包还需要关心它的依赖项:

在这里插入图片描述

点击“依赖项”它就会告诉我们它依赖的组件和应用层有哪些。

设置好RT-Thread Settings之后,按CTRL+S保存,就会将改动添加生效到工程中,在工程的packages和rt-thread下的components中可以看到文件变化:

在这里插入图片描述

在rtconfig.h中看到具体的参数配置变化。

五、适配配置

这里我们先对前面的mqtt进行适配,使能完 AT 客户端和 MQTT 示例后编译出错:

在这里插入图片描述

在这里插入图片描述

说明在工程中我们未定义BSP_USING_I2Cx,一般BSP开头的为板级支持包,一般在 drivers/borad.h 中定义,所以我们需要到该文件下找到I2C相关定义进行配置:

在这里插入图片描述
其中有两个I2C接口,我们只需要使能其中一个,同时去找到板子相应I2C引脚,去修改引脚项即可:

在这里插入图片描述
在这里插入图片描述

再次编译,报错消失:

在这里插入图片描述

接下里是另一个适配配置:最后清空项目,然后重新构建,查看是否能变成通过,一般一开始都会有问题,需要查漏补缺一点一点的调整好。比如我在组件中使用了pwm,编译后提示了一堆找不到定时器相关的宏定义,且drv_pwm.c还有个红叉,如图所示:

在这里插入图片描述

在这里插入图片描述

类似这样的问题,先去hal_conf.h中看一下我们是否使能了芯片的定时器外设:

在这里插入图片描述

可以看到我们这里是没有放开的,将注释去掉之后重新编译,还是出错:

在这里插入图片描述

这种看提示看不出来什么,我们就去源文件看看具体情况:

在这里插入图片描述

可以看到是这个枚举类型因为没有前置宏定义变成了一个空枚举,所以编译出错。而这些BSP_USING_XXX预处理条件,有些是无法在RT-Thread Settings里面设置的,需要手动进行宏定义,我们前面说过,最好不要手动去修改rtconfig.h,所以我们将这些BSP_USING_XXX宏定义放到board.h里面宏定义,这样就避开了rtconfig.h被RT-Thread Settings覆盖修改,如图所示:

在这里插入图片描述

可以看到在board.h里面由各个组件的配置项(没有也没关系),ST这里提供了示例,只有3路PWM,如果我们是其它的,就自己添加定义就好,比如PWM12(根据自己的设计选择,这里只是举例),如图所示:

在这里插入图片描述

然后保存重新构建工程,还是提示有个错误:

在这里插入图片描述

说是没有PWM12_CONFIG,我们去源文件看看:

在这里插入图片描述

我们一开始看到这个错误会一头雾水,不知道下面该怎么办了,这时候我们就可以参考官方给的例子,他不是给了三路PWM的宏定义示例吗,我们放开一路,比如PWM1:

在这里插入图片描述

然后保存构建(因为没有修改PWM12,所以肯定会报错):

在这里插入图片描述

结果PWM1也是一样的错误,这说明官方也没有支持PWM1,如果挨个的碰运气肯定不是好方法,其实我们可以去看看这个源文件用到了哪些头文件,因为这些配置肯定是在某个头文件中会定义或者声明的:

在这里插入图片描述

这里面和PWM配置最相似看着最有关联的应该就是drv_config.h这个头文件了,我们把鼠标放在头文件名称上,按鼠标左键跳过去:

在这里插入图片描述

在这里看到了有个pwm_config.h,我们同样跳过去:

在这里插入图片描述

从这个文件中我们可以看到这些类似的PWMx_CONFIG配置,官方仅支持了PWM2/3/4/5,没有我们要使用的PWM12,那么我们就仿照这些格式,写我们自己的PWM12_CONFIG:

#ifdef BSP_USING_PWM12
#ifndef PWM12_CONFIG
#define PWM12_CONFIG                             \{                                           \.tim_handle.Instance     = TIM2,         \.name                    = "pwm12",       \.channel                 = 12             \}
#endif /* PWM12_CONFIG *![43_pwm12错误](pic/43_pwm12错误.jpg)/
#endif /* BSP_USING_PWM12 */

在这里插入图片描述

然后再保存构建工程(记得把PWM1还原):

在这里插入图片描述

我们双击这个错误跳过去看下:

在这里插入图片描述

这个意思就是说这个函数没有定义,这个函数的作用是初始化TIM PWM通道的引脚的。根据HAL库的开发经验,这个需要用户自定义,我们也可以使用cubemx配置参考下:

在这里插入图片描述

再次构建工程,就顺利通过了:

在这里插入图片描述

这是因为配置完cubemx后,stm32f1xx_hal_msp.c文件中定义了HAL_TIM_MspPostInit函数,完成了对pwm的初始化:

在这里插入图片描述

在这里插入图片描述

将开发板连接stlink烧录器并连接电脑,打开串口,点击烧录观察现象:

在这里插入图片描述
在这里插入图片描述

此时我们会发现在串口工具中敲回车没反应,是因为在main.c中将UART重新初始化了一次,所以我们需要注释掉几个初始化,但是我们会发现,每次使用cubemx配置后几个初始化会被重新打开,所以相比与cubemx生成的main.c,RTT中的main.c更为好用,但是drivers_clk中的时钟配置与main.c中的时钟息息相关,所以我们干脆将cubemx生成的main.c的时钟配置代码复制粘贴到driver_clk中,并将main.c排除构建,将RTT中的main.c添加构建

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

同时将原先cubemx生成main.c的时钟配置函数在drivers_clk中的声明删除掉

在这里插入图片描述

那么此时我们的烧录就需要展开一些工作:关掉开发板电源,将启动方式改成系统内部程序,即将红色boot的开关的on的1拨向另一端,然后打开电源,打开STM32Programmer工具,将连接方式改成UART,选择对应串口号(我这里是COM7),点击连接:

在这里插入图片描述

接着需要擦除程序,并断开连接,操作如下:

在这里插入图片描述

擦除并断开后界面如下:

在这里插入图片描述

重新将连接方式换成stlink,点击连接(在这里连接时,我发现一直连接不上stlink,我重新换了个stlink即可):

在这里插入图片描述

于是我们断开连接,烧录程序到开发板,同时打开串口观察现象:

在这里插入图片描述

这里串口会打印是因为切换到RTT的main.c,同时按下回车串口会换行

六、其它问题

我们在使用RT-Thread Studio中的CubeMX使时,由于将cubemx里面的一些文件排除了构建,特别是stm32f1xx_hal_conf.h,但是使用cubemx后关掉它的话,每次都会将原本在drivers下的stm32f1xx_hal_conf.h备份创建新的stm32f1xx_hal_conf.h,且时钟配置那里也会变成使用cubemx配置生成的SystemClock_Config函数,所以如果要使用cubemx,最好的办法是将rtt studio中的applications里面的main.c排除构建,而cubemx里面讲main.c/stm32f1xx_hal_msp.c/Inc文件夹添加构建,直接使用cubemx创建的代码:

在这里插入图片描述

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

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

相关文章

React 中的 useCallback 入门指南:是真需要,还是假怪?

在学习 React 时,很多人初步接触 useCallback 都有一个同样的疑问: “useCallback 到底是干啥的?不是简单地就是‘缓存一个函数’吗?我一直不明白它真正有什么用。” 这篇文章就来给你一个全方位、实操、有例实的 useCallback 入门…

14.计算机网络End

计算机网络end 一、概念 网络协议三要素:语法、语义、同步TCP/IP中为运输层提供服务的层级:网际层计算机网络性能指标(答5个即可): 带宽时延吞吐量往返时间(RTT)利用率 交换式以太网用户带宽&…

Next.js + Supabase = 快速开发 = 高速公路

Next.js Supabase介绍一下这2个好的,直说重点: ✅ Next.js:React 的“终极形态” 一句话概括: Next.js 是基于 React 的 Web 框架,帮你快速构建全栈应用,支持 SSR(服务端渲染)、AP…

机器学习用于算法交易(Matlab实现)

机器学习用于算法交易(Matlab实现) 摘要 随着金融市场的复杂性和交易量的不断增长,传统交易方式逐渐暴露出局限性,算法交易因其高效性和精准性已成为主流趋势。在此背景下,将机器学习融入算法交易具有重要的研究意义…

day64—回溯—组合数(LeetCode-77)

题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2: 输入&#xff1a…

机器学习与深度学习21-信息论

目录 前文回顾1.信息上的概念2.相对熵是什么3.互信息是什么4.条件熵和条件互信息5.最大熵模型6.信息增益与基尼不纯度 前文回顾 上一篇文章链接:地址 1.信息上的概念 信息熵(Entropy)是信息理论中用于度量随机变量不确定性的概念。它表示了…

chrome138版本及以上el-input的textarea输入问题

描述 项目基于vue2 element UI 问题简述&#xff1a;Chrome138及以上版本&#xff0c;把组件中的el-input的textarea的disabled属性从true设为false&#xff0c;无法输入 封装了一套表单输入组件&#xff0c;其中的textarea如下&#xff1a; <div v-if"item.type te…

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…

TASTE-Rob:推进面向任务的手-目标交互视频生成,实现可通用的机器人操作

25年3月来自香港中文大学的论文“TASTE-Rob: Advancing Video Generation of Task-Oriented Hand-Object Interaction for Generalizable Robotic Manipulation”。 本文也是在解决现有数据集和模型在面向任务的手部-目标交互视频生成方面的关键限制&#xff0c;这是为机器人模…

Trae AI IDE 全网最全的使用教程

Trae AI IDE 全网最全的使用教程 近期&#xff0c;字节发布了一款 AI Coding 产品 —— Trae&#xff0c;它是一款对标 Cursor 和 Windsurf 的全新 IDE&#xff0c;也是一款真正为中文开发者量身定制的工具&#xff0c;可谓是中文开发者的福音。 其优雅的 UI、丝滑的交互、母语…

GraspCorrect:通过视觉-语言模型引导反馈进行机器人抓握矫正

25年3月来自韩国 POSTECH 的论文 “GraspCorrect: Robotic Grasp Correction via Vision-Language Model-Guided Feedback”。 尽管机器人操作技术取得了显著进步&#xff0c;但实现一致且稳定的抓取仍然是一项根本挑战&#xff0c;常常限制复杂任务的成功执行。分析表明&…

浏览器兼容-polyfill-本地服务-优化

babel和webpack结合 npx babel src --out-dir dist --presetsbabel/preset-env 这是把src下面的东西都用babel转化一下 webpack可以和babel结合使用&#xff0c;首先下载一个这东西&#xff1a; npm install babel-loader -D webpack配置&#xff1a; const path requir…

组织结构图软件:数据驱动的可视化架构管理工具

1. 组织结构图软件概述 组织结构图概念 组织结构图是一种图形化工具&#xff0c;用于展示组织内部的层级关系、部门职能和人员分工。它通过清晰的线条和文本框连接&#xff0c;直观呈现企业或机构的架构&#xff0c;帮助管理者和员工快速理解组织的运作模式。 重要性 在企业…

大数据学习(138)-Hive数据分析3

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…

深度学习环境搭建(pycharm+yolov5)

B站 &#xff1a;道传科技上位机 观看教程 一、pycharm的安装 pycharm windows版本下载地址&#xff1a;Download PyCharm: The Python IDE for data science and web development by JetBrains 下载社区版本&#xff08;日常学习使用够用了&#xff09;&#xff0c;专业版…

K8S中应用无法获取用户真实ip问题排查

现象 领导反馈生产环境的用户ip有问题。登陆到这个页面&#xff0c;发现是所有的用户ip都是172.30.94.97&#xff0c;这是个内部网络ip. 排查过程 1 登陆到应用前端nginx&#xff0c; 查看nginx的请求日志 172.30.94.97 - - [17/Jul/2024:02:02:54 0000] "POST /***/n…

2.倒排索引

传统数据库mysql使用的是正向索引 词条是不允许重复的&#xff0c;给词条创建唯一索引&#xff0c;根据词条查找的速度就很快了。

【Android Studio】新建项目及问题解决

新建项目 按照《Android 第一行代码》中 1.3 小节的步骤创建项目。 注意&#xff1a;Minimum API Level 用于设置项目的最低兼容版本。Android 5.0 以上的系统已经占据超过了 99.9% 的 Android 市场份额&#xff0c;因此这里指定为 API 21: Android 5.0 即可。 问题解决 &…

SX1268低功耗sub-1g芯片支持lora和GFSK调制

SX1268 射频收发器是长距离无线应用的理想设备&#xff0c;支持410-810MHZ。它专为长电池寿命而设计&#xff0c;仅消耗4.2 mA的主动接收电流。SX1268 可以使用高效的集成功率放大器在490 MHz传输高达 22 dBm 的信号。在 780 MHZ时&#xff0c;SX1268 在天线端口传输10dBm的信号…

C#高级:利用反射让字符串决定调用哪个方法

一、反射的实现 using System; using System.Reflection; using System.Threading.Tasks;public class Calculator {public int Add(int a, int b){return a b;}public int Subtract(int a, int b){return a - b;}public int Multiply(int a, int b){return a * b;}public do…