嵌入式实践——烟雾产生器

2023-10-31

开发工具:Altium Designer 2020、STM32CubeMX 5.3.0、MDK-ARM 5.28

1.设计需求

设计出一套完整的烟雾产生装置,该装置通过按钮来控制烟雾的产生和关闭。装置对体积要求较高,所以控制板需控制在4cm*3cm,同时根据装置所要安装的器件来灵活调整控制板的形状,具体功能需求如下:
(1)能连续产生烟雾;
(2)采用锂电池方式供电,锂电池充电具有正在充电和充电完成指示,电池电量低提醒;
(3)烟雾需呈现蓝色和红色两种颜色,颜色根据需要进行切换;
(4)加热电路电流、电压监测;
(5)采用无线方式控制烟雾效果。

2.设计方案

(1)设备电源

整个设备供电采用小型锂电池,预留有线电源供电接口,能保证整机持续工作约2小时;设计锂电池充电电路,通过Micro USB接口为锂电池充电并在充电进行和充电结束时LED提醒;设计LDO电源为系统控制器及其他电路供电。

(2)烟雾产生

利用加热丝将加热棉中的电子烟油进行加热,以便产生烟雾;为避免加热丝连续通电对使用寿命和烟雾效果造成影响,采用PWM控制电流加热,并将出烟量调节至最佳状态;设计电压与电流检测电路,检测加热过程电压值和电流值。

(3)烟雾效果

①烟雾喷出速度: 通过控制风机转速实现,并设定几个可选择挡位;
②烟雾颜色: 通过不同颜色的LED灯来进行控制,通过不同灯光的照射使烟雾呈现不同的颜色。

(4)出烟控制

出烟控制分为烟雾产生开关、风机开关、双色LED开关,开关的控制均通过STM32F030F4P6控制,并使用 LC12S无线模块控制烟雾大小、风扇转速、烟雾颜色。

(5)低功耗

发烟器3min未接收到控制指令,自动休眠无线模块并将STM32进入停止模式,收到控制命令时自动唤醒。

3.硬件电路

在这里插入图片描述
电路原理图:SMKController.SchDoc
PCB:SMKController.PcbDoc

4.软件代码

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdlib.h>
/* USER CODE END Includes */
/* Private define ------------------------------------------------------------*/
#define Close_LED		  0x00
#define Open_RedLED		  0x01
#define Open_BlueLED	  0x02
#define FAN_Speed_0       0x00
#define FAN_Speed_1       0x01
#define FAN_Speed_2       0x02
#define FAN_Speed_3       0x03
/* USER CODE BEGIN PD */
void ADC_Check(void);
void OUTPUT_PWM(void);
void OUTPUT_PWM_first(void);
void OUTPUT_FAN(uint16_t FAN_MODE);
void LED_Control(void);
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim);
void StopMode_Measure(void);
/* USER CODE END PD */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
uint16_t dutyCycle1=0;				//占空比0%
uint16_t dutyCycle2=300;			//占空比30%
uint16_t dutyCycle3=500;
uint16_t dutyCycle600=600;
uint16_t dutyCycle4=700;
uint16_t dutyCycle5=800;
uint16_t dutyCycle1000=1000;
uint8_t aTxBuffer1[1];				//串口接收命1缓存
uint8_t aTxBuffer2[1];				//串口接收命2缓存
uint8_t aTxBuffer3[1];				//串口接收命3缓存
uint8_t aRxBuffer[10];				//串口接收的命令
uint8_t i;							//串口命令计数
uint8_t Sum=0;						//串口命令校验和
uint32_t ADC_Value[100];			//ADC_DMA模式采集数据缓存
uint32_t Battery_Value_Check,Res_Current_Check;			//电池电压、发热丝电流
uint16_t FAN_MODE;					//风扇档位
uint8_t aTxCheck_PWM[1];			//PWM输出数据缓存 
uint8_t aTxCheck_LED[1];			//LED灯光控制数据缓存
uint8_t TIM_2S_DONE;				//2s计数完成标志    	  1:完成   0:未完
uint8_t TIM_12S_DONE=2;				//12s计数完成标志  	  1:完成   0:未完
uint8_t TIM_3M_DONE;				//3min计数完成标志  	  1:完成   0:未完				
uint8_t flag = 2;
uint8_t Count_Flag = 0;				//3min计数过程标志 		
uint8_t Wait_Entry_Sleep = 0;		//3min计数
uint8_t uint8_t Stop_Mode_flag;		//停止模式标志位    	  1:True   2:False
uint8_t BlueLED_Flag=0;			    //蓝光控制标志     	  1:开     0:关
uint8_t RedLED_Flag=0;				//红光控制标志	  	  1:开     0:关
uint8_t LED_Close_Flag=0;		    //灯光关闭标志
uint8_t Uart_RX_Date_Flag=0;	    //串口接收数据标志	  1:接收到运行命令  0:接收到结束命令
uint8_t Uart1_PWM_Flag=0;   		//串口发送PWM输出命令标志位
uint8_t dmaflag=0;					//DMA标志位
uint8_t Tim14BaseCnt=0;				//7ms计数
uint8_t Tim14BaseCnt_PWM_first=0;   //12s计数
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
	/* MCU Configuration--------------------------------------------------------*/
	/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
	HAL_Init();
	/* Configure the system clock */
	SystemClock_Config();
	/* Initialize all configured peripherals */
	MX_GPIO_Init();
    MX_DMA_Init();
    MX_ADC_Init();
    MX_TIM3_Init();
    MX_TIM14_Init();
    MX_USART1_UART_Init();
    /* USER CODE BEGIN 2 */
    HAL_ADC_Start_DMA(&hadc, (uint32_t*)ADC_Value, 100);					 //使能ADC_DMA采集模式
    if(HAL_UART_Receive_IT(&huart1,aRxBuffer,10)!=HAL_OK)Error_Handler();	 //开启串口中断接收模式
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); 								 //使能PWM输出
	HAL_TIM_Base_Start_IT(&htim14);											 //使能TIM计时												 				  
    /* USER CODE END 2 */
    
/* USER CODE BEGIN WHILE */
while (1)
{
	ADC_Check();							//ADC采集电池电压及发热丝电流
	OUTPUT_PWM_first();						//PWM输出
	LED_Control();							//双色LED灯光控制
	OUTPUT_FAN(FAN_MODE);					//风扇转速控制
	if(Stop_Mode_flag == 1)					//停止模式标志位判断
	{
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET);	    //休眠串口无线模块
		Stop_Mode_flag = 2;
		StopMode_Measure();					//进入停止模式  
	}
    /* USER CODE END WHILE */
  }
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI14;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.HSI14CalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
/* ADC RxdCallback Fuction */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	dmaflag = 1;
	
	HAL_ADC_Stop_DMA(hadc);
}
	
/* Base Timer Callback Fuction */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim)   //每1ms进入一次中断,1ms计数一次
{
	if(htim->Instance == htim14.Instance)
	{
		/* PWM_First 12s计时 */
		if (TIM_12S_DONE == 0)				 
		{
			if(Tim14BaseCnt_PWM_first<12000)
			{
				Tim14BaseCnt_PWM_first++;
			}
			else
			{
				TIM_12S_DONE = 1;
				flag = 1;
				Tim14BaseCnt_PWM_first=0;
			}
		}	
		/* 12s后PWM间隔输出2s计时 */
		if (TIM_12S_DONE == 1)			
		{
			if(Tim14BaseCnt<70)
			{
				Tim14BaseCnt++;
			}
			else
			{
				Tim14BaseCnt= 0;
				TIM_2S_DONE = abs(TIM_2S_DONE-1);
			}
		}	
		/* 接收结束命令后3min计时进入停止模式,3min内有非结束命令时自动退出计时 */
		if (TIM_3M_DONE == 1)				
		{
			if(Wait_Entry_Sleep < 180000)
			{
				if(Uart_RX_Date_Flag==0)
				{
					Wait_Entry_Sleep++;	
					Count_Flag++;
				}
				else if(Uart_RX_Date_Flag==1)
				{
					Count_Flag=200000;
					Wait_Entry_Sleep=180000;
				}
			}
			if(Count_Flag==200000)
			{
				Wait_Entry_Sleep = 0;
				TIM_3M_DONE = 2;
				Count_Flag=0;
			}
			else if(Count_Flag>179998)
			{
				Stop_Mode_flag = 1;
				Wait_Entry_Sleep = 0;
				TIM_3M_DONE = 2;
				Count_Flag=0;
			}
		}
	}
}	

/* Usart RxdCallback Fuction */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		for(i=2;i<=8;i++)
		{
			Sum = Sum + aRxBuffer[i];
		}	
		if(Sum%302==aRxBuffer[9] && aRxBuffer[2]==0x0A)		 //校验和
		{
			Uart_RX_Date_Flag=1;
			/* PWM串口命令分析 */
			if(aRxBuffer[3]==0 && aRxBuffer[4]==0 && aRxBuffer[5]==0)	//当接收到结束命令时,开启3min计时
			{
				TIM_3M_DONE=1;
				Uart_RX_Date_Flag=0;
			}
			aTxBuffer1[0]=aRxBuffer[3];
			if(aTxCheck_PWM[0]==aTxBuffer1[0])      		//防止第二次相同命令重新运行
			{				
				aTxCheck_PWM[0]=aTxBuffer1[0];
			}
			else if(aTxBuffer1[0]==0x00)					//对第一个PWM输出命令进行判断
			{
				Uart1_PWM_Flag = 0;
				flag=0;
				TIM_12S_DONE = 2;	
				aTxCheck_PWM[0]=aTxBuffer1[0];		
			}
			else if(aTxBuffer1[0]==0x01)
			{
				Uart1_PWM_Flag = 1;
				TIM_12S_DONE = 0;
				flag=0;
				TIM_2S_DONE = 0;			
				aTxCheck_PWM[0]=aTxBuffer1[0];		
			}
			/* LED串口命令分析 */
			aTxBuffer2[0]=aRxBuffer[4];
			switch(aTxBuffer2[0])										//对第二个LED灯光控制命令进行判断				
			{
				case Open_BlueLED:
					BlueLED_Flag=1;
				break;
				case Open_RedLED:
					RedLED_Flag=1;
				break;
				case Close_LED:
					LED_Close_Flag=1;
				break;
				default:;
			}
			/* FAN串口命令分析 */
			aTxBuffer3[0]=aRxBuffer[5];							
			switch(aTxBuffer3[0])
			{
				case FAN_Speed_0:
				FAN_MODE = 0;
				break;
				case FAN_Speed_1:
				FAN_MODE = 1;
				break;
				case FAN_Speed_2:
				FAN_MODE = 2;
				break;
				case FAN_Speed_3:
				FAN_MODE = 3;
				break;
				default:;
			}
			Sum=0;
		}
		
		else
		{
			Sum=0;
			memset(aRxBuffer, 0, sizeof aRxBuffer); 	//命令错误清除缓冲区域数据
		}
		HAL_UART_Receive_IT(&huart1,aRxBuffer,10);	//再次开启串口接收
	}
}

/**
* ADC_DMA模式采集函数
* 判断电池电压及发热丝电流,用led灯显示
*/
void ADC_Check(void)													
{
	if(dmaflag == 1)   //判断中断标志,调用ADC Check函数。
		{
			dmaflag = 0;
			for(i=0,Battery_Value_Check=0,Res_Current_Check=0; i<100;i++)
			{
				Battery_Value_Check = ADC_Value[i]*3000/4096*2;
				Res_Current_Check = ADC_Value[i+1]*3000/4069/0.05/100;
				if(Battery_Value_Check>0 && Res_Current_Check>0)
				{
					HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);
				}
				HAL_ADC_Start_DMA(&hadc, (uint32_t*)ADC_Value, 100);			//重新使能ADC_DMA采集模式
			}
		
		}
}

/**
* 电阻丝加热控制,加热开始阶段
* 前12s阶段PWM输出控制函数
* PWM_first输出控制,前12s输出占空比为80%的PWM波
*/
void OUTPUT_PWM_first(void)
{
	if (Uart1_PWM_Flag == 1)
		{
			if(flag == 1)
			{
				OUTPUT_PWM();
			}
			if(flag == 0)				//前12s阶段PWM输出控制函数
			{
				HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);	
				__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,dutyCycle5);  //输出占空比为80%的PWM波
			}
		}
	if(Uart1_PWM_Flag == 0)
	{
		HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2);
		TIM_2S_DONE = 0;
	}	
}

/**
* 12秒后阶段PWM输出控制函数
* PWM输出控制,12s后输出80%占空比的PWM波
*/
void OUTPUT_PWM(void)
{
	if(TIM_2S_DONE == 1)
	{
		HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);	
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,dutyCycle5);
	}
	if(TIM_2S_DONE == 0)
	{
		HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2);
	}
}
	
/**
* LED灯光控制函数
* 分别对红蓝光进行开关控制
*/
void LED_Control(void)
{
	if(BlueLED_Flag==1)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
		BlueLED_Flag=0;
	}
	if(RedLED_Flag==1)
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
		RedLED_Flag=0;
	}
	if(LED_Close_Flag==1)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
		LED_Close_Flag=0;
	}
}

/**
* 风扇转速控制函数
* PWM输出控制,进行各个风扇档位进行控制,默认档位为占空比60%
*/
void OUTPUT_FAN(uint16_t FAN_MODE)
{
	switch(FAN_MODE)
	{
		case 0:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle1);
		break;
		case 1:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle2);
		break;
		case 2:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle3);
		break;
		case 3:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle4);
		break;
		default:
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,dutyCycle600);
	}
}

/**
* 停止模式函数
* 进入停止模式,等待EXTI唤醒 
*/
void StopMode_Measure(void)
{
	HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
	HAL_Delay(200);
}

/**
* EXTI_Callback函数
* 按键中断将单片机从停止模式唤醒
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == SW_Pin)
	{
		SystemClock_Config();										//重新使能时钟,因为停止模式将其关闭
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET);	 	//唤醒串口无线模块	
		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_2);						//按键提示灯,可删除
		__HAL_GPIO_EXTI_CLEAR_IT(SW_Pin);							//Clear the EXTI's line pending bits.
	}
}
/* USER CODE END 4 */
/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

本次实践的烟雾发生器是三年前导师项目中所需的一个小装置,软硬件基础功能都已实现,这算是自己做的第一个嵌入式实践,硬件和软件设计可能还不规范,在此做一个整理记录。在烟雾效果的调试过程中很有趣,需将加热电流大小、加热时间、风力大小、加热丝粗细以及加热棉材料等因素进行合理的选择,才能达到烟雾的最佳效果,否则会导致烟雾效果不佳和加热丝熔断的情况发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式实践——烟雾产生器 的相关文章

  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 错误:-march= 开关的值错误

    我写了一个Makefile 但无法让它工作 我有一个选项应该选择编译到哪个处理器 然而 当我跑步时make从命令行它说 tandex tandex P 6860FX emulators nintendo sdks 3DS SDK HomeB
  • ARM 汇编:从 STDIN 获取字符串

    我目前正在学习 CS 课程 我们刚刚开始在 Raspberry Pi 上使用 ARM Assembly 事实证明这相当困难 想知道是否有人可以提供帮助 我当前的任务是从 stdin 获取一个字符串 使用 scanf 并计算其中的字符数 然后
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 如何在数据部分(RAM)中保留一定范围的内存并防止同一应用程序使用该内存的堆/堆栈?

    我想在 RAM 中保留 分配一定范围的内存 并且同一应用程序不应覆盖或使用该范围的内存进行堆 堆栈存储 如何在内存中分配一定范围的内存以防止堆栈 堆覆盖 我考虑过向应用程序本身添加 或分配 一个数组并保留内存 但它被编译器优化了 因为它在应
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir

随机推荐

  • python3.7安装dlib (Wind10)

    使用pip install dlib 提示失败 原因 https pypi org project dlib files 查看说明最新版本dlib 19 20 0 不支持Python3 7 解决方案 整理了下网上说的方案大致如下 一 编译安
  • android 悬浮组件实现

    项目需求 需要实现一个每个页面都存在的悬浮按钮 可以拖动 跟随整个项目的生命周期 即应用登录之后显示悬浮按钮 应用退出之后 隐藏悬浮按钮 特殊页面隐藏悬浮按钮 应用后台展示之后 隐藏悬浮按钮 应用恢复前台展示 显示悬浮按钮 准备工作 添加权
  • js提示“没有权限”的问题(转载)

    当某个互联网运营商的网站上规模之后 他们都会考虑将网站部署到主域名相同 子域名不同的服务器集群上 以此来构建一个聚合的应用 同时 希望能够利用 JavaScript 在不同子域的网页间相互操作 实现一个对用户来说 无缝 的应用 这时 跨域操
  • 我是如何用 redis 分布式锁来解决线上历史业务问题的

    近期发现 开发功能的时候发现了一个 mq 消费顺序错乱 历史遗留问题 导致业务异常的问题 看看我是如何解决的 问题抛出 首先 简单介绍一下情况 线上 k8s 有多个 pod 会去消费 mq 中的消息 可是生产者发送的消息是期望一定要有序去消
  • HTML5 postMessage和跨域通信

    HTML5 postMessage和跨域通信 http iknowledge wikispaces com HTML5 postMessage E5 92 8C E8 B7 A8 E5 9F 9F E9 80 9A E4 BF A1 HTM
  • stm32cubemx hal学习记录:FreeRTOS中断管理

    一 参数配置 1 配置RCC USART1 时钟84M 2 配置SYS 将Timebase Source修改为除滴答定时器外的其他定时器 3 初始化LED的两个引脚 两个按键引脚 4 开启FreeRTOS v1与v2版本不同 一般选用v1即
  • 梯度下降法及其Python实现

    梯度下降法 gradient descent 又名最速下降法 steepest descent 是求解无约束最优化问题最常用的方法 它是一种迭代方法 每一步主要的操作是求解目标函数的梯度向量 将当前位置的负梯度方向作为搜索方向 因为在该方向
  • 轻松玩转开源大语言模型bloom(一)

    前言 chatgpt已经成为了当下热门 github首页的trending排行榜上天天都有它的相关项目 但背后隐藏的却是openai公司提供的api收费服务 作为一名开源爱好者 我非常不喜欢知识付费或者服务收费的理念 所以便有决心写下此系列
  • Vue3最常见的10道面试题:含答案和代码示例的练习题

    本文列举了10道Vue3面试题 每道题都包含了答案和代码示例 希望对你的面试有所帮助 什么是Vue3 Vue3是Vue js的下一个主要版本 它带来了很多重要的改进和新功能 包括更快的渲染速度 更好的类型支持 更好的组合API等 什么是Co
  • Postman 如何调用文件上传下载接口

    文件导入导出是管理后台的通用功能 所以在接口写好后在没有前端页面使用Postman进行接口调用测试接口功能成为一个选择 导出 在我们输入接口地址 token等候 点击send 发现下载的成为了乱码 如下图 这明显不符合我们的预期期望 在se
  • 文本分析简历项目收集-----机器学习(仅供参考)

    文本分析 项目3 基于自然语言处理的影评分析 项目简介 通过大量的正面和负面的电影评论对计算机进行自然语言训练 实现计算机对电影评论的基本情感分析 使其能够快速判断出评论是否积极 个人职责 1 对正面和负面的电影评论进行分词处理 整理成规定
  • 一次让人难以忘怀的排查频繁Full GC过程

    我们的Java应用因频繁FULL GC导致性能降低很多 经过多人的定位也没有结论 于是我自主请命 经过一天的研究终于搞定了 现把经验与大家共享 相关的gc日志如下 4 758 Full GC PSYoungGen 464K gt 0K 71
  • linux统计一个文件中特定字符的个数

    统计一个文件中某个字符串的个数 其实就是在在一块沙地里面找石头 有的人看到石头以后 在上面做个标记 grep 然后记住自己做了多少个标记 有的 人看到石头以后 把它挖了 tr 最后统计自己挖了多少石头 有的人看到石头以后 把它跳过去 awk
  • STL:list的模拟实现(迭代器失效探讨)

    为什么重新设计list迭代器 对迭代器解引用 我们希望拿到的是指针所指向的值域 而直接解引用拿到的是指针所指向的节点 对list指针 和 迭代器 提供一种方法 使其能够按照顺序访问容器 聚合物 所含的各个元素 并且不用暴露容器内部的表述方式
  • 达芬奇15中文版

    教程 1 下载解压 得到davinci resolve 15原程序和文件 2 双击文件 DaVinci Resolve Studio 15 0b2 Windows exe 依提示安装原程序 3 达芬奇软件需要安装必要的组件 一般按默认安装即
  • Flexible弹性布局

    flex布局 弹性布局 flex的两个重要概念 开启了flex布局的元素叫flex container display flex inline flex flex container 里面的直接子元素叫做 flex items flex布局
  • 来源查询检索的研究

    来源查询检索的研究 来源查询的方式主要有 基于内容索引的查询 gt 基于时间局部性的上下文增强搜索查询 gt 基于因果关系的查询 根据provenance提供上下文有关的索引 即因果关系 1 传统的来源查询检索方式为基于内容索引的查询 在这
  • 阿里云视频点播文件上传-iOS

    文章目录 阿里云视频点播文件上传 iOS 一 上传方式 方式一 上传地址加凭证上传 1 请求AppServer 2 在start的回调中设置上传地址和上传凭证 3 uploadAuth过期重新设置 4 上传图片和上传视频 方式二 STS方式
  • 记一次线上CPU持续飙升的问题排查

    最近公司的事务多了很多 都很少有时间来更新了 上周六项目上刚刚发生了一次CPU持续飙高 导致服务不可用的线上事故 在此也简单做下记录 问题排查的过程大概是这样的 查看业务日志中最开始报错的信息 发现数据库连接超时 redis也连接超时 而且
  • 嵌入式实践——烟雾产生器

    开发工具 Altium Designer 2020 STM32CubeMX 5 3 0 MDK ARM 5 28 1 设计需求 设计出一套完整的烟雾产生装置 该装置通过按钮来控制烟雾的产生和关闭 装置对体积要求较高 所以控制板需控制在4cm