keil5使用c++编写stm32控制程序

news2024/11/25 4:29:57

keil5使用c++编写stm32控制程序

  • 一、前言
  • 二、配置图解
  • 三、std::cout串口重定向
  • 四、串口中断服务函数
  • 五、结尾废话

一、前言

想着搞个新奇的玩意玩一玩来着,想用c++编写代码来控制stm32,结果在keil5中,把踩给我踩闷了,这里简单记录一下。注意一定要按照如下流程进行操作,一步都不要跟丢了。

二、配置图解

所需要的一些文件放在百度网盘了。
先把最新的库函数和CMSIS安装好。
我这里为了方便就直接安装在了keil5的文件夹路径里。
在这里插入图片描述

废话不多说,直接上图解。
在这里插入图片描述
记得把use microlib的勾选去掉。配置和我图片上一样就没问题。

在这里插入图片描述
那这样配置过后会不会就好用了?当然不是,还要使用最新的标准库函数才行。
如何配置以后方便移植勒?当然是这样操作啦。
这里用的是普中科技32f103zet6板子的案例教程。
如图,找到你工程目录下的CMSIS把之前老版本的删除掉。
在这里插入图片描述
注意自己找到你最新的CMSIS的安装路径。
再把你Keil_v5\ARM\Packs\ARM\CMSIS\5.9.0\CMSIS\Core\Include里边的文件全部复制过去。
在这里插入图片描述
在把Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\Include里边的system_stm32f10x.hKeil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\Source里边的system_stm32f10x.c复制出来。 然后再继续在Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\Source\ARM找到你对应单片机的后缀文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后你工程目录的CMSIS下边就应该是这些文件。
在这里插入图片描述
2.再把Libraries下的STM32F10x_StdPeriph_Driver里的inc和src文件替换为最新的固件库的。
安装的最新的固件库的文件位置在Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\StdPeriph_Driver里。
在这里插入图片描述
3.替换user文件下的如下文件
在这里插入图片描述
找到文件路径在Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\StdPeriph_Driver\templates文件下
在这里插入图片描述
在找打之前的Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\Include里的这个文件在这里插入图片描述
用这些把之前的文件替换掉就行。
在这里插入图片描述
接下来先把你工程中的一些c结尾文件按如下配置
在这里插入图片描述

就可以编译运行了,但是直接运行会报错。
在这里插入图片描述
建议先进入stm32f10x_conf.h文件中把
”#include "RTE_Components.h"注释掉,因为我们按照做模板的配置操作的,没有进入之前的动态环境中去配置东西,如果选择了如下配置的东西就会在你的工程文件下生成RTE的一个文件夹。如果你选择了这样操作的话就不会报这个错误。如果要配置的话记得把依赖勾选完整,如果依赖勾选正确会显示绿色,如果不正确会显示黄色,这里不在赘述,纯粹是为你满足你们的好奇心。

当然现在也可以不用管,因为后边会配置自定义的串口输出,会勾选一些配置,到时候他就会自动生成这个RTE_Components.h所需要的环境。
在这里插入图片描述
在这里插入图片描述

这下配置好了,浅浅的点个灯吧,点灯大师已经准备上线了,直接操作。

写个led.h

/*  LED时钟端口、引脚定义 */
#ifndef _led_H
#define _led_H

#include "system.h"

#define LED_PORT 			GPIOC   
#define LED_PIN 			(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
#define LED_PORT_RCC		RCC_APB2Periph_GPIOC

//这里是stm32的管脚的按位操作。
#define led1 PCout(1)  	//D2指示灯连接的是PC1管脚
#define led2 PCout(2)  	//D2指示灯连接的是PC2管脚

#ifdef __cplusplus

class Led{
public:
    Led(){LED_GPIO_Config();}
    void LED_GPIO_Config(void);
    void TurnOn( u16 port, bool status);
    ~Led(){std::cout<<std::move("I am relased!")<<std::endl;};
private:
	
};

#endif

在写个led.cpp

#include "led.h"

void Led::LED_GPIO_Config()
{
	GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
	
	RCC_APB2PeriphClockCmd(LED_PORT_RCC, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = LED_PIN;  //选择你要设置的IO口
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	 //设置推挽输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	  //设置传输速率
	GPIO_Init(LED_PORT, &GPIO_InitStructure); 	   /* 初始化GPIO */
	
	GPIO_SetBits(LED_PORT, LED_PIN);   //将LED端口拉高,熄灭所有LED
	
}

void Led::TurnOn(u16 port, bool status)
{
  if(status){
	GPIO_ResetBits(LED_PORT, port);}  //将LED端口拉高,熄灭所有LED
  else{
    GPIO_SetBits(LED_PORT, port);}
}

再写个main.cpp

#include "system.h"

int main(void)
{
	SysTick_Init(72);
	std::shared_ptr<Led> led = std::make_shared<Led>();
	while(1)
	{
		led1 = !led1;
		delay_ms(500);
		led->TurnOn(GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7, false);
		delay_ms(500);
		led->TurnOn(GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7, true);
		delay_ms(500);
	}
	return 0;
}

啊哈,好了,恭喜你成功成为一名光荣的点灯工程师。

单纯点灯

三、std::cout串口重定向

既然都用到c++了,那么这个特色的输出肯定不能放过,那么怎么使用它把信息通过串口输出到上位机上啊,别急,一步一步来,showtime!

1.先点击这个运行环境配置图标在这里插入图片描述
2.依次进入Compiler->I/O,将里面的都勾选上,其实也不用就勾选个STDOUT我感觉就可以了,当然勾上也没有什么影响,并将variant列依次选择如下图所示:
在这里插入图片描述
这里配置完成后,需要你在你自己的usart.h文件中实现

#ifdef __cplusplus
extern "C"
{
#endif
    int stdout_putchar(int ch);
    int stderr_putchar(int ch);
#ifdef __cplusplus
}
#endif

usart.cpp函数中实现

//标准输出流
int stdout_putchar(int ch)
{
		USART_SendData(USART1,(u8)ch);
		while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){};
    return ch;
}

标准错误流
int stderr_putchar(int ch)
{
    while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET);
    return (int)USART_ReceiveData(USART1);
}

这样你就可以直接在main.cpp中调用函数了。这次点灯加上串口通信。

#include "system.h"

int main(void)
{

	SysTick_Init(72);

	Init_Usart();

	std::shared_ptr<Led> led = std::make_shared<Led>();

	while(1)
	{
		led1 = !led1;
		delay_ms(500);
		led->TurnOn(GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7, false);
		delay_ms(500);
		led->TurnOn(GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7, true);
		delay_ms(500);
		std::cout<<std::move("================Usart_Test=================")<<std::endl;
	}
	return 0;
}

这里多说几句,这c++在这里keil里边有些特性和标准的c++不太一样,这里的我就不过多阐述,待你们使用的时候自然就明白了。

打开你的串口调试助手就可以得到如下的信息。
在这里插入图片描述
哇哦,不仅现在点灯成功了,还玩明白了这个c++重定向串口输出了。

四、串口中断服务函数

那么接下来再试一试串口中断服务函数咋样?
这个有个坑哈,坑了我一天多,给我人搞麻木了,注意这个c++的编译后的中断服务函数代码和原来stm32库函数开发的中断向量表对不上,导致无法进入中断服务函数。
只需要在前面加上extern "C"即可链接原来stm32库函数中的中断服务函数了。
在这里插入图片描述
这里咱们上点强度,使用GM65二维码扫描器来和控制小灯的亮和灭。并把读取到的二维码数据上传到pc。这里串口收发数据频繁的话可以使用DMA功能,我这里就不做演示了,为啥?因为我这数据接收并不频繁,又不用去搞什么优化,摸摸鱼啦。都很简单随便找个教程看一看就行了。我就不写了。
usart.h

#ifndef __usart_H
#define __usart_H

#include "system.h" 

//串口1
#define USART1_GPIO_PORT      GPIOA
#define USART1_GPIO_CLK       RCC_APB2Periph_GPIOA
#define USART1_TX_GPIO_PIN    GPIO_Pin_9
#define USART1_RX_GPIO_PIN    GPIO_Pin_10

//串口2
#define USART2_GPIO_PORT      GPIOA
#define USART2_GPIO_CLK       RCC_APB2Periph_GPIOA
#define USART2_TX_GPIO_PIN    GPIO_Pin_2
#define USART2_RX_GPIO_PIN    GPIO_Pin_3

#define BUFFER_SIZE 32 // 定义数组缓冲的最大长度

#ifdef __cplusplus
extern "C"
{
#endif
	
    int stdout_putchar(int ch);
    int stderr_putchar(int ch);
		void usart_init(unsigned int baud);
		void usart_init2(unsigned int baud);
		void Init_Usart(void);
		void USART_Send_Byte(USART_TypeDef* USARTx, uint16_t Data);
		void USART_Send_String(USART_TypeDef* USARTx, char *str);
#ifdef __cplusplus
}
#endif
#endif

usart.cpp

#include "usart.h"		 

bool RxState{0};
u8 uart2_len{0}; //数据长度,uart2_len+1加上帧尾

u8 RxCounter{0};

u8 RxBuffer[BUFFER_SIZE]{0};

u16 check; 

//标准输出流
int stdout_putchar(int ch)
{
		USART_SendData(USART1,(u8)ch);
		while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET){};
    return ch;
}

标准错误流
int stderr_putchar(int ch)
{
    while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET);
    return (int)USART_ReceiveData(USART1);
}

	
void usart_init(unsigned int baud)
{
    GPIO_InitTypeDef GPIO_Init_Structure;                            //定义GPIO结构体
    USART_InitTypeDef USART_Init_Structure;                          //定义串口结构体
	NVIC_InitTypeDef  NVIC_Init_Structure;														//定义中断结构体
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
    RCC_APB2PeriphClockCmd(USART1_GPIO_CLK,  ENABLE);                 //开启GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,  ENABLE);          //开启USART1时钟
    
    //配置PA9  TX
    GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                //复用推挽
    GPIO_Init_Structure.GPIO_Pin   = USART1_TX_GPIO_PIN;
    GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_50MHz;    
    GPIO_Init( USART1_GPIO_PORT, &GPIO_Init_Structure);
    
    //配置PA10 RX
    GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;                //复用推挽
    GPIO_Init_Structure.GPIO_Pin   = USART1_RX_GPIO_PIN;
    GPIO_Init( USART1_GPIO_PORT, &GPIO_Init_Structure);
    //串口相关配置
  	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);																					//串口中断配置
    USART_Init_Structure.USART_BaudRate = baud;                                          //波特率设置为9600
    USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无
    USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发
    USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位
    USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位
    USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位   
    USART_Init(USART1, &USART_Init_Structure);                                             //初始化	
    USART_Cmd(USART1, ENABLE);                                                            //串口使能
		
		//中断结构体配置
	NVIC_Init_Structure.NVIC_IRQChannel 			=   USART1_IRQn;
	NVIC_Init_Structure.NVIC_IRQChannelCmd   	=   ENABLE;
	NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  =  0;
	NVIC_Init_Structure.NVIC_IRQChannelSubPriority         =  1;
	NVIC_Init(&NVIC_Init_Structure);
   
}


void usart_init2(unsigned int baud)
{
    GPIO_InitTypeDef GPIO_Init_Structure;                            //定义GPIO结构体
    USART_InitTypeDef USART_Init_Structure;                          //定义串口结构体
    NVIC_InitTypeDef  NVIC_Init_Structure;														//定义中断结构体
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
    RCC_APB2PeriphClockCmd(USART2_GPIO_CLK,  ENABLE);                 //开启GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,  ENABLE);          //开启USART1时钟
    
    //配置PA2 TX
    GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                //复用推挽
    GPIO_Init_Structure.GPIO_Pin   = USART2_TX_GPIO_PIN;
    GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_50MHz;
    
    GPIO_Init( USART2_GPIO_PORT, &GPIO_Init_Structure);
    
    //配置PA3 RX
    GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;                //复用推挽
    GPIO_Init_Structure.GPIO_Pin   = USART2_RX_GPIO_PIN;
    GPIO_Init( USART2_GPIO_PORT, &GPIO_Init_Structure);
	
    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);	
    USART_Init_Structure.USART_BaudRate = 9600;                                          //波特率设置为9600
    USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无
    USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发
    USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位
    USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位
    USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位  
    USART_Init(USART2, &USART_Init_Structure);  
    USART_Cmd(USART2, ENABLE);
		
		//中断结构体配置
	NVIC_Init_Structure.NVIC_IRQChannel 			=   USART2_IRQn;
	NVIC_Init_Structure.NVIC_IRQChannelCmd   	=   ENABLE;
	NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  =  0;
	NVIC_Init_Structure.NVIC_IRQChannelSubPriority         =  3;
	NVIC_Init(&NVIC_Init_Structure);
}


//二个串口初始化函数
void Init_Usart(void)
{
	usart_init(9600);
	usart_init2(9600);
}

/**
 * 功能:串口写字节函数
 * 参数1:USARTx :串口号
 * 参数2:Data   :需写入的字节
 * 返回值:None
 */
void USART_Send_Byte(USART_TypeDef* USARTx, uint16_t Data)
{
    USART_SendData(USARTx, Data);
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE)==RESET);
}
/**
 * 功能:串口写字符串函数
 * 参数1:USARTx :串口号
 * 参数2:str    :需写入的字符串
 * 返回值:None
 */
void USART_Send_String(USART_TypeDef* USARTx, char *str)
{
    uint16_t i=0;
    do
    {
        USART_Send_Byte(USARTx,  *(str+i));
        i++;
    }
    while(*(str + i) != '\0');
        
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}

/*
void USART1_IRQHandler(void)
{
	volatile char temp;
	if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)
	{
		temp = USART_ReceiveData(USART1);
		
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);	//清空标志位
	}
}
*/

unsigned short CRC16_XMODEM(unsigned char *puchMsg, unsigned int usDataLen)
{
		unsigned short wCRCin = 0x0000;
		unsigned short wCPoly= 0x1021;
		unsigned char wChar = 0;
		while (usDataLen--)
		{
			wChar = *(puchMsg++);//4,1 3,2 3,3, 1,4 1,5
			wCRCin ^=(wChar << 8);
				
			for(auto i = 0; i< 8; ++i)
		   {	
				if(wCRCin & 0x8000)
				{
				   wCRCin =(wCRCin << 1) ^ wCPoly;
				}
				else
				{
				    wCRCin = wCRCin << 1;
				}
		   }
       }
			return(wCRCin);    
} 


extern "C" void USART2_IRQHandler(void)    		 
{
	if( USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)  	   //接收中断  
	{
				USART_ClearITPendingBit(USART2,USART_IT_RXNE);   //清除中断标志
				RxBuffer[RxCounter++] = USART_ReceiveData(USART2);
	}
	
	if(RxBuffer[RxCounter-1]==13) //0x0D
	{
		uart2_len=RxCounter-1;
	
		check=CRC16_XMODEM(&RxBuffer[RxCounter],uart2_len+1);   //校验和(crc)
		
		if(((check&0x00ff)==RxBuffer[uart2_len+1])&&(((check>>8)&0x00ff)==RxBuffer[uart2_len+1]))
		{
			RxState=1;		
		}
	}
				
	if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //判断中断是否溢出
	{ 
				USART_ClearFlag(USART2,USART_FLAG_ORE); 
				USART_ReceiveData(USART2); 
	} 
		
	if(RxState)
	{
		//find_key(RxBuffer,"on");
		if(strstr((const char*)RxBuffer, "on"))
		{
			GPIO_ResetBits(LED_PORT, GPIO_Pin_4);
		}
		
		if(strstr((const char*)RxBuffer, "off"))
		{
			GPIO_SetBits(LED_PORT, GPIO_Pin_4);
		}
		
		for(auto x=0;x<uart2_len+1;++x)
		{
			USART_SendData(USART1,RxBuffer[x]);
			delay_ms(10);
		}

		RxState=0;
		RxCounter=0;
	}
}

main.cpp

#include "system.h"

int main(void)
{

	SysTick_Init(72);

	Init_Usart();

	std::shared_ptr<Led> led = std::make_shared<Led>();

	while(1)
	{
		delay_ms(500);
		led->TurnOn(GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7, false);
		delay_ms(500);
		led->TurnOn(GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7, true);
		delay_ms(500);
	}
	return 0;
}

接下里就是编译调试了。什么都好就是胖了点,不过问题不大,有的是方法减肥,这里我就不逼逼了。好在ZET6 512k的存储容量,这小小100k,还不够。
在这里插入图片描述
把编译好的hex文件下载到单片机上,就可以观测到结果了。
在这里插入图片描述
简单的一个演示视频;

扫描点灯

使用的gm65我接的二号串口,GPIOC使用的5号口,具体的文件代码我会分享给大家。因为有些东西我这上边没有写,不够你拿到我这弄好的模板,操作之后的就好弄了。

五、结尾废话

说着是使用c++快乐的,为啥感觉没用到多少,其实正常的,代码量不够的话,其实写C更方便点,还有就是这里边使用c++11的感觉没那爽,不够还行勉强够用了,搞好c pulspuls以后软硬通吃就行,那不香香啊。

啊,
什么?
你问我?
代码在哪?
别急马上给。

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

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

相关文章

FlinkSQL的Watermark机制和Checkpoint机制

Watermark机制 Watermark机制&#xff0c;就是水印机制&#xff0c;也叫做水位线机制。就是专门用来解决流式环境下数据迟到问题的。 MonotonousWatermark&#xff08;单调递增水印&#xff09; package day05;import lombok.AllArgsConstructor; import lombok.Data; impor…

【谷粒商城之JSR303数据校验和集中异常处理】

本笔记内容为尚硅谷谷粒商城JSR303数据校验和集中异常处理部分 目录 一、简介 二、SR303数据校验使用步骤 1、引入依赖 2、给参数对象添加校验注解 常见的注解 3、接口参数前增加Valid 开启校验 三、异常的统一处理 四、分组解决校验 1、创建Groups 2、添加分组 …

MySQL数据库之表的增删改查(进阶)

目录1. 数据库约束1.1 约束类型1.2 NULL约束1.3 UNIQUE&#xff1a;唯一约束1.4 DEFAULT&#xff1a;默认值约束1.5 PRIMARY KEY&#xff1a;主键约束1.6 FOREIGN KEY&#xff1a;外键约束1.7 CHECK约束2 表之间的关系2.1 一对一2.2 一对多2.3 多对多3 新增4 查询4.1 聚合查询4…

Redis一致性问题

&#xff08;1&#xff09;何为一致性&#xff1f; 1、定义&#xff1a; 指系统中各节点数据保持一致。 分布式系统中&#xff0c;可以理解为多个节点中的数据是一致的。 2、分类&#xff1a; 强一致性&#xff1a;写进去的数据是什么&#xff0c;读出来的数据就是什么。弱一…

DeepSpeed-Chat:最强ChatGPT训练框架,一键完成RLHF训练!

https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat 一个快速、负担得起、可扩展和开放的系统框架&#xff0c;用于实现端到端强化学习人类反馈 (RLHF) 培训体验&#xff0c;以生成各种规模的高质量 ChatGPT 样式模型。 目录 &#x…

计算机体系结构-体系结构基础与流水线原理

计算机体系结构&#xff1a;体系结构基础与流水线原理 ​ 计算机体系结构&#xff1a;量化设计与分析一书以RISC-V为例介绍计算机体系结构。本文为第一部分&#xff0c;介绍体系结构的基本知识和流水线原理。笔记内容为原书的第一章&#xff0c;附录A、B、C。 第一章 量化设计…

练习Tomcat

文章目录1. 简述静态网页和动态网页的区别。2. 简述 Webl.0 和 Web2.0 的区别。3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。1. 简述静态网页和动态网页的区别。 静态网页&#xff1a; &#xff08;1&#xff09;静态网页不能简单地理解成静止不…

SCADE Display(OpenGL)软件设计文档生成工具的设计考虑

SCADE Display&#xff08;OpenGL&#xff09;软件设计文档生成工具的设计考虑 2018年6月 1 引言 本文档描述在SCADE Display软件设计文档生成工具&#xff08;以下简称为SDYSDDGEN&#xff09;的设计过程中考虑到的一些问题及其解决方案。 2 目标 SDYSDDGEN的目标设定为&…

面向对象程序设计 C++总结笔记(1)

面向对象程序设计 学习方法 理解基本原理掌握程序设计方法加强动手实践 课程目标 理解面向对象程序设计的基本原理&#xff0c;掌握面向对象技术的基本概念和封装性、继承性和多态性&#xff0c;能够具有面向对象程序设计思想。掌握C语言面向对象的基本特性和C语言基础知识&…

就在20号!袋鼠云春季生长大会邀您共观数智生机,我们云上见

如今&#xff0c;数字经济正逐步走向深化应用、规范发展、普惠共享的新阶段&#xff0c;数字经济与实体经济深度融合、基础软件国产化替代成为数字时代主潮流。 「 2023 袋鼠云春季生长大会」乘风而起&#xff0c;带您走近大数据基础软件——数栈&#xff0c;低代码数字孪生世界…

Hadoop之Yarn篇

目录 ​编辑 Yarn的工作机制&#xff1a; 全流程作业&#xff1a; Yarn的调度器与调度算法&#xff1a; FIFO调度器&#xff08;先进先出&#xff09;&#xff1a; 容量调度器&#xff08;Capacity Scheduler&#xff09;&#xff1a; 容量调度器资源分配算法&#xff1…

【面试题】对 JSON.stringify()与JSON.parse() 理解

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 重新学习这两个API的起因 在本周五有线上的项目&#xff0c;16:30开始验证线上环境。 开始…

【数据挖掘与商务智能决策】第十一章 AdaBoost与GBDT模型

11.1 AdaBoost模型简单代码实现 1.AdaBoost分类模型演示 from sklearn.ensemble import AdaBoostClassifier X [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]] y [0, 0, 0, 1, 1]model AdaBoostClassifier(random_state123) model.fit(X, y)print(model.predict([[5, 5]]))[0…

使用 Urch 让 Ubuntu 原生远程控制功能稳定可靠

有些时候&#xff0c;使用远程控制能够简化不少运维和操作的事情。 本篇文章分享如何通过开源工具 “Urch&#xff08;Ubuntu Remote Control Helper&#xff09;” 让 Ubuntu 原生的远程控制&#xff08;远程桌面&#xff09;功能稳定可靠。 方案已经经过 Ubuntu 22.04 LTS …

JVM之低延迟垃圾收集器

目录 低延迟垃圾收集器 概要 各款收集器的并发情况 Shenandoah收集器 Shenandoah相比G1的改进之处 链接矩阵 定义 优点 Shenandoah收集器的工作过程 Brooks Pointer 转发指针技术 转发指针的优缺点 Shenandoah 性能测试 Shenandoah 总结 ZGC 收集器 ZGC的Region的…

编译原理第一章

编译原理笔记 文章目录编译原理笔记day1什么是编译&#xff1f;编译器的结构词法分析概述词法分析的主要任务语法分析概述主要目的主要任务具体实例语义分析概述主要目的主要任务中间代码生成和编译器后端常用的中间表示形式目标代码生成器代码优化器day1 什么是编译&#xff…

Mysql 学习(一)基础知识(待更新)

文章目录服务端处理客户端请求启动项系统变量启动项和系统变量的区别常见的字符集字符集比较规则服务端处理客户端请求 客户端进程向服务器进程发送一段文本&#xff08;MySQL语句&#xff09;&#xff0c;服务器进程处理后再向客户端进程发送一段文本&#xff08;处理结果&am…

Idea使用样式主题

目的 花里胡哨的idea显示主题 安装插件 在preferences>plugins中搜索“Material Theme”安装两个中的一个 重启>设置>选择主题 对比度&#xff08;多选&#xff09; Contrast Mode:对比度模式&#xff0c;目录结构&#xff0c;选项卡等非文本选择前后的颜色对比度。…

Docker部署RabbitMQ(单机,集群,仲裁队列)

RabbitMQ部署指南 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3-management方式二&#xff1a;从本地加载 在课前资料已经提供了镜像包&#xff1a; 上传到虚拟机中后&#xff0c;使用命令加载镜…

【论文阅读】(20230410-20230416)论文阅读简单记录和汇总

&#xff08;20230410-20230416&#xff09;论文阅读简单记录和汇总 2023/04/09&#xff1a;很久没有动笔写东西了&#xff0c;这两周就要被抓着汇报了&#xff0c;痛苦啊呜呜呜呜呜 目录 (CVPR 2023): Temporal Interpolation Is All You Need for Dynamic Neural Radiance …