STM32F103-uc/OS系统移植
目录
前言
一、获取uc/OS-III源码
二、项目导入文件夹
2.1文件的整理
2.2导入源码
2.3STM32CubeMX创建框架
三、添加代码
3.1将源码文件复制到指定文件夹下
3.2添加文件
3.3添加文件路径
四、修改代码
4.1修改start up文件
4.2修改CONFIG/app_cfg.h
4.3修改CONFIG/includes.h
4.4修改BSP/bsp.c
4.5bsp.h
4.6CONFIG/lib_cfg.h
4.7usart.c
4.8main.c
五、运行结果
心得体会
参考文献
前言
μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。 μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。现在最新版的是μC/OS-III。
一、获取uc/OS-III源码
百度链接:https://pan.baidu.com/s/14rrirGKKcvdtkkEJIaidxA
提取码:o3co
二、项目导入文件夹
2.1文件的整理
(1)新建两个文件夹uC-BSP和uC-CONFIG,后面会用到
(2)在刚才创建的uC-BSP创建bsp.c和bsp.h文件
2.2导入源码
将下图文件复制到新建的文件加uC-CONFIG下
2.3STM32CubeMX创建框架
将管脚PB1、PB0设置为GPIO管脚OUT PUT来观察两个TASK下的LED灯闪烁,并且设置PA10为USART-RX,PA9设置为USART-TX,管脚PA13设置为SYS,PD1设置为RCC_OSC_IN,PD2设置为RCC_OSC_OUT,
此外还需要设置SYS
并且设置RCC
设置时钟为72MHZ
之后生成MDK5工程
三、添加代码
3.1将源码文件复制到指定文件夹下
3.2添加文件
在MDK5中添加六个文件CPU、LIB、PORT、SOURCE、CONFIG、BSP
(1)并在BSPfile下添加刚刚创建的空白文件bsp.c和bsp.h
(2)在文件CONFIG下添加file8个
(3) 在文件SOURCE添加file20个,从文件目录MDK-ARM/uCOOS-III/Source
(4)在文件PORT下添加file3个,从文件目录下MDK-ARM/uCOS-III/Ports/ARM-Cortex-M3/Geneic/RealView
(5)在文件CPU下添加file6个
其中包括uC-CPU下的3个和MDK-ARM/uC-CPU/ARM-Cortex-M3/Realview下的3个
(6)LIB下添加10个
3.3添加文件路径
将如图所示的8个文件加入
四、修改代码
4.1修改start up文件
PendSV_Handler修改为OS_CPU_PendSVHandler
SysTick_Handler 修改为OS_CPU_SysTickHandler
在函数中有两个地方需要进行修改
4.2修改CONFIG/app_cfg.h
#define APP_CFG_SERIAL_EN DEF_ENABLED 修改为
#define APP_CFG_SERIAL_EN DEF_DISABLED
#define APP_TRACE BSP_Ser_Printf 修改为#define APP_TRACE (void)
4.3修改CONFIG/includes.h
在#include<bsp.h>后加上 #include “gpio.h” #include “app_cfg.h”
将#include <stm32f10x_lib.h> 改为 #include “stm32f1xx_hal.h”
4.4修改BSP/bsp.c
// bsp.c
#include "includes.h"#define DWT_CR *(CPU_REG32 *)0xE0001000
#define DWT_CYCCNT *(CPU_REG32 *)0xE0001004
#define DEM_CR *(CPU_REG32 *)0xE000EDFC
#define DBGMCU_CR *(CPU_REG32 *)0xE0042004#define DEM_CR_TRCENA (1 << 24)
#define DWT_CR_CYCCNTENA (1 << 0)CPU_INT32U BSP_CPU_ClkFreq (void)
{return HAL_RCC_GetHCLKFreq();
}void BSP_Tick_Init(void)
{CPU_INT32U cpu_clk_freq;CPU_INT32U cnts;cpu_clk_freq = BSP_CPU_ClkFreq();#if(OS_VERSION>=3000u)cnts = cpu_clk_freq/(CPU_INT32U)OSCfg_TickRate_Hz;#elsecnts = cpu_clk_freq/(CPU_INT32U)OS_TICKS_PER_SEC;#endifOS_CPU_SysTickInit(cnts);
}void BSP_Init(void)
{BSP_Tick_Init();MX_GPIO_Init();
}#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void CPU_TS_TmrInit (void)
{CPU_INT32U cpu_clk_freq_hz;DEM_CR |= (CPU_INT32U)DEM_CR_TRCENA; /* Enable Cortex-M3's DWT CYCCNT reg. */DWT_CYCCNT = (CPU_INT32U)0u;DWT_CR |= (CPU_INT32U)DWT_CR_CYCCNTENA;cpu_clk_freq_hz = BSP_CPU_ClkFreq();CPU_TS_TmrFreqSet(cpu_clk_freq_hz);
}
#endif#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR CPU_TS_TmrRd (void)
{return ((CPU_TS_TMR)DWT_CYCCNT);
}
#endif#if (CPU_CFG_TS_32_EN == DEF_ENABLED)
CPU_INT64U CPU_TS32_to_uSec (CPU_TS32 ts_cnts)
{CPU_INT64U ts_us;CPU_INT64U fclk_freq;fclk_freq = BSP_CPU_ClkFreq();ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);return (ts_us);
}
#endif#if (CPU_CFG_TS_64_EN == DEF_ENABLED)
CPU_INT64U CPU_TS64_to_uSec (CPU_TS64 ts_cnts)
{CPU_INT64U ts_us;CPU_INT64U fclk_freq;fclk_freq = BSP_CPU_ClkFreq();ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);return (ts_us);
}
#endif
4.5bsp.h
// bsp.h
#ifndef __BSP_H__
#define __BSP_H__#include "stm32f1xx_hal.h"void BSP_Init(void);#endif
4.6CONFIG/lib_cfg.h
lib_cfg.h里修改堆空间的宏定义,它原本是27K,但这块板子RAM一共才20k,修改为5k
4.7usart.c
(1)参数设置
(2)加入头文件
(3)加入printf函数
/* USER CODE BEGIN 1 */
int fputc(int ch,FILE *f){HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);return ch;
}
/* USER CODE END 1 */
4.8main.c
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "usart.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <includes.h>
#include "stm32f1xx_hal.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* 任务优先级 */
#define START_TASK_PRIO 3
#define LED0_TASK_PRIO 4
#define MSG_TASK_PRIO 5
#define LED1_TASK_PRIO 6/* 任务堆栈大小 */
#define START_STK_SIZE 96
#define LED0_STK_SIZE 64
#define MSG_STK_SIZE 64
#define LED1_STK_SIZE 64/* 任务栈 */
CPU_STK START_TASK_STK[START_STK_SIZE];
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
CPU_STK MSG_TASK_STK[MSG_STK_SIZE];
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];/* 任务控制块 */
OS_TCB StartTaskTCB;
OS_TCB Led0TaskTCB;
OS_TCB MsgTaskTCB;
OS_TCB Led1TaskTCB;/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* 任务函数定义 */
void start_task(void *p_arg);
static void AppTaskCreate(void);
static void AppObjCreate(void);
static void led_pb0(void *p_arg);
static void send_msg(void *p_arg);
static void led_pb1(void *p_arg);
/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/**Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;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_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{OS_ERR err;OSInit(&err);HAL_Init();SystemClock_Config();//MX_GPIO_Init(); 这个在BSP的初始化里也会初始化MX_USART1_UART_Init(); /* 创建任务 */OSTaskCreate((OS_TCB *)&StartTaskTCB, /* Create the start task */(CPU_CHAR *)"start task",(OS_TASK_PTR ) start_task,(void *) 0,(OS_PRIO ) START_TASK_PRIO,(CPU_STK *)&START_TASK_STK[0],(CPU_STK_SIZE) START_STK_SIZE/10,(CPU_STK_SIZE) START_STK_SIZE,(OS_MSG_QTY ) 0,(OS_TICK ) 0,(void *) 0,(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR *)&err);/* 启动多任务系统,控制权交给uC/OS-III */OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */}void start_task(void *p_arg)
{OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;/* YangJie add 2021.05.20*/BSP_Init(); /* Initialize BSP functions *///CPU_Init();//Mem_Init(); /* Initialize Memory Management Module */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err); //统计任务
#endif#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间CPU_IntDisMeasMaxCurReset();
#endif#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif OS_CRITICAL_ENTER(); //进入临界区/* 创建LED0任务 */OSTaskCreate((OS_TCB * )&Led0TaskTCB, (CPU_CHAR * )"led_pb0", (OS_TASK_PTR )led_pb0, (void * )0, (OS_PRIO )LED0_TASK_PRIO, (CPU_STK * )&LED0_TASK_STK[0], (CPU_STK_SIZE)LED0_STK_SIZE/10, (CPU_STK_SIZE)LED0_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR * )&err); /* 创建LED1任务 */OSTaskCreate((OS_TCB * )&Led1TaskTCB, (CPU_CHAR * )"led_pb1", (OS_TASK_PTR )led_pb1, (void * )0, (OS_PRIO )LED1_TASK_PRIO, (CPU_STK * )&LED1_TASK_STK[0], (CPU_STK_SIZE)LED1_STK_SIZE/10, (CPU_STK_SIZE)LED1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR * )&err); /* 创建MSG任务 */OSTaskCreate((OS_TCB * )&MsgTaskTCB, (CPU_CHAR * )"send_msg", (OS_TASK_PTR )send_msg, (void * )0, (OS_PRIO )MSG_TASK_PRIO, (CPU_STK * )&MSG_TASK_STK[0], (CPU_STK_SIZE)MSG_STK_SIZE/10, (CPU_STK_SIZE)MSG_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err);OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //挂起开始任务 OS_CRITICAL_EXIT(); //进入临界区
}
/*** 函数功能: 启动任务函数体。* 输入参数: p_arg 是在创建该任务时传递的形参* 返 回 值: 无* 说 明:无*/
static void led_pb0 (void *p_arg)
{OS_ERR err;(void)p_arg;BSP_Init(); /* Initialize BSP functions */CPU_Init();Mem_Init(); /* Initialize Memory Management Module */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
#endifCPU_IntDisMeasMaxCurReset();AppTaskCreate(); /* Create Application Tasks */AppObjCreate(); /* Create Application Objects */while (DEF_TRUE){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);OSTimeDlyHMSM(0, 0, 1, 0,OS_OPT_TIME_HMSM_STRICT,&err);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);OSTimeDlyHMSM(0, 0, 1, 0,OS_OPT_TIME_HMSM_STRICT,&err);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}static void led_pb1 (void *p_arg)
{OS_ERR err;(void)p_arg;BSP_Init(); /* Initialize BSP functions */CPU_Init();Mem_Init(); /* Initialize Memory Management Module */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
#endifCPU_IntDisMeasMaxCurReset();AppTaskCreate(); /* Create Application Tasks */AppObjCreate(); /* Create Application Objects */while (DEF_TRUE){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);OSTimeDlyHMSM(0, 0, 3, 0,OS_OPT_TIME_HMSM_STRICT,&err);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);OSTimeDlyHMSM(0, 0, 3, 0,OS_OPT_TIME_HMSM_STRICT,&err);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}static void send_msg (void *p_arg)
{OS_ERR err;(void)p_arg;BSP_Init(); /* Initialize BSP functions */CPU_Init();Mem_Init(); /* Initialize Memory Management Module */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
#endifCPU_IntDisMeasMaxCurReset();AppTaskCreate(); /* Create Application Tasks */AppObjCreate(); /* Create Application Objects */while (DEF_TRUE){printf("hello uc/OS \r\n");OSTimeDlyHMSM(0, 0, 2, 0,OS_OPT_TIME_HMSM_STRICT,&err);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/* USER CODE BEGIN 4 */
/*** 函数功能: 创建应用任务* 输入参数: p_arg 是在创建该任务时传递的形参* 返 回 值: 无* 说 明:无*/
static void AppTaskCreate (void)
{}/*** 函数功能: uCOSIII内核对象创建* 输入参数: 无* 返 回 值: 无* 说 明:无*/
static void AppObjCreate (void)
{}/* 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 */
}#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{ /* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
将此部分代码代替原来main.c的代码段。
五、运行结果
心得体会
整个实验下来,比较容易出现错误的是在添加文件的那八个步骤,很容易就出现添加混乱错误的情况,因为文件太多看的眼花缭乱所以需要自己更加努力。而且在后面在代码改头文件的时候容易看漏,这个需要更加仔细的在全部代码里面搜索。最后做出实验结果很有成就感,继续努力。
参考文献
基于stm32cubemx移植uC/OS-III操作系统_Laul Ken-Yi的博客-CSDN博客目录一、获取uC/OS-III源码二、文件夹整理2.1 新建文件夹2.2 创建空文件2.3 导入源码2.4 创建基础stm32框架2.5 导入文件和增加头函数路径2.6 打开keil,增加item2.6.1 并在BSP,file下添加刚刚创建的空白文件bsp.c和bsp.h。2.6.2 在CONFIG下添加file,8个2.6.3 在SOURCE添加file,20个2.6.4 PORT下添加file,3个2.6.5 CPU下添加file,6个2..https://blog.csdn.net/qq_60678931/article/details/121618935?spm=1001.2014.3001.5501STM32F103C8移植uCOSIII(HAL库)_junseven164的博客-CSDN博客少年一、随笔二、uCOSIII源码三、项目导入文件整理四、导入文件和增加头函数路径五、代码改动六、参考资料一、随笔移植一个嵌入式系统用了一天时间,只能说不愧是我,在不了解的情况下还是少一些自己的操作,自己挖坑埋自己。记录一下过程和踩过的坑。二、uCOSIII源码官网上可以去下,但是比较麻烦,就不多描述了,这里放一份源码(百度网盘的),提取码1111https://pan.baidu.com/s/1jCoc2sfiij78J0Q-C6ChmA三、项目导入文件整理在这个页面建立这两个
https://blog.csdn.net/junseven164/article/details/121534916STM32F103C8T6移植uCOS基于HAL库_机智的橙子的博客-CSDN博客文章目录一.使用CubeMX建立STM32F103C8T6HAL库二.准备uCOSIII源码三.移植前准备1.为uC-BSP文件夹新建bsp.c和bsp.h文件2.给文件夹uC-CONFIG添加以下文件(从以下路径复制过来)3.将uCOS相关文件复制到HAL工程的MDK-ARM文件夹下四.开始移植1.将uCOS文件添加到项目2.为bsp.c和bsp.h添加代码3.修改main.c文件代码4.修改其余文件部分代码5.参数配置五.运行六.总结七.参考链接一.使用CubeMX建立STM32F103C8T6HAL
https://blog.csdn.net/qq_45659777/article/details/121570886
STM32F103-uc/OS系统移植相关推荐
- -uc/OS系统移植(基于STM32F103C8T6,超详细讲解)
完成STM32F103C8基于HAL库的-uc/OS系统移植 一.创建HAL库 二.下载uc/OSIII源码及移植准备 1.下载uc/OSIII源码 2.将uc/OS源码文件复制到工程 三.将uc/O ...
- 基于STM32的uc/OS系统移植及用Saleae Logic 16抓取分析波形
文章目录 一.关于uc/OS系统 1.操作系统与裸机的区别 2.uc/OS运行流程 二.详细移植过程 1.STM32Cubex创建工程 2.为工程添加源码 3.添加头文件路径 4.添加代码 1)bsp ...
- 基于STM32F103RC移植uc/OS系统
目录 一.获取uc/OS-III源码 二.使用CubeMX创建基础stm32框架 三.文件准备 四.路径添加 五.代码修改 六.成功展示 七.使用Keil仿真逻辑仪观察引脚电平变化 八.参考资料 本文 ...
- 0 uC/OS 系统精讲索引
uC/OS-II与uC/OS-III放在一起讲,每个例程同时提供两个版本的源代码. 本系列教程主要涉及如下内容: [原理部分] 1-操作系统简介:基本概念 2-目录结构与测试环境搭建:uC/OS-II ...
- uC/OS-III系统移植STM32F103C8
本实验是将嵌入式实时操作系统移植入STM32系列开发板,并完成一些基础的指令任务.此次实验采用的芯片为STM32F103C8 目录 一.使用STM32CUBEMX建立STM HEL 库工程 二.准备u ...
- STM32F103C8T6移植uc/OS
STM32F103C8T6移植uc/OS STM32F103C8T6移植uc/OS STM32F103C8T6移植uc/OS 一.题目要求 二.使用STM32CubeMX建立HAL库 三.准备uCOS ...
- 嵌入式系统 操作系统 uC/OS uClinux
摘要:嵌入式操作系统是嵌入式系统应用的核心软件.本文通过对两种典型的开源嵌入式操作系统的对比,分析和总结嵌入式操作系统应用中的若干问题,归纳嵌入式操作系统的选型依据. 关键词:嵌入式系统 操作系统 u ...
- uC/OS和uClinux的比较
摘 要: 嵌入式操作系统是嵌入式系统应用的核心.本文通过对两种典型的开源嵌入式操作系统的对比,分析和总结了嵌入式操作系统应用中的若干问题,归纳了嵌入式操作系统的选型依据. 引言 随着现代 ...
- UC/OS和UCLinux比较
随着现代计算机技术的飞速发展和互联网技术的广泛应用,从pc时代过渡到了以个人数字助理.手持个人电脑和信息家电为代表的3c(计算机.通信.消费电子)一体的后pc时代.后pc时代里,嵌入式系统扮演了越来越 ...
最新文章
- 告诫那些有创业梦的大学生,切记千万不要盲目创业!
- 如何通过代码连接SQL Server数据库
- JAVA基础中容易踩坑的知识点
- 贷款100万到手97万,这样合理吗?
- android之多媒体篇(一)
- javascript 中文与Unicode相互转化
- 刷新SOTA!Salesforce提出跨模态对比学习新方法,仅需4M图像数据!
- 实践中整理出tomcat集群和负载均衡
- HDU 2686 多线程DP
- 38K红外遥控发射与接收电路设计与选型、正向压降、限流电阻、半值角
- MIT机器人闭上眼睛,靠触觉也爬得上凶险的楼梯 | 施工未完成
- 4----apache主配置文件模板和基于域名虚拟主机配置文件模板
- python学到什么程度可以找到工作-Python学到什么程度才可以去找工作?掌握这4点足够了!...
- python画三维图-Python使用matplotlib绘制三维图形示例
- Xorg可以使用hot-plug了,不过配置很麻烦
- MVC学习系列7--下拉框的联动
- DAG最小可重路径覆盖or最长反链的一种做法
- java数组base64编码,java将base64编码字符串还原为字节数组
- java两天速成_JAVA速成
- 计算机根号函数,excel公式中开根号是哪一个函数啊(excel开根号的公式)