18_FreeRTOS任务通知
目录
任务通知的简介
任务通知值的更新方式
任务通知的优势
任务通知的劣势
任务通知值和通知状态
发送通知相关API函数
接收通知相关API函数
任务通知模拟信号量实验
任务通知模拟消息邮箱实验
任务通知模拟事件标志组实验
任务通知的简介
任务通知:用来通知任务的,任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值。
使用队列、信号量、事件标志组时都需另外创建一个结构体,通过中间的结构体进行间接通信!

使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发过来的"通知"

任务通知值的更新方式
不覆盖接受任务的通知值、覆盖接受任务的通知值、更新接受任务通知值的一个或多个bit、增加接受任务的通知值。
只要合理,灵活的利用任务通知的特点,可以在一些场合中替代队列、信号量、事件标志组!
任务通知的优势
效率更高:使用任务通知向任务发送事件或数据比使用队列、事件标志组或信号量快得多
使用内存更小:使用其他方法时都要先创建对应的结构体,使用任务通知时无需额外创建结构体
任务通知的劣势
无法发送数据给ISR:ISR没有任务结构体,所以无法给ISR发送数据。但是ISR可以使用任务通知的功能,发数据给任务。
无法广播给多个任务:任务通知只能是被指定的一个任务接收并处理
无法缓存多个数据:任务通知是通过更新任务通知值来发送数据的,任务结构休中只有一个任务通知值,只能保持一个数据。
发送受阻不支持阻塞:发送方无法进入阻塞状态等待
任务通知值和通知状态
任务都有一个结构体:任务控制块TCB,它里边有两个结构体成员变量:

一个是 uint32_t类型,用来表示通知值
一个是 uint8_t 类型,用来表示通知状态
任务通知值
任务通知值的更新方式有多种类型:
计数值(数值累加,类似信号量)
相应位置一(类似事件标记组)
任意数值(支持覆写和不覆写,类似队列)
任务通知状态
其中任务通知状态共有3种取值:
#definetaskNOT_WAITING_NOTIFICATION ((uint8_t) 0) /* 任务未等待通知*/#definetaskWAITING_NOTIFICATION ((uint8_t) 1) /* 任务在等待通知*/#definetaskNOTIFICATION_RECEIVED ((uint8_t) 2) /* 任务在等待接收*/
任务未等待通知:任务通知默认的初始化状态
等待通知:接收方已经准备好了(调用了接收任务通知函数) ,等待发送方给个通知
等待接收:发送方已经发送出去(调用了发送任务通知函数) ,等待接收方接收
发送通知相关API函数
任务通知API函数主要有两类:发送通知,接收通知。
注意:发送通知API函数可以用于任务和中断服务函数中;接收通知API函数只能用在任务中。

发送通知,带有通知值并保留接收任务原通知值函数
#define xTaskNotifyAndQuery (xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue) \xTaskGenericNotify( (xTaskToNotify),
(tskDEFAULT_INDEX_TO_NOTIFY),
(ulValue),
(eAction),
(pulPreviousNotifyValue))
发送通知,带有通知值函数
#define xTaskNotify (xTaskToNotify, ulValue, eAction )xTaskGenericNotify( (xTaskToNotify),(tskDEFAULT_INDEX_TO_NOTIFY),(ulValue), (eAction),NULL)
发送通知,不带通知值函数
#define xTaskNotifyGive( xTaskToNotify )xTaskGenericNotify( (xTaskToNotify),(tskDEFAULT_INDEX_TO_NOTIFY),(0), elncrement,NULL)

任务通知方式共有以下几种:

接收通知相关API函数

当任务通知用作于信号量时,使用函数获取信号量: ulTaskNotifyTake()
当任务通知用作于事件标志组或队列时,使用此函数来获取: xTaskNotifyWait()
此函数用于接收任务通知值,可以设置在退出此函数的时候将任务通知值清零或者减一
#define ulTaskNotifyTake( xClearCountOnExit ,xTicksToWait )ulTaskGenericNotifyTake ( (tskDEFAULT_INDEX_TO_NOTIFY),(xClearCountOnExit),(xTicksToWait))

此函数用于获取通知值和清除通知值的指定位值,适用于模拟队列和事件标志组,使用该函数来获取任务通知。
#define xTaskNotifyWait( ulBitsToClearOnEntry,ulBitsToClearOnExit,pulNotificationValue,xTicksToWait)xTaskGenericNotifyWait( tskDEFAULT_INDEX_TO_NOTIFY,(ulBitsToClearOnEntry),(ulBitsToClearOnExit),(pulNotificationValue),(xTicksToWait)

任务通知模拟信号量实验
任务通知功能模拟二值信号量和计数型信号量将设计三个任务: start_task、 task1、task2
start_task:用来创建task1和task2任务
task1:用于按键扫描,当检测到按键KEYO被按下时,将发送任务通知
task2:用于接收任务通知,并打印相关提示信息
/********************************************************************************* @file : user_mian.h* @brief : V1.00******************************************************************************* @attention********************************************************************************//* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "user_key.h"
#include "queue.h"
#include "event_groups.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define 定义----------------------------------------------------------------*/
/* Macro 宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function 函数--------------------------------------------------------------*///任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_PRIO 4
//任务堆栈大小
#define TASK1_STK_SIZE 100
//任务句柄
TaskHandle_t TASK1_Handler;
//任务函数
void task1(void *pvParameters);//任务优先级
#define TASK2_PRIO 3
//任务堆栈大小
#define TASK2_STK_SIZE 100
//任务句柄
TaskHandle_t TASK2_Handler;
//任务函数
void task2(void *pvParameters);int main(void){ /*配置系统中断分组为4位抢占*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);/*延时函数初始化*/delay_init();/*RCC配置*/Rcc_config();/*GPIO初始化*/ Gpio_Init();/*USART1初始化*/Uart1_Init(9600);/*创建开始任务*/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(); //开启任务调度}/*!\brief 开始任务函数\param[in] 传递形参,创建任务时用户自己传入\param[out] none\retval none
*/
void start_task(void *pvParameters)
{taskENTER_CRITICAL(); //进入临界区//创建高优先级任务xTaskCreate((TaskFunction_t )task1, (const char* )"task1", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_PRIO, (TaskHandle_t* )&TASK1_Handler); //创建中优先级任务xTaskCreate((TaskFunction_t )task2, (const char* )"task2", (uint16_t )TASK2_STK_SIZE, (void* )NULL,(UBaseType_t )TASK2_PRIO,(TaskHandle_t* )&TASK2_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL(); //退出临界区
}/*!\brief 任务1发送任务通知\param[in] 传递形参,创建任务时用户自己传入\param[out] none\retval none
*/
void task1(void *pvParameters)
{uint8_t key = 0;while(1){ key = Key_Scan(0);if(key == KEY0_PRES){taskENTER_CRITICAL(); //进入临界区//printf("任务通知模拟二值信号量释放\r\n\r\n");printf("任务通知模拟计数型信号量释放\r\n\r\n");taskEXIT_CRITICAL(); //退出临界区/*发送任务通知给任务2信号量*/xTaskNotifyGive(TASK2_Handler);}vTaskDelay(10);}
} /*!\brief 任务2接收通知并打印 \param[in] 传递形参,创建任务时用户自己传入\param[out] none\retval none
*/
void task2(void *pvParameters)
{uint32_t Value = 0;while(1){ /*接受信号量,pdTRUE接收成功后通知值清零(二值)pdFALSE(计数型),死等*/ Value = ulTaskNotifyTake(pdFALSE,portMAX_DELAY);if(Value != 0){
// taskENTER_CRITICAL(); //进入临界区
// printf("任务通知模拟二值信号量接受成功\r\n\r\n");
// taskEXIT_CRITICAL(); //退出临界区 taskENTER_CRITICAL(); //进入临界区printf("任务通知模拟计数信号量接受成功值为%d\r\n\r\n",Value);taskEXIT_CRITICAL(); //退出临界区 }vTaskDelay(1000);}
}/************************************************************** END OF FILE ****/

任务通知模拟消息邮箱实验
任务通知功能模拟模拟消息邮箱将设计三个任务: start_task、 task1、task2
start_task:用来创建task1和task2任务
task1:用于按键扫描,将按下的按键键值通过任务通知发送给指定任务
task2:用于接收任务通知,并根据接收到的数据做相应动作
/********************************************************************************* @file : user_mian.h* @brief : V1.00******************************************************************************* @attention********************************************************************************//* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "user_key.h"
#include "queue.h"
#include "event_groups.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define 定义----------------------------------------------------------------*/
/* Macro 宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function 函数--------------------------------------------------------------*///任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_PRIO 4
//任务堆栈大小
#define TASK1_STK_SIZE 100
//任务句柄
TaskHandle_t TASK1_Handler;
//任务函数
void task1(void *pvParameters);//任务优先级
#define TASK2_PRIO 3
//任务堆栈大小
#define TASK2_STK_SIZE 100
//任务句柄
TaskHandle_t TASK2_Handler;
//任务函数
void task2(void *pvParameters);int main(void){ /*配置系统中断分组为4位抢占*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);/*延时函数初始化*/delay_init();/*RCC配置*/Rcc_config();/*GPIO初始化*/ Gpio_Init();/*USART1初始化*/Uart1_Init(9600);/*创建开始任务*/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(); //开启任务调度}/*!\brief 开始任务函数\param[in] 传递形参,创建任务时用户自己传入\param[out] none\retval none
*/
void start_task(void *pvParameters)
{taskENTER_CRITICAL(); //进入临界区//创建高优先级任务xTaskCreate((TaskFunction_t )task1, (const char* )"task1", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_PRIO, (TaskHandle_t* )&TASK1_Handler); //创建中优先级任务xTaskCreate((TaskFunction_t )task2, (const char* )"task2", (uint16_t )TASK2_STK_SIZE, (void* )NULL,(UBaseType_t )TASK2_PRIO,(TaskHandle_t* )&TASK2_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL(); //退出临界区
}/*!\brief 任务1发送任务通知\param[in] 传递形参,创建任务时用户自己传入\param[out] none\retval none
*/
void task1(void *pvParameters)
{uint8_t key = 0;while(1){ key = Key_Scan(0);if((key != 0) && (TASK2_Handler != NULL)){taskENTER_CRITICAL(); //进入临界区printf("任务通知模拟消息邮箱发送,发送的键值为:%d\r\n\r\n",key);taskEXIT_CRITICAL(); //退出临界区/*发送任务通知给任务2消息邮箱,按键值,覆写方式*/xTaskNotify(TASK2_Handler,key,eSetValueWithoutOverwrite);}vTaskDelay(10);}
} /*!\brief 任务2接收通知并打印 \param[in] 传递形参,创建任务时用户自己传入\param[out] none\retval none
*/
void task2(void *pvParameters)
{uint32_t Value = 0;while(1) { /*接受任务通知,初始化时不清0,接受成功后全部清零,死等方式*/ xTaskNotifyWait(0,0xFFFFFFFF,&Value,portMAX_DELAY);if(Value != 0){taskENTER_CRITICAL(); //进入临界区printf("任务通知模拟消息邮箱接受成功值为%d\r\n\r\n",Value);taskEXIT_CRITICAL(); //退出临界区 }vTaskDelay(1000);}
}/************************************************************** END OF FILE ****/

任务通知模拟事件标志组实验
任务通知功能模拟模拟事件标志组将设计三个任务: start_task、 task1、task2
start_task:用来创建task1和task2任务
task1:用于按键扫描,当检测到按键按下时,发送任务通知设置不同标志位
task2:用于接收任务通知,并打印相关提示信息
/********************************************************************************* @file : user_mian.h* @brief : V1.00******************************************************************************* @attention********************************************************************************//* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "user_key.h"
#include "queue.h"
#include "event_groups.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define 定义----------------------------------------------------------------*/
/* Macro 宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function 函数--------------------------------------------------------------*///任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_PRIO 4
//任务堆栈大小
#define TASK1_STK_SIZE 100
//任务句柄
TaskHandle_t TASK1_Handler;
//任务函数
void task1(void *pvParameters);//任务优先级
#define TASK2_PRIO 3
//任务堆栈大小
#define TASK2_STK_SIZE 100
//任务句柄
TaskHandle_t TASK2_Handler;
//任务函数
void task2(void *pvParameters);int main(void){ /*配置系统中断分组为4位抢占*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);/*延时函数初始化*/delay_init();/*RCC配置*/Rcc_config();/*GPIO初始化*/ Gpio_Init();/*USART1初始化*/Uart1_Init(9600);/*创建开始任务*/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(); //开启任务调度}/*!\brief 开始任务函数\param[in] 传递形参,创建任务时用户自己传入\param[out] none\retval none
*/
void start_task(void *pvParameters)
{taskENTER_CRITICAL(); //进入临界区//创建高优先级任务xTaskCreate((TaskFunction_t )task1, (const char* )"task1", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_PRIO, (TaskHandle_t* )&TASK1_Handler); //创建中优先级任务xTaskCreate((TaskFunction_t )task2, (const char* )"task2", (uint16_t )TASK2_STK_SIZE, (void* )NULL,(UBaseType_t )TASK2_PRIO,(TaskHandle_t* )&TASK2_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL(); //退出临界区
}/*!\brief 任务1发送任务通知\param[in] 传递形参,创建任务时用户自己传入\param[out] none\retval none
*/
void task1(void *pvParameters)
{uint8_t key = 0;while(1){ key = Key_Scan(0);if(key == KEY0_PRES){taskENTER_CRITICAL(); //进入临界区printf("任务通知模拟事件更新bit0位\r\n\r\n");taskEXIT_CRITICAL(); //退出临界区/*发送任务通知给任务2事件标志组bit0置一*/xTaskNotify(TASK2_Handler,0x01,eSetBits);}else if(key == KEY1_PRES){taskENTER_CRITICAL(); //进入临界区printf("任务通知模拟事件更新bit1位\r\n\r\n");taskEXIT_CRITICAL(); //退出临界区/*发送任务通知给任务2事件标志组bit1置一*/xTaskNotify(TASK2_Handler,0x02,eSetBits);}vTaskDelay(10);}
} /*!\brief 任务2接收通知并打印 \param[in] 传递形参,创建任务时用户自己传入\param[out] none\retval none
*/
void task2(void *pvParameters)
{uint32_t Value = 0;uint32_t Event = 0;while(1) { /*接受任务通知,初始化时不清0,接受成功后全部清零,死等方式*/ xTaskNotifyWait(0,0xFFFFFFFF,&Value,portMAX_DELAY);if(Value & 0x01){Event |= 0x01;}if(Value & 0x02){Event |= 0x02;}if(Event == 0x03){Event = 0; taskENTER_CRITICAL(); //进入临界区printf("按键0和按键1按下打印提示语句\r\n\r\n");taskEXIT_CRITICAL(); //退出临界区 }vTaskDelay(1000);}
}/************************************************************** END OF FILE ****/

相关文章:
18_FreeRTOS任务通知
目录 任务通知的简介 任务通知值的更新方式 任务通知的优势 任务通知的劣势 任务通知值和通知状态 发送通知相关API函数 接收通知相关API函数 任务通知模拟信号量实验 任务通知模拟消息邮箱实验 任务通知模拟事件标志组实验 任务通知的简介 任务通知:用来通知任务的…...
【华为OD机试模拟题】用 C++ 实现 - 整理扑克牌(2023.Q1)
最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...
mysql lesson1
常用命令 1:exit 退出mysql 2:uroot pENTER键,再输入密码,不被别人看见 3:完美卸载:双击安装包,手动删除program file中的mysql,手动删除Programedate里的mysql 4:use mysql 使用数据库 5:…...
联想笔记本无法下载 Lenovo Vantage
状况 在 Microsoft Store 下载时发生错误,可能是如下代码:0x80070005, 0x80073D05, or 0x80070017. 解决方法 1.在“开始”菜单搜索栏中输入PowerShell 2.当Windows PowerShell出现在“开始”菜单中,右键点击此图标,然后选择以…...
功能性材料深入超级赛道,赋能多行业迭代升级
中国国际胶粘剂及密封剂展览会深耕胶粘剂、密封剂和胶粘带行业26年,是行业认可的、优质的贸易与技术交流平台。展会连接了十几个行业的买家和卖家,包括汽车、电子、新能源、轨道交通、工业等重要领域,为客户提供封装、粘合、散热、装配制造等…...
【项目精选】jsp企业快信系统(论文+视频+源码)
点击下载源码 计算机网络的出现到现在已经经历了翻天覆地的重大改变。因特网也从最早的供科学家交流心得的简单的文本浏览器发展成为了商务和信息的中心。到了今天,互联网已经成为了大量应用的首选平台,人们已经渐渐习惯了网络交易,渐渐对网络…...
通信算法之112:载波同步及comm.CarrierSynchronizer
1. 2. 载波同步是基于锁相环技术使本地获取和载波同频同相的参考信号,用来解调信号。载波同步就是对本地参考信号进行频率和相位偏差的补偿,进而实现本地参考信号和载波信号同频同相。 载波同步只适用于单载波调制系统,载波同步算法对于BPSK、…...
【C. Build Permutation】(整数理论、构造、思维)
链接 理论基础 结论:在区间[n,2n]上,至少存在一个完全平方数。结论:在区间[n,2n]上,至少存在一个完全平方数。结论:在区间[n,2n]上,至少存在一个完全平方数。 构造⌈n⌉2构造\lceil \sqrt{n}\rceil^2构造⌈…...
前端面试题:事件循环(Eventloop)
什么是事件循环?如何理解事件循环?事件循环原理如何描述?事件循环涉及了很多知识点,想要彻底掌握JS事件循环原理必须要掌握以下知识点:同步任务、异步任务、宏任务、微任务、任务队列、执行栈、js运行机制、EventLoop。 1.事件循…...
jmeter接口自动化测试框架
接口测试可以分为两部分: 一是线上接口(生产环境)自动化测试,需要自动定时执行,每5分钟自动执行一次,相当于每5分钟就检查一遍线上的接口是否正常,有异常能够及时发现,不至于影响用…...
树莓派CM4基础设置
安装系统1.1 软件和硬件准备硬件:CM4(4GB DDR32GB EMMC 板载WIFI和蓝牙)CM4-to-Pi4-Adapter软件:Raspberry Pi或者 Win32DiskImagerRaspberry Pi下载链接:点击直接下载Win32DiskImager下载链接:链接&#x…...
JS 合并数组的三大方式
1. 数组的不可变合并 1.1使用扩展运算符进行合并 如果您想知道一种在JavaScript中合并数组的好方法,那么请记住使用扩展操作符进行合并。 在数组字面量中写入两个或更多带有扩展操作符…前缀的数组,JavaScript将创建一个合并所有这些数组的新数组: co…...
30岁测试开发年薪不足50万,被面试官嘲讽混得太差?
近日,有网友发帖称:“30岁去应聘测试开发,拿不到七八十万的年薪确实有点丢人了,还被面试官diss混得太差了”,网友们看完都炸了。 来看看网友们都是怎么说的。 有网友说: 扯淡 有网友气到: 那拿…...
【C语言】多线程
多线程线程线程的优点C语言多线程创建线程终止线程连接和分离线程开启一个线程最基本的多线程实现开启两个线程多线程进行协同运算无参数传递的线程并发编程实例简单参数传递的线程并发编程实例结构体参数传递的线程并发编程实例线程的连接编程实例信号量同步进行写入互斥信号量…...
CDGA|浅谈“以治促用,以用促治”的数据治理战略
数据治理夯实企业数字化转型基础。采取“以治促用,以用促治”的数据治理战略,可以充分释放了企业核心运行要素的活力。 “以治促用”是指通过建立在数据治理链路及用户多维评估系统的基础上,对数据资产重新进行价值识别,推进高价值…...
Apifox-比postman更优秀的接口自动化测试平台
一、Apifox介绍 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台,定位 Postman Swagger Mock JMeter。通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好 API 文档,API 调试、API 数据 Mock、A…...
周期矩形波的傅里叶级数展开(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
前端预防XSS攻击全攻略
如何防止XSS攻击 一、是撒子 XSS攻击(跨站点脚本攻击),就是黑客恶意篡改你网页的前端代码,在里面注入一些恶意的 htmljavascript的脚本,并在你的浏览器内运行,获取你的信息,或者进行一些恶意操…...
JUC(一)
1.AQS原理 1.1.概述 1>.AQS全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架; 2>.特点: ①.用state属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁; getState: 获取state状态;setStata: 设置…...
API接口——睡眠带开放能力
本文介绍睡眠带相关接口。 API 列表 请求方法API描述GET/v1.0/devices/{device_id}/sleep/daily-reports获取日睡眠报告。GET/v1.0/devices/{device_id}/sleep/monthly-reports获取月睡眠报告。GET/v1.0/devices/{device_id}/sleep/24h-reports获取 24 小时睡眠报告。GET/v1.…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
前端打包工具简单介绍
前端打包工具简单介绍 一、Webpack 架构与插件机制 1. Webpack 架构核心组成 Entry(入口) 指定应用的起点文件,比如 src/index.js。 Module(模块) Webpack 把项目当作模块图,模块可以是 JS、CSS、图片等…...
Heygem50系显卡合成的视频声音杂音模糊解决方案
如果你在使用50系显卡有杂音的情况,可能还是官方适配问题,可以使用以下方案进行解决: 方案一:剪映替换音色(简单适合普通玩家) 使用剪映换音色即可,口型还是对上的,没有剪映vip的&…...
