嵌入式常使用的库函数
自己创建简单的mcu中常用的库函数
文章目录
- 自己创建简单的mcu中常用的库函数
- 1. 自己编写库函数的意义
- 2. 计算字符串长度.以'\0'作为结束符
- 3. 复制字符串
- 4. 字符串比较
- 5. 将整数转换为ASCII数组
- 6. 将ASCII码字符串转换成整数
- 7. 将字节数组转换为16位整数
- 8.计算CRC,用于Modbus协议
- 9. 根据直线方程上的两点,给X计算第三个点的Y值
- 10. 将BCD码转为ASCII字符
- 11.将二进制数组转换为16进制格式的ASCII字符串
- 12. 变长的 ASCII 字符转换为32位整数
声明:这些函数大部分是我在安富莱电子的教程上面抄下来的,硬汉哥写过很多优秀的教程,大家可以去学习学习,论坛链接。有的是我从别处摘抄来的,这篇文章我会一直补充。
1. 自己编写库函数的意义
但我们在使用c语言写mcu程序的时候,有的时候需要使用库函数,当然我们可以使用标准的库函数,如stdio库用于输入输出
string库用于字符串操作等,但是标准的库实在是太大了,对于mcu很不友好,因此mcu往往会使用其它的一些c库,如keil提供了MicroLIB库,还有其它的如newlib等库,这些库虽然比标准库小的多,但是有时候还是太大了,因此我们就需要封装一些常用的库,来减少c库的引入。
2. 计算字符串长度.以’\0’作为结束符
/*
*********************************************************************************************************
* 函 数 名: str_len
* 功能说明: 计算字符串长度.以'\0'作为结束符
* 形 参: _str : 缓冲区
* 返 回 值: 无
*********************************************************************************************************
*/
int str_len(char *_str)
{int len = 0;while (*_str++) len++;return len;
}
3. 复制字符串
/*
*********************************************************************************************************
* 函 数 名: str_cpy
* 功能说明: 复制字符串
* 形 参: tar : 目标缓冲区
* src : 源缓冲区
* 返 回 值: 无
*********************************************************************************************************
*/
void str_cpy(char *_tar, char *_src)
{do{*_tar++ = *_src;}while (*_src++);
}
/*
*********************************************************************************************************
* 函 数 名: str_copy
* 功能说明: 复制字符串
* 形 参: tar : 目标缓冲区
* src : 源缓冲区
* 返 回 值: 无
*********************************************************************************************************
*/
void mem_set(char *_tar, char _data, int _len)
{while (_len--){*_tar++ = _data;}
}
4. 字符串比较
/*
*********************************************************************************************************
* 函 数 名: str_cmp
* 功能说明: 字符串比较
* 形 参: s1 : 字符串1
* s2 : 字符串2
* 返 回 值: 0 表示相等 非0表示不等
*********************************************************************************************************
*/
int str_cmp(char * s1, char * s2)
{while ((*s1!=0) && (*s2!=0) && (*s1==*s2)){s1++;s2++;}return *s1 - *s2;
}
5. 将整数转换为ASCII数组
/*
*********************************************************************************************************
* 函 数 名: int_to_ascii
* 功能说明: 将整数转换为ASCII数组。支持负数。
* 形 参: _Number : 整数
* _pBuf : 目标缓冲区, 存放转换后的结果。以0结束的字符串。
* _len : ASCII字符个数, 字符串长度
* 返 回 值: 无
*********************************************************************************************************
*/
void int_to_str(int _iNumber, char *_pBuf, unsigned char _len)
{unsigned char i;int iTemp;if (_iNumber < 0) /* 负数 */{iTemp = -_iNumber; /* 转为正数 */}else{iTemp = _iNumber;}mem_set(_pBuf, ' ',_len);/* 将整数转换为ASCII字符串 */for (i = 0; i < _len; i++){_pBuf[_len - 1 - i] = (iTemp % 10) + '0';iTemp = iTemp / 10;if (iTemp == 0){break;}}_pBuf[_len] = 0;if (_iNumber < 0) /* 负数 */{for (i = 0; i < _len; i++){if ((_pBuf[i] == ' ') && (_pBuf[i + 1] != ' ')){_pBuf[i] = '-';break;}}}
}
6. 将ASCII码字符串转换成整数
/*
*********************************************************************************************************
* 函 数 名: str_to_int
* 功能说明: 将ASCII码字符串转换成整数。 遇到小数点自动越过。
* 形 参: _pStr :待转换的ASCII码串. 可以以逗号,#或0结束。 2014-06-20 修改为非0-9的字符。
* 返 回 值: 二进制整数值
*********************************************************************************************************
*/
int str_to_int(char *_pStr)
{unsigned char flag;char *p;int ulInt;unsigned char i;unsigned char ucTemp;p = _pStr;if (*p == '-'){flag = 1; /* 负数 */p++;}else{flag = 0;}ulInt = 0;for (i = 0; i < 15; i++){ucTemp = *p;if (ucTemp == '.') /* 遇到小数点,自动跳过1个字节 */{p++;ucTemp = *p;}if ((ucTemp >= '0') && (ucTemp <= '9')){ulInt = ulInt * 10 + (ucTemp - '0');p++;}else{break;}}if (flag == 1){return -ulInt;}return ulInt;
}
7. 将字节数组转换为16位整数
/*
*********************************************************************************************************
* 函 数 名: BEBufToUint16
* 功能说明: 将2字节数组(大端Big Endian次序,高字节在前)转换为16位整数
* 形 参: _pBuf : 数组
* 返 回 值: 16位整数值
*
* 大端(Big Endian)与小端(Little Endian)
*********************************************************************************************************
*/
uint16_t BEBufToUint16(uint8_t *_pBuf)
{return (((uint16_t)_pBuf[0] << 8) | _pBuf[1]);
}
/*
*********************************************************************************************************
* 函 数 名: LEBufToUint16
* 功能说明: 将2字节数组(小端Little Endian,低字节在前)转换为16位整数
* 形 参: _pBuf : 数组
* 返 回 值: 16位整数值
*********************************************************************************************************
*/
uint16_t LEBufToUint16(uint8_t *_pBuf)
{return (((uint16_t)_pBuf[1] << 8) | _pBuf[0]);
}
/*
*********************************************************************************************************
* 函 数 名: BEBufToUint32
* 功能说明: 将4字节数组(大端Big Endian次序,高字节在前)转换为16位整数
* 形 参: _pBuf : 数组
* 返 回 值: 16位整数值
*
* 大端(Big Endian)与小端(Little Endian)
*********************************************************************************************************
*/
uint32_t BEBufToUint32(uint8_t *_pBuf)
{return (((uint32_t)_pBuf[0] << 24) | ((uint32_t)_pBuf[1] << 16) | ((uint32_t)_pBuf[2] << 8) | _pBuf[3]);
}
/*
*********************************************************************************************************
* 函 数 名: LEBufToUint32
* 功能说明: 将4字节数组(小端Little Endian,低字节在前)转换为16位整数
* 形 参: _pBuf : 数组
* 返 回 值: 16位整数值
*********************************************************************************************************
*/
uint32_t LEBufToUint32(uint8_t *_pBuf)
{return (((uint32_t)_pBuf[3] << 24) | ((uint32_t)_pBuf[2] << 16) | ((uint32_t)_pBuf[1] << 8) | _pBuf[0]);
}
8.计算CRC,用于Modbus协议
采用查表法,空间换时间
// CRC 高位字节值表
static const uint8_t s_CRCHi[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
// CRC 低位字节值表
const uint8_t s_CRCLo[] = {0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,0x43, 0x83, 0x41, 0x81, 0x80, 0x40
};/*
*********************************************************************************************************
* 函 数 名: CRC16_Modbus
* 功能说明: 采用查表法计算CRC。 用于Modbus协议。
* 形 参: _pBuf : 参与校验的数据
* _usLen : 数据长度
* 返 回 值: 16位整数值。 对于Modbus ,此结果高字节先传送,低字节后传送。
*
* 所有可能的CRC值都被预装在两个数组当中,当计算报文内容时可以简单的索引即可;
* 一个数组包含有16位CRC域的所有256个可能的高位字节,另一个数组含有低位字节的值;
* 这种索引访问CRC的方式提供了比对报文缓冲区的每一个新字符都计算新的CRC更快的方法;
*
* 注意:此程序内部执行高/低CRC字节的交换。此函数返回的是已经经过交换的CRC值;也就是说,该函数的返回值可以直接放置
* 于报文用于发送;
*********************************************************************************************************
*/
uint16_t CRC16_Modbus(uint8_t *_pBuf, uint16_t _usLen)
{uint8_t ucCRCHi = 0xFF; /* 高CRC字节初始化 */uint8_t ucCRCLo = 0xFF; /* 低CRC 字节初始化 */uint16_t usIndex; /* CRC循环中的索引 */while (_usLen--){usIndex = ucCRCHi ^ *_pBuf++; /* 计算CRC */ucCRCHi = ucCRCLo ^ s_CRCHi[usIndex];ucCRCLo = s_CRCLo[usIndex];}return ((uint16_t)ucCRCHi << 8 | ucCRCLo);
}
采用计算的方法来计算crc16,时间换空间
/*
*********************************************************************************************************
* 函 数 名: modbus_crc16
* 功能说明: 采用计算法计算CRC。 用于Modbus协议。
* 形 参: data : 参与校验的数据
* length : 数据长度
* 返 回 值: 16位整数值。 对于Modbus ,此结果高字节先传送,低字节后传送。
*********************************************************************************************************
*/
uint16_t modbus_crc16(uint16_t length, uint8_t *data)
{uint16_t crc = 0xffff;bool t = 0;uint16_t R = 0xa001;while(length){crc = crc ^ *data++;for(int a=0; a<8; ){t = crc % 2;crc = crc / 2;a++;if(t == 1){crc = crc ^ R;} }clength--;}return crc;
}
9. 根据直线方程上的两点,给X计算第三个点的Y值
/*
*********************************************************************************************************
* 函 数 名: CaculTwoPoint
* 功能说明: 根据2点直线方程,计算Y值
* 形 参: 2个点的坐标和x输入量
* 返 回 值: x对应的y值
*********************************************************************************************************
*/
int32_t CaculTwoPoint(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x)
{return y1 + ((int64_t)(y2 - y1) * (x - x1)) / (x2 - x1);
}
10. 将BCD码转为ASCII字符
/*
*********************************************************************************************************
* 函 数 名: BcdToChar
* 功能说明: 将BCD码转为ASCII字符。 比如 0x0A ==> 'A'
* 形 参: _bcd :输入的二进制数。必须小于16
* 返 回 值: 转换结果
*********************************************************************************************************
*/
char BcdToChar(uint8_t _bcd)
{if (_bcd < 10){return _bcd + '0';}else if (_bcd < 16){return _bcd + 'A';}else{return 0;}
}
11.将二进制数组转换为16进制格式的ASCII字符串
/*
*********************************************************************************************************
* 函 数 名: HexToAscll
* 功能说明: 将二进制数组转换为16进制格式的ASCII字符串。每个2个ASCII字符后保留1个空格。
* 0x12 0x34 转化为 0x31 0x32 0x20 0x33 0x34 0x00 即 "1234"
* 形 参: _pHex :输入的数据,二进制数组
* _pAscii :存放转换结果, ASCII字符串,0结束。1个二进制对应2个ASCII字符.
* 返 回 值: 转换得到的整数
*********************************************************************************************************
*/
void HexToAscll(uint8_t * _pHex, char *_pAscii, uint16_t _BinBytes)
{uint16_t i;if (_BinBytes == 0){_pAscii[0] = 0;}else{for (i = 0; i < _BinBytes; i++){_pAscii[3 * i] = BcdToChar(_pHex[i] >> 4);_pAscii[3 * i + 1] = BcdToChar(_pHex[i] & 0x0F);_pAscii[3 * i + 2] = ' ';}_pAscii[3 * (i - 1) + 2] = 0;}
}
12. 变长的 ASCII 字符转换为32位整数
/*
*********************************************************************************************************
* 函 数 名: AsciiToUint32
* 功能说明: 变长的 ASCII 字符转换为32位整数 ASCII 字符以空格或者0结束 。 支持16进制和10进制输入
* 形 参: *pAscii :要转换的ASCII码
* 返 回 值: 转换得到的整数
*********************************************************************************************************
*/
uint32_t AsciiToUint32(char *pAscii)
{char i;char bTemp;char bIsHex;char bLen;char bZeroLen;uint32_t lResult;uint32_t lBitValue;/* 判断是否是16进制数 */bIsHex = 0;if ((pAscii[0] == '0') && ((pAscii[1] == 'x') || (pAscii[1] == 'X'))){bIsHex=1;}lResult=0;// 最大数值为 4294967295, 10位+2字符"0x" //if (bIsHex == 0){ // 十进制 //// 求长度 //lBitValue=1;/* 前导去0 */for (i = 0; i < 8; i++){bTemp = pAscii[i];if (bTemp != '0')break;}bZeroLen = i;for (i = 0; i < 10; i++){if ((pAscii[i] < '0') || (pAscii[i] > '9'))break;lBitValue = lBitValue * 10;}bLen = i;lBitValue = lBitValue / 10;if (lBitValue == 0)lBitValue=1;for (i = bZeroLen; i < bLen; i++){lResult += (pAscii[i] - '0') * lBitValue;lBitValue /= 10;}}else{ /* 16进制 *//* 求长度 */lBitValue=1;/* 前导去0 */for (i = 0; i < 8; i++){bTemp = pAscii[i + 2];if(bTemp!='0')break;}bZeroLen = i;for (; i < 8; i++){bTemp=pAscii[i+2];if (((bTemp >= 'A') && (bTemp <= 'F')) ||((bTemp>='a')&&(bTemp<='f')) ||((bTemp>='0')&&(bTemp<='9')) ){lBitValue=lBitValue * 16;}else{break;}}lBitValue = lBitValue / 16;if (lBitValue == 0)lBitValue = 1;bLen = i;for (i = bZeroLen; i < bLen; i++){bTemp = pAscii[i + 2];if ((bTemp >= 'A') && (bTemp <= 'F')){bTemp -= 0x37;}else if ((bTemp >= 'a') && (bTemp <= 'f')){bTemp -= 0x57;}else if ((bTemp >= '0') && (bTemp <= '9')){bTemp -= '0';}lResult += bTemp*lBitValue;lBitValue /= 16;}}return lResult;
}
相关文章:
嵌入式常使用的库函数
自己创建简单的mcu中常用的库函数 文章目录自己创建简单的mcu中常用的库函数1. 自己编写库函数的意义2. 计算字符串长度.以\0作为结束符3. 复制字符串4. 字符串比较5. 将整数转换为ASCII数组6. 将ASCII码字符串转换成整数7. 将字节数组转换为16位整数8.计算CRC,用于Modbus协议9…...

【业务安全-02】业务逻辑漏洞之越权操作
越权越权即越权查看被人的信息,又分为水平越权和垂直越权,但是两者的本质都是一样的,只是越权的身份权限不一样而已水平越权:相同级别的用户,如用户A访问用户B垂直越权:普通用户到管理员,普通用…...

完全小白的pycharm深度学习调试+for循环断点条件设置
完全小白的pycharm深度学习调试for循环断点条件设置写在最前面基础方法pycharm断点调试控制台输入代码中循环的debug方法pycharm中图标的介绍常见的BugDebug经验1. 检查激活函数的输入值2. 检查梯度3. 消融实验4. 使用最短的时间5. 静下心来写在最前面 之前把seq2seqattention…...

直方图及其应用
直方图定义直方图是一种描述数据的分布通过将连续变量划分成一系列区间,统计区间频率,并用来表示,以表征其统计特征在图像处理中,直方图可以用来表示图像中像素值的分布状况,描述不同灰度级的像素在图像中的占比直方图…...

《SpringBoot篇》26.SpringBoot整合Jackson超详细教程(附Jackson工具类)
陈老老老板🦸👨💻本文专栏:SpringBoot篇(主要讲一些与springboot整合相关的内容)👨💻本文简述:本文讲一下Jackson常见用法,超级详细。👨&am…...

Redis 如何实现库存扣减操作和防止被超卖?
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
(Linux)Ubuntu查看系统版本
uname -a : 查看操作系统的发行版号和操作系统版本 Command: uname -aResult: Linux SERVER 5.19.0-35-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 3 18:36:56 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux uname -v : 查看版本号 Command: uname -vResult: #36-Ubuntu …...
VxWorkds 内存管理(3)
虚拟内存管理 对于带MMU的目标板,VxWorks提供虚拟内存的支持,VxWorks提供了两种虚拟内存管理单元(MMU)的支持: 基本MMU和VxVMI 基本MMU邦定于VxWorks中,可以通过config.h中宏定义INCLUDE MMU BASIC或Tornado工程配置中包含基本MMU组件 VxV…...

单元测试、反射、注解、动态代理
🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录单元测试、反射、注解、动态代理单元测…...

【数据结构】夯实基础|线性表刷题01
作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: 【数据结构|刷题专栏】:该专栏专注于数据结构知识,持续更新&a…...

Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)
本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证实体类、mapper和配置文件定义User实体mapper接口mapper.xml文件jdbc.propertiessqlMapConfig.xml不分批次直接梭哈循环逐条插入MyBatis实现插入30万条数据JDBC实现插入30万条数…...

java多线程之线程的六种状态
线程的六种状态(1) NEW(初始状态)(2) TERMINATED(终止状态 / 死亡状态)(3) RUNNABLE(运行时状态)(4) TIMED_WAITING(超时等待状态)(5) WAITING(等待状态)(6) BLOCK(阻塞状态)sleep和wait的区别:操作系统里的线程自身是有一个状态的,但是java Thread 是对系统线程的封装,把这里的…...

UnixBench----x86架构openEuler操作系统上进行性能测试
【原文链接】UnixBench----x86架构openEuler操作系统上进行性能测试 (1)打开github上 UnixBench 地址,找到发布的tag (2)找到tar.gz包,右键复制链接 比如这里是 https://github.com/kdlucas/byte-unix…...

于Java8 Stream教程之collect()
目录 前言正文第一个小玩法 将集合通过Stream.collect() 转换成其他集合/数组:第二个小玩法 聚合(求和、最小、最大、平均值、分组)总结前言 本身我是一个比较偏向少使用Stream的人,因为调试比较不方便。 但是, 不得不说&#…...
Python
1、str 三个关键点: 正着数,0,1,2 反着数,0,-1,-2 str[a,b] 左闭右开 [a,b) str123456789 print(str) # 输出字符串 print(str[0:-1]) # 输…...

Spring框架中IOC和DI详解
Spring框架学习一—IOC和DI 来源黑马Spring课程,觉得挺好的 目录 文章目录Spring框架学习一---IOC和DI目录学习目标第一章 Spring概述1、为什么要学习spring?2、Spring概述【了解】【1】Spring是什么【2】Spring发展历程【3】Spring优势【4】Spring体系…...

本地快速搭建Kubernetes单机版实验环境(含问题解决方案)
Kubernetes是一个容器编排系统,用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识,包括基本概念、安装部署和基础用法。 一、什么是Kubernetes? Kubernetes是Google开发的开源项目,是一个容器编排系统&…...

FPGA控制DDS产生1CLK周期误差的分析(二)
前文简短的介绍了DDS的产生原理,其实相当的简单,所以也不需要多做解释,本文详细阐述一下在调试DDS的过程中所产生的一个bug 问题发现 正如上文所述,再用FPGA控制存储在rom中的波形信号输出之后,在上板之前࿰…...

这一次,吃了Redis的亏,也败给了GPT
关注【离心计划】,一起离开地球表面 背景 组内有一个系统中有一个延迟任务的需求,关于延迟任务常见的做法有时间轮、延迟MQ还有Redis Zset等方案,关于时间轮,这边小苏有一个大学时候做的demo: https://github.com/JA…...
第一章 信息化知识
1、信息是客观事物状态和运动特征的一种普遍形式,信息的概念存在两个基本的层次,即本体论层次和认识论层次: 本体论层次:就是事物的运动状态和状态变化方式的自我表述认识论层次:就是主体对于该事物的运动状态以及状态…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...