【4】STM32·FreeRTOS·中断管理

news2025/1/17 13:53:57

目录

一、什么是中断

二、中断优先级分组设置

2.1、中断优先级基本概念

2.2、中断优先级分组

2.3、FreeRTOS中断特点

三、中断相关寄存器

3.1、系统中断优先级配置寄存器

3.2、PendSV和Systick中断优先级的配置

3.3、中断屏蔽寄存器

四、FreeRTOS中断管理实验


一、什么是中断

 让 CPU 打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断

中断执行机制,可简单概括为三步

1、中断请求:外设产生中断请求(GPIO外部中断、定时器中断等)

2、响应中断:CPU 停止执行当前程序,转而去执行中断处理程序(ISR)

3、退出中断:执行完毕,返回被打断的程序处,继续往下执行

二、中断优先级分组设置

2.1、中断优先级基本概念

ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器,但 STM32,只用了中断优先级配置寄存器的高 4 位 [7:4],所以 STM32 提供了最大16级的中断优先级

STM32 的中断优先级可以分为抢占优先级和子优先级

抢占优先级:高抢占优先级可以打断正在执行的低抢占优先级中断

子优先级:当抢占优先级相同时,子优先级高的先执行,但是不能互相打断

注意:中断优先级数值越小越优先

2.2、中断优先级分组

一共有 5 种分配方式,对应着中断优先级分组的 5 个组

优先级分组抢占优先级子优先级优先级配置寄存器高 4 位
NVIC_PRIORITYGROUP_00 级抢占优先级0-15 级子优先级

0bit 用于抢占优先级

4bit 用于子优先级

NVIC_PRIORITYGROUP_10-1 级抢占优先级0-7 级子优先级

1bit 用于抢占优先级

3bit 用于子优先级

NVIC_PRIORITYGROUP_20-3 级抢占优先级0-3 级子优先级

2bit 用于抢占优先级

2bit 用于子优先级

NVIC_PRIORITYGROUP_30-7 级抢占优先级0-1 级子优先级

3bit 用于抢占优先级

1bit 用于子优先级

NVIC_PRIORITYGROUP_40-15 级抢占优先级0 级子优先级

4bit 用于抢占优先级

0bit 用于子优先级

在 FreeRTOS 中使用的是 NVIC_PRIORITYGROUP_4,任何其他配置都会使 configMAX_SYSCALL_INTERRUPT_PRIORITY 设置与分配给各个外设中断的优先级之间的直接关系复杂化

在 HAL_Init 中,通过调用函数 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4) 即可完成设置

2.3、FreeRTOS中断特点

1、低于 configMAX_SYSCALL_INTERRUPT_PRIORITY 优先级的中断里才允许调用 FreeRTOS 的 API 函数

2、建议将所有优先级位指定为抢占优先级位,方便 FreeRTOS 管理(调用函数 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4) )

3、中断优先级数值越小越优先,任务优先级数值越大越优先

三、中断相关寄存器

3.1、系统中断优先级配置寄存器

三个系统中断优先级配置寄存器,分别为 SHPR1、SHPR2、SHPR3

SHPR1 寄存器地址:0xE000ED18

SHPR2 寄存器地址:0xE000ED1C

SHPR3 寄存器地址:0xE000ED20

3.2、PendSV和Systick中断优先级的配置

在 xPortStartScheduler() 函数中,将 PendSV 和 SysTick 设置为优先级最低的中断,这个函数在 vTaskStartScheduler() 开启任务调度函数中会调用

/* Make PendSV and SysTick the lowest priority interrupts. */
    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;

SHPR3 寄存器地址的定义

#define portNVIC_SHPR3_REG    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )

PendSV 和 SysTick 优先级配置寄存器相对 SHPR3 寄存器的偏移

#define portNVIC_PENDSV_PRI     ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
#define portNVIC_SYSTICK_PRI    ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )

将设置的中断最低优先级左移 4 位作为中断优先级配置寄存器的高 4 位 [7:4] 进行赋值

/* 中断嵌套行为配置 */
#ifdef __NVIC_PRIO_BITS
    #define configPRIO_BITS __NVIC_PRIO_BITS
#else
    #define configPRIO_BITS 4
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         15                  /* 中断最低优先级 */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5                   /* FreeRTOS可管理的最高中断优先级 */
#define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

偏移 4 的定义

#define __NVIC_PRIO_BITS          4        /*!< STM32F4XX uses 4 Bits for the Priority Levels */

所以:PendSV 和 SysTick 设置为最低优先级

设置最低:保证系统任务切换不会阻塞系统其他中断的响应

3.3、中断屏蔽寄存器

三个中断屏蔽寄存器,分别为 PRIMASK、FAULTMASK、BASEPRI

FreeRTOS 所使用的中断管理就是利用的 BASEPRI 这个寄存器

BASEPRI:屏蔽优先级低于某一个阈值的中断,当设置为 0 时,则不关闭任何中断

比如:BASEPRI 设置为 0x50,代表中断优先级在 5~15 内的均被屏蔽,0~4 的中断优先级正常执行

关中断程序示例(中断优先级在 5~15 的全部被关闭)

#define portDISABLE_INTERRUPTS()                  vPortRaiseBASEPRI()

static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
    uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

    __asm
    {
    /* Set BASEPRI to the max syscall priority to effect a critical
    * section. */
/* *INDENT-OFF* */
    msr basepri, ulNewBASEPRI
    dsb
    isb
/* *INDENT-ON* */
    }
}

#define configMAX_SYSCALL_INTERRUPT_PRIORITY            ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5                   /* FreeRTOS可管理的最高中断优先级 */

当 BASEPRI 设置为 0x50 时

在中断服务函数中调度 FreeRTOS 的 API 函数需注意

1、中断服务函数的优先级需在 FreeRTOS 所管理的范围内

2、在中断服务函数里边需调用 FreeRTOS 的 API 函数,必须使用带“FromISR”后缀的函数

开中断程序示例

#define portENABLE_INTERRUPTS()                   vPortSetBASEPRI( 0 )

static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{
    __asm
    {
        /* Barrier instructions are not used as this function is only used to
        * lower the BASEPRI value. */
/* *INDENT-OFF* */
        msr basepri, ulBASEPRI
/* *INDENT-ON* */
    }
}

FreeRTOS 中断管理就是利用 BASEPRI 寄存器实现的

四、FreeRTOS中断管理实验

本实验会使用两个定时器每 1s 分别打印一段字符串,一个优先级为 4,一个优先级为 6,注意:系统所管理的优先级范围:5~15

将设计两个任务:start_task、task1

两个任务的功能如下

start_task:用来创建 task1 任务

task1:中断测试任务,任务中将调用关中断和开中断函数来体现对中断的管理作用

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "freertos_demo.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
    delay_init(168);                    /* 延时初始化 */
    usart_init(115200);                 /* 串口初始化为115200 */
    led_init();                         /* 初始化LED */
    lcd_init();                         /* 初始化LCD */
    key_init();                         /* 初始化按键 */

    freertos_demo();
}

freertos_demo.c

#include "freertos_demo.h"

/******************************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO 1            /* 任务优先级 */
#define START_STK_SIZE 128           /* 任务堆栈大小 */
TaskHandle_t StartTask_Handler;      /* 任务句柄 */
void start_task(void *pvParameters); /* 任务函数 */

/* TASK1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK1_PRIO 2            /* 任务优先级 */
#define TASK1_STK_SIZE 128      /* 任务堆栈大小 */
TaskHandle_t Task1Task_Handler; /* 任务句柄 */
void task1(void *pvParameters); /* 任务函数 */

/******************************************************************************************************/

/* FreeRTOS例程入口函数 */
void freertos_demo(void)
{
    lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
    lcd_show_string(10, 47, 220, 24, 24, "Interrupt", RED);
    lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);

    xTaskCreate((TaskFunction_t)start_task,          /* 任务函数 */
                (const char *)"start_task",          /* 任务名称 */
                (uint16_t)START_STK_SIZE,            /* 任务堆栈大小 */
                (void *)NULL,                        /* 传入给任务函数的参数 */
                (UBaseType_t)START_TASK_PRIO,        /* 任务优先级 */
                (TaskHandle_t *)&StartTask_Handler); /* 任务句柄 */
    vTaskStartScheduler();
}

/* start_task */
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL(); /* 进入临界区 */

    /* 初始化TIM3、TIM5 */
    btim_tim3_int_init(10000 - 1, 8400 - 1);
    btim_tim5_int_init(10000 - 1, 8400 - 1);

    /* 创建任务1 */
    xTaskCreate((TaskFunction_t)task1,               /* 任务函数 */
                (const char *)"task1",               /* 任务名称 */
                (uint16_t)TASK1_STK_SIZE,            /* 任务堆栈大小 */
                (void *)NULL,                        /* 传入给任务函数的参数 */
                (UBaseType_t)TASK1_PRIO,             /* 任务优先级 */
                (TaskHandle_t *)&Task1Task_Handler); /* 任务句柄 */

    vTaskDelete(StartTask_Handler); /* 删除开始任务 */
    taskEXIT_CRITICAL();            /* 退出临界区 */
}

/* task1 */
void task1(void *pvParameters)
{
    uint32_t task1_num = 0;

    while (1)
    {
        if (++task1_num == 5)
        {
            printf("FreeRTOS Close Interrupt\r\n");
            portDISABLE_INTERRUPTS(); /* FreeRTOS关闭中断 */
            delay_ms(5000);           /* 不能使用vTaskDelay,vTaskDelay内部会执行开中断操作 */
            printf("FreeRTOS Open Interrupt\r\n");
            portENABLE_INTERRUPTS(); /* FreeRTOS打开中断 */
            task1_num = 0;
        }
        vTaskDelay(1000);
    }
}

freertos_demo.h

#ifndef __FREERTOS_DEMO_H
#define __FREERTOS_DEMO_H

#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/TIMER/btim.h"
#include "FreeRTOS.h"
#include "task.h"

void freertos_demo(void);

#endif

btim.c

#include "./BSP/TIMER/btim.h"

TIM_HandleTypeDef g_tim3_handle; /* 定时器3句柄 */
TIM_HandleTypeDef g_tim5_handle; /* 定时器5句柄 */

/* 基本定时器TIM3中断服务函数 */
void BTIM_TIM3_INT_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&g_tim3_handle); /*定时器回调函数*/
}

/* 基本定时器TIM5中断服务函数 */
void BTIM_TIM5_INT_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&g_tim5_handle); /*定时器回调函数*/
}

/* 回调函数,定时器中断服务函数调用 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == (&g_tim3_handle))
    {
        printf("TIM3 Output\r\n");
    }
    else if (htim == (&g_tim5_handle))
    {
        printf("TIM5 Output\r\n");
    }
}

/*  基本定时器TIM3定时中断初始化函数 */
void btim_tim3_int_init(uint16_t arr, uint16_t psc)
{
    g_tim3_handle.Instance = BTIM_TIM3_INT;                    /*通用定时器3*/
    g_tim3_handle.Init.Prescaler = psc;                        /* 设置预分频器  */
    g_tim3_handle.Init.CounterMode = TIM_COUNTERMODE_UP;       /* 向上计数器 */
    g_tim3_handle.Init.Period = arr;                           /*自动装载值*/
    g_tim3_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /*时钟分频因子*/
    HAL_TIM_Base_Init(&g_tim3_handle);

    HAL_TIM_Base_Start_IT(&g_tim3_handle); /*使能通用定时器3和及其更新中断:TIM_IT_UPDATE*/
}

/*  基本定时器TIM5定时中断初始化函数 */
void btim_tim5_int_init(uint16_t arr, uint16_t psc)
{
    g_tim5_handle.Instance = BTIM_TIM5_INT;                    /*通用定时器5*/
    g_tim5_handle.Init.Prescaler = psc;                        /* 设置预分频器  */
    g_tim5_handle.Init.CounterMode = TIM_COUNTERMODE_UP;       /* 向上计数器 */
    g_tim5_handle.Init.Period = arr;                           /*自动装载值*/
    g_tim5_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /*时钟分频因子*/
    HAL_TIM_Base_Init(&g_tim5_handle);

    HAL_TIM_Base_Start_IT(&g_tim5_handle); /*使能通用定时器5和及其更新中断:TIM_IT_UPDATE*/
}

/* 定时器底层驱动,开启时钟,设置中断优先级 */
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == BTIM_TIM3_INT)
    {
        BTIM_TIM3_INT_CLK_ENABLE();                     /*使能TIM时钟*/
        HAL_NVIC_SetPriority(BTIM_TIM3_INT_IRQn, 4, 0); /* 抢占4,子优先级0,组4 */
        HAL_NVIC_EnableIRQ(BTIM_TIM3_INT_IRQn);         /*开启ITM3中断*/
    }
    else if (htim->Instance == BTIM_TIM5_INT)
    {
        BTIM_TIM5_INT_CLK_ENABLE();                     /*使能TIM时钟*/
        HAL_NVIC_SetPriority(BTIM_TIM5_INT_IRQn, 6, 0); /* 抢占6,子优先级0,组4 */
        HAL_NVIC_EnableIRQ(BTIM_TIM5_INT_IRQn);         /*开启ITM5中断*/
    }
}

bitm.h

#ifndef _BTIM_H
#define _BTIM_H

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/USART/usart.h"
#include "./BSP/LED/led.h"

/******************************************************************************************/
/* 基本定时器 定义 */

/* TIMX 中断定义 
 * 默认是针对TIM6/TIM7
 * 注意: 通过修改这4个宏定义,可以支持TIM1~TIM8任意一个定时器.
 */
 
#define BTIM_TIM3_INT                       TIM3
#define BTIM_TIM3_INT_IRQn                  TIM3_IRQn
#define BTIM_TIM3_INT_IRQHandler            TIM3_IRQHandler
#define BTIM_TIM3_INT_CLK_ENABLE()          do{ __HAL_RCC_TIM3_CLK_ENABLE(); }while(0)  /* TIM3 时钟使能 */

#define BTIM_TIM5_INT                       TIM5
#define BTIM_TIM5_INT_IRQn                  TIM5_IRQn
#define BTIM_TIM5_INT_IRQHandler            TIM5_IRQHandler
#define BTIM_TIM5_INT_CLK_ENABLE()          do{ __HAL_RCC_TIM5_CLK_ENABLE(); }while(0)  /* TIM5 时钟使能 */

/******************************************************************************************/

void btim_tim3_int_init(uint16_t arr, uint16_t psc);
void btim_tim5_int_init(uint16_t arr, uint16_t psc);

#endif

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

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

相关文章

618购物攻略:哪些好物值得你入手?精选必买数码产品推荐!

随着618大促的脚步渐近&#xff0c;购物的热情已然在大家心中熊熊燃烧&#xff0c;不少人已跃跃欲试&#xff0c;准备在这场购物盛宴中大放异彩。然而&#xff0c;面对琳琅满目的商品&#xff0c;你是否也感到有些无从下手&#xff0c;犹豫该把哪些好物收入囊中&#xff1f;别急…

Python 开发 框架安全:SSTI 模板注入漏洞测试.

什么是 SSTI 模板注入 SSTI (Server-Side Template Injection) 是一种Web应用程序安全漏洞&#xff0c;它发生在应用程序使用模板引擎渲染用户输入时。当应用程序将用户输入直接插入到模板中而不进行充分的过滤和验证时&#xff0c;就可能导致SSTI漏洞。攻击者可以利用这个漏洞…

Threejs 学习笔记 | 灯光与阴影

文章目录 Threejs 学习笔记 | 灯光与阴影如何让灯光照射在物体上有阴影LightShadow - 阴影类的基类平行光的shadow计算投影属性 - DirectionalLightShadow类平行光的投射相机 聚光灯的shadow计算投影属性- SpotLightShadow类聚光灯的投射相机 平行光 DirectionalLight聚光灯 Sp…

高校普法|基于SSM+vue的高校普法系统的设计与实现(源码+数据库+文档)

高校普法系统 目录 基于SSM&#xff0b;vue的高校普法系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3律师功能模块 4学生功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

Linux进程控制——Linux进程等待

前言&#xff1a;接着前面进程终止&#xff0c;话不多说我们进入Linux进程等待的学习&#xff0c;如果你还不了解进程终止建议先了解&#xff1a; Linux进程终止 本篇主要内容&#xff1a; 什么是进程等待 为什么要进行进程等待 如何进程等待 进程等待 1. 进程等待的概念2. 进…

“等保测评实施策略:保障企业信息安全合规“

等保测评&#xff0c;即网络安全等级保护测评&#xff0c;是企业保障信息安全合规的重要实施策略。以下是企业实施等保测评的一些关键策略&#xff1a; 理解等保测评的重要性&#xff1a; 等保测评有助于企业识别和评价信息系统的安全性能&#xff0c;提供改进建议&#xff0c;…

user32.dll怎么修复?几种修复user32.dll丢失的详细步骤

user32.dll怎么修复&#xff1f;几种修复user32.dll丢失的详细步骤user32.dll是Windows操作系统中的一个核心动态链接库文件&#xff0c;它主要负责处理图形用户界面&#xff08;GUI&#xff09;相关的功能。这个文件是Windows API&#xff08;应用程序编程接口&#xff09;的一…

css超出部分省略(单行、多行,多种方法实现)

HTML <p class"text">这是一行测试数据,这是一行测试数据,这是二行测试数据,这是一行测试数据,这是三行测试数据,这是四行测试数据</p>1.单行 .text{width: 200px;border: 1px solid #000000;white-space: nowrap; /* 控制元素不换行 */overflow: hi…

骨传导耳机哪个品牌值得入手?盘点5款高人气热门机型推荐!

随着人们对健康生活方式的追求和户外运动的普及&#xff0c;骨传导耳机的需求也日益增长。然而&#xff0c;随着骨传导耳机的热度增加&#xff0c;市场上也开始出现一些低质量的骨传导耳机产品&#xff0c;这些劣质耳机在音质、佩戴舒适度或安全性上存在各种不足&#xff0c;甚…

Matlab如何批量导出多张高质量论文插图?科研效率UpUp第9期

上一期文章中&#xff0c;分享了Matlab导出高质量论文插图的方法&#xff08;Matlab如何导出高质量论文插图&#xff1f;科研效率UpUp第8期&#xff09;。 进一步&#xff0c;假如我们想要批量导出多张高质量无变形论文插图&#xff0c;该如何操作呢&#xff1f; ​也很简单&…

【MySQL01】【 Explain 命令详解】

文章目录 一、前言二、Explain 概览三、Explain 详解1. id2. select_type3. table4. type5. possible_keys6. key7. key_len8. ref9. rows10. filtered11. extra 列 四、补充1. EXPLAIN 扩展1.1 Extend EXPLAIN1.2 JSON 格式的执行计划 2. Intersection、Union、Sort-Union 索引…

添砖Java之路(其八)——继承,final关键字

继承&#xff1a; 意义&#xff1a;让类于类之间产生父类于子类的关系&#xff0c;子类可以直接使用父类中的非私有成员(包括方法与成员变量) 。 extends关键字就是定义声明父类。 格式&#xff1a;public class 子类 extends 父类。 对于基础的我就不赘述了&#xff0c;我…

【接口测试_03课_-接口自动化思维梳理及Requests库应用】

一、通过代码&#xff0c;实现Jmeter 1、项目要放在虚拟环境里面&#xff0c;解释器要使用虚拟环境的 上面是虚拟环境&#xff0c;下面是系统环境。2选一 venv目录 查看当前虚拟环境已存在的依赖包 2、安装Requests依赖包 1&#xff09;安装命令 pip install requests 如果…

python输出希腊字母

有时候在绘制一些函数图像时&#xff0c;需要坐标轴和图例显示希腊字母 plt.xlabel(r’ ϵ \epsilon ϵ’)

AI绘画Stable Diffusion 模型辅助神器之 Lora 提示词助手

大家好&#xff0c;我是向阳 小伙伴们也知道&#xff0c;大多数的 Lora 模型都是有触发词的&#xff0c;而且每个模型的触发词都不一样。 模型少的时候还行&#xff0c;模型多起来了&#xff0c;还得一个一个去翻以前的笔记&#xff0c;真的挺麻烦。要是漏了没记&#xff0c;…

GPT-4o正式发布;零一万物发布千亿参数模型;英国推出AI评估平台

OpenAI 正式发布 GPT-4o 今天凌晨&#xff0c;OpenAI 正式发布 GPT-4o&#xff0c;其中的「o」代表「omni」&#xff08;即全面、全能的意思&#xff09;&#xff0c;这个模型同时具备文本、图片、视频和语音方面的能力&#xff0c;甚至就是 GPT-5 的一个未完成版。 并且&…

emp.dll文件丢失荒野大镖客,怎么快速修复emp.dll

缺失或损坏的 DLL 文件是会导致系统或软件故障的&#xff0c;DLL&#xff08;动态链接库&#xff09;文件是 Windows 操作系统中至关重要的一部分&#xff0c;它们允许多个程序共享代码和资源&#xff0c;从而减少内存占用和增强系统性能。然而&#xff0c;当EMP.dll文件丢失或…

JAVA中类和对象(承接上次的补充)

目录&#xff1a; 一.static修饰成员方法 二.static成员变量初始化 三.代码块 一.static修饰成员方法: 1.一般类中的数据成员都设置为 private &#xff0c;而成员方法设置为 public &#xff0c; 问&#xff1a;那设置之后&#xff0c;Student类中&#xff0c;被Student修饰…

食家巷传统面点积极响应中国品牌日,打造国货潮牌

2024 年中国品牌日活动以“中国品牌&#xff0c;世界共享&#xff1b;国货潮牌&#xff0c;品筑未来”为主题&#xff0c;旨在推动中国品牌的发展和国际化&#xff0c;展示国货潮牌的魅力和创新。食家巷传统面点品牌积极响应活动号召&#xff0c;以实际行动助力中国品牌的崛起。…

Databend 开源周报第 144 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 了解 Databend …