UCOSIII---工程移植
UCOSIII-移植
- 源码下载
- 移植
- 基础工程
- 向BSP、CONFIG文件夹添加文件
- CONFIG文件夹
- BSP文件夹
- 工程中添加
- 魔术棒添加宏
- 修改bsp.c 、bsp.h 文件
- 修改os_cpu_a.asm文件
- 修改os_cpu_c.c文件
- 修改os_cfg_app.h文件
- 修改sys.h文件
- 测试
源码下载
本文参考自正点原子视频以及笔记
在官方下载源码
UCOSIII官网
解压后打开官方基于STM32F107移植好的源码
移植
基础工程
- 创建好准备移植的STM32基础工程
- 在工程“UCOSIII移植”中新建文件夹"UCOSIII"用于存放UCOSIII有关源码 从官方拷贝的文件源码全都放于此文件夹下
将官方移植好的以下三个文件夹路径为
UCOSIII官方STM32F107移植\Micrium\Software
复制到我们的工程中UCOSIII目录下路径为UCOSIII移植\UCOSIII
工程文件UCOSIII目录下新建UCOS-BSP以及UCOS-CONFIG文件夹
向BSP、CONFIG文件夹添加文件
CONFIG文件夹
将官方移植源码中 路径为UCOSIII官方STM32F107移植\Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-III
的以下文件拷贝至我们工程UCOSIII目录下UCOS-CONFIG
文件夹中路径为UCOSIII移植\UCOSIII\UCOS-CONFIG
UCOS-CONFIG文件夹添加文件后目录如下
BSP文件夹
将官方移植源码中 路径为UCOSIII官方STM32F107移植\Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\BSP
的以下文件拷贝至我们工程UCOSIII目录下UCOS-BSP
文件夹中路径为UCOSIII移植\UCOSIII\UCOS-BSP
UCOS-BSP文件夹添加文件后目录如下
工程中添加
- 在keil中添加分组
- UCOS-BSP 分组路径为
UCOSIII移植\UCOS-BSP
UCOS-CPU 分组路径为
UCOSIII移植\UCOSIII\uC-CPU
使用keil cpu_c.c应选择路径为UCOSIII移植\UCOSIII\uC-CPU\ARM-Cortex-M3\RealView
中的cpu_c.c
UCOS-LIB 分组路径为
UCOSIII移植\UCOSIII\uC-LIB
使用keil lib_mem_a.asm应选择路径为UCOSIII移植\UCOSIII\uC-CPU\ARM-Cortex-M3\RealView
中的lib_mem_a.asm
UCOS-PORT 分组路径为
UCOSIII移植\UCOSIII\uCOS-III\Ports
使用keil 选择路径UCOSIII移植\UCOSIII\uCOS-III\Ports\ARM-Cortex-M3\Generic\RealView
UCOS-CONFIG 分组路径为
UCOSIII移植\UCOSIII\UCOS-CONFIG
UCOS-CORE 分组路径为
UCOSIII移植\UCOSIII\uCOS-III\Source
魔术棒添加宏
修改文件权限
工程中文件带锁,只有只读的权限
修改文件权限将UCOSIII文件夹右键属性修改
修改bsp.c 、bsp.h 文件
bsp.c、bsp.h使用的是正点原子移植例程中已经修改好的bsp.c、bsp.h文件 将其替换掉工程中的bsp.c、bsp.h文件
编译后无警告错误,至此移植暂为成功,语法上没有错误
修改os_cpu_a.asm文件
使用的是正点原子移植例程中已经修改好的os_cpu_a.asm文件 代码如下 将其拷贝覆盖os_cpu_a.asm文件
;
;********************************************************************************************************
; uC/OS-III
; The Real-Time Kernel
;
;
; (c) Copyright 2009-2010; Micrium, Inc.; Weston, FL
; All rights reserved. Protected by international copyright laws.
;
; ARM Cortex-M3 Port
;
; File : OS_CPU_A.ASM
; Version : V3.01.2
; By : JJL
; BAN
;
; For : ARMv7M Cortex-M3
; Mode : Thumb2
; Toolchain : RealView Development Suite
; RealView Microcontroller Development Kit (MDK)
; ARM Developer Suite (ADS)
; Keil uVision
;********************************************************************************************************
;;********************************************************************************************************
; PUBLIC FUNCTIONS
;********************************************************************************************************IMPORT OSRunning ; External referencesIMPORT OSPrioCurIMPORT OSPrioHighRdyIMPORT OSTCBCurPtrIMPORT OSTCBHighRdyPtrIMPORT OSIntExitIMPORT OSTaskSwHookIMPORT OS_CPU_ExceptStkBaseEXPORT OSStartHighRdy ; Functions declared in this fileEXPORT OS_CPU_PendSVHandler;PAGE
;********************************************************************************************************
; EQUATES
;********************************************************************************************************NVIC_INT_CTRL EQU 0xE000ED04 ; Interrupt control state register.
NVIC_SYSPRI14 EQU 0xE000ED22 ; System priority register (priority 14).
NVIC_PENDSV_PRI EQU 0xFF ; PendSV priority value (lowest).
NVIC_PENDSVSET EQU 0x10000000 ; Value to trigger PendSV exception.;********************************************************************************************************
; CODE GENERATION DIRECTIVES
;********************************************************************************************************PRESERVE8THUMBAREA CODE, CODE, READONLY;PAGE
;********************************************************************************************************
; START MULTITASKING
; void OSStartHighRdy(void)
;
; Note(s) : 1) This function triggers a PendSV exception (essentially, causes a context switch) to cause
; the first task to start.
;
; 2) OSStartHighRdy() MUST:
; a) Setup PendSV exception priority to lowest;
; b) Set initial PSP to 0, to tell context switcher this is first run;
; c) Set the main stack to OS_CPU_ExceptStkBase
; d) Trigger PendSV exception;
; e) Enable interrupts (tasks will run with interrupts enabled).
;********************************************************************************************************OSStartHighRdyLDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priorityLDR R1, =NVIC_PENDSV_PRISTRB R1, [R0]MOVS R0, #0 ; Set the PSP to 0 for initial context switch callMSR PSP, R0LDR R0, =OS_CPU_ExceptStkBase ; Initialize the MSP to the OS_CPU_ExceptStkBaseLDR R1, [R0]MSR MSP, R1 LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)LDR R1, =NVIC_PENDSVSETSTR R1, [R0]CPSIE I ; Enable interrupts at processor levelOSStartHangB OSStartHang ; Should never get here;PAGE
;********************************************************************************************************
; HANDLE PendSV EXCEPTION
; void OS_CPU_PendSVHandler(void)
;
; Note(s) : 1) PendSV is used to cause a context switch. This is a recommended method for performing
; context switches with Cortex-M3. This is because the Cortex-M3 auto-saves half of the
; processor context on any exception, and restores same on return from exception. So only
; saving of R4-R11 is required and fixing up the stack pointers. Using the PendSV exception
; this way means that context saving and restoring is identical whether it is initiated from
; a thread or occurs due to an interrupt or exception.
;
; 2) Pseudo-code is:
; a) Get the process SP, if 0 then skip (goto d) the saving part (first context switch);
; b) Save remaining regs r4-r11 on process stack;
; c) Save the process SP in its TCB, OSTCBCurPtr->OSTCBStkPtr = SP;
; d) Call OSTaskSwHook();
; e) Get current high priority, OSPrioCur = OSPrioHighRdy;
; f) Get current ready thread TCB, OSTCBCurPtr = OSTCBHighRdyPtr;
; g) Get new process SP from TCB, SP = OSTCBHighRdyPtr->OSTCBStkPtr;
; h) Restore R4-R11 from new process stack;
; i) Perform exception return which will restore remaining context.
;
; 3) On entry into PendSV handler:
; a) The following have been saved on the process stack (by processor):
; xPSR, PC, LR, R12, R0-R3
; b) Processor mode is switched to Handler mode (from Thread mode)
; c) Stack is Main stack (switched from Process stack)
; d) OSTCBCurPtr points to the OS_TCB of the task to suspend
; OSTCBHighRdyPtr points to the OS_TCB of the task to resume
;
; 4) Since PendSV is set to lowest priority in the system (by OSStartHighRdy() above), we
; know that it will only be run when no other exception or interrupt is active, and
; therefore safe to assume that context being switched out was using the process stack (PSP).
;********************************************************************************************************OS_CPU_PendSVHandlerCPSID I ; Prevent interruption during context switchMRS R0, PSP ; PSP is process stack pointerCBZ R0, OS_CPU_PendSVHandler_nosave ; Skip register save the first timeSUBS R0, R0, #0x20 ; Save remaining regs r4-11 on process stackSTM R0, {R4-R11}LDR R1, =OSTCBCurPtr ; OSTCBCurPtr->OSTCBStkPtr = SP;LDR R1, [R1]STR R0, [R1] ; R0 is SP of process being switched out; At this point, entire context of process has been saved
OS_CPU_PendSVHandler_nosavePUSH {R14} ; Save LR exc_return valueLDR R0, =OSTaskSwHook ; OSTaskSwHook();BLX R0POP {R14}LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHighRdy;LDR R1, =OSPrioHighRdyLDRB R2, [R1]STRB R2, [R0]LDR R0, =OSTCBCurPtr ; OSTCBCurPtr = OSTCBHighRdyPtr;LDR R1, =OSTCBHighRdyPtrLDR R2, [R1]STR R2, [R0]LDR R0, [R2] ; R0 is new process SP; SP = OSTCBHighRdyPtr->StkPtr;LDM R0, {R4-R11} ; Restore r4-11 from new process stackADDS R0, R0, #0x20MSR PSP, R0 ; Load PSP with new process SPORR LR, LR, #0x04 ; Ensure exception return uses process stackCPSIE IBX LR ; Exception return will restore remaining contextEND
修改编译会出现错误
在文件stm32f10x_it.c文件中将PendSV_Handler()函数和SysTick_Handler(void)函数注释
//void PendSV_Handler(void)
//{
//}
//void SysTick_Handler(void)
//{
//}
修改os_cpu_c.c文件
添加 include “includes.h”
编译后
在includes.h中的stm32f10x_lib.h注释掉
修改os_cfg_app.h文件
使用的是正点原子移植例程中已经修改好的os_cfg_app.h文件 代码如下 将其拷贝覆盖os_cfg_app.h文件
/*
************************************************************************************************************************
* uC/OS-III
* The Real-Time Kernel
*
* (c) Copyright 2009-2012; Micrium, Inc.; Weston, FL
* All rights reserved. Protected by international copyright laws.
*
* OS CONFIGURATION (APPLICATION SPECIFICS)
*
* File : OS_CFG_APP.H
* By : JJL
* Version : V3.03.01
*
* LICENSING TERMS:
* ---------------
* uC/OS-III is provided in source form for FREE short-term evaluation, for educational use or
* for peaceful research. If you plan or intend to use uC/OS-III in a commercial application/
* product then, you need to contact Micrium to properly license uC/OS-III for its use in your
* application/product. We provide ALL the source code for your convenience and to help you
* experience uC/OS-III. The fact that the source is provided does NOT mean that you can use
* it commercially without paying a licensing fee.
*
* Knowledge of the source code may NOT be used to develop a similar product.
*
* Please help us continue to provide the embedded community with the finest software available.
* Your honesty is greatly appreciated.
*
* You can contact us at www.micrium.com, or by phone at +1 (954) 217-2036.
************************************************************************************************************************
*/#ifndef OS_CFG_APP_H
#define OS_CFG_APP_H/*
************************************************************************************************************************
* CONSTANTS
************************************************************************************************************************
*//* --------------------- MISCELLANEOUS ------------------ */
#define OS_CFG_MSG_POOL_SIZE 100u/* Maximum number of messages */
#define OS_CFG_ISR_STK_SIZE 128u/* Stack size of ISR stack (number of CPU_STK elements) */
#define OS_CFG_TASK_STK_LIMIT_PCT_EMPTY 10u/* Stack limit position in percentage to empty *//* ---------------------- IDLE TASK --------------------- */
#define OS_CFG_IDLE_TASK_STK_SIZE 128u/* Stack size (number of CPU_STK elements) *//* ------------------ ISR HANDLER TASK ------------------ */
#define OS_CFG_INT_Q_SIZE 10u/* Size of ISR handler task queue */
#define OS_CFG_INT_Q_TASK_STK_SIZE 128u/* Stack size (number of CPU_STK elements) *//* ------------------- STATISTIC TASK ------------------- */
#define OS_CFG_STAT_TASK_PRIO (OS_CFG_PRIO_MAX-2u)/* Priority 统计任务优先级 */
#define OS_CFG_STAT_TASK_RATE_HZ 10u/* Rate of execution (1 to 10 Hz) */
#define OS_CFG_STAT_TASK_STK_SIZE 128u/* Stack size (number of CPU_STK elements) *//* ------------------------ TICKS ----------------------- */
#define OS_CFG_TICK_RATE_HZ 200u/* Tick rate in Hertz (10 to 1000 Hz) */
#define OS_CFG_TICK_TASK_PRIO 1u/* Priority 时钟节拍任务,一般设置一个相对较高的优先级 */
#define OS_CFG_TICK_TASK_STK_SIZE 128u/* Stack size (number of CPU_STK elements) */
#define OS_CFG_TICK_WHEEL_SIZE 17u/* Number of 'spokes' in tick wheel; SHOULD be prime *//* ----------------------- TIMERS ----------------------- */
#define OS_CFG_TMR_TASK_PRIO 2u/* Priority of 'Timer Task' 定时任务优先级 */
#define OS_CFG_TMR_TASK_RATE_HZ 100u/* Rate for timers (100 Hz Typ.) */
#define OS_CFG_TMR_TASK_STK_SIZE 128u/* Stack size (number of CPU_STK elements) */
#define OS_CFG_TMR_WHEEL_SIZE 17u/* Number of 'spokes' in timer wheel; SHOULD be prime */#endif
修改sys.h文件
将 SYSTEM_SUPPORT_OS宏定义设置为1
测试
使用正点原子main函数进行测试
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"//任务优先级
#define START_TASK_PRIO 3
//任务堆栈大小
#define START_STK_SIZE 512
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);//任务优先级
#define LED0_TASK_PRIO 4
//任务堆栈大小
#define LED0_STK_SIZE 128
//任务控制块
OS_TCB Led0TaskTCB;
//任务堆栈
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *p_arg);//任务优先级
#define LED1_TASK_PRIO 5
//任务堆栈大小
#define LED1_STK_SIZE 128
//任务控制块
OS_TCB Led1TaskTCB;
//任务堆栈
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *p_arg);//任务优先级
#define FLOAT_TASK_PRIO 6
//任务堆栈大小
#define FLOAT_STK_SIZE 128
//任务控制块
OS_TCB FloatTaskTCB;
//任务堆栈
__align(8) CPU_STK FLOAT_TASK_STK[FLOAT_STK_SIZE];
//任务函数
void float_task(void *p_arg);int main(void)
{OS_ERR err;CPU_SR_ALLOC();delay_init(); //延时初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置uart_init(115200); //串口波特率设置LED_Init(); //LED初始化OSInit(&err); //初始化UCOSIIIOS_CRITICAL_ENTER();//进入临界区//创建开始任务OSTaskCreate((OS_TCB * )&StartTaskTCB, //任务控制块(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, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,(void * )0, //用户补充的存储区(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项(OS_ERR * )&err); //存放该函数错误时的返回值OS_CRITICAL_EXIT(); //退出临界区OSStart(&err); //开启UCOSIIIwhile(1);
}//开始任务函数
void start_task(void *p_arg)
{OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;CPU_Init();
#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);
#endifOS_CRITICAL_ENTER(); //进入临界区//创建LED0任务OSTaskCreate((OS_TCB * )&Led0TaskTCB, (CPU_CHAR * )"led0 task", (OS_TASK_PTR )led0_task, (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 * )"led1 task", (OS_TASK_PTR )led1_task, (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); //创建浮点测试任务OSTaskCreate((OS_TCB * )&FloatTaskTCB, (CPU_CHAR * )"float test task", (OS_TASK_PTR )float_task, (void * )0, (OS_PRIO )FLOAT_TASK_PRIO, (CPU_STK * )&FLOAT_TASK_STK[0], (CPU_STK_SIZE)FLOAT_STK_SIZE/10, (CPU_STK_SIZE)FLOAT_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(); //进入临界区
}//led0任务函数
void led0_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED0=0;OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //延时200msLED0=1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms}
}//led1任务函数
void led1_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED1=~LED1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms}
}//浮点测试任务
void float_task(void *p_arg)
{CPU_SR_ALLOC();static float float_num=0.01;while(1){float_num+=0.01f;OS_CRITICAL_ENTER(); //进入临界区printf("float_num的值为: %.4f\r\n",float_num);OS_CRITICAL_EXIT(); //退出临界区delay_ms(500); //延时500ms}
}
运行结果
绿灯红灯交替闪烁
证明UCOSIII移植成功,可在工程中编写添加自己的代码
UCOSIII---工程移植相关推荐
- evc4工程移植vs.net2005所碰到的问题积累
收集自网络] 原文:http://hi.baidu.com/copperlee/blog/item/c5c7abdc2a5f9fa3cc116638.html 在移植项目前,建议还是看看以下的文章: ...
- intellij idea -- 工程移植
前言: 做课设在intellij idea导入时遇到了一点问题,现在记录一下解决过程: 环境: 是一个 web项目,实现网上书店.可以注册,订书,查询用户的订单等等.分管理员和用户:管理员可以增删书籍 ...
- STM32不同型号单片机keil工程移植说明
STM32系列单片机如果库函数开发的话,那么不同型号单片机的工程是可以直接移植的.这样的话如果项目中更换了芯片,工程就可以直接移植过去,不用重新编写.这样就节约了很多时间. 下面说一下如何将 在STM ...
- STM32F103ZE工程移植到STM32F107VC上软件调试时死循环在while((RCC-CR RCC_CR_PLL2RDY) == 0) { }
STM32F103ZE工程移植到STM32F107VC上软件调试时死循环在while((RCC->CR & RCC_CR_PLL2RDY) == 0) { }@TOC 第一次移植不知道改 ...
- STM32F工程移植注意事项
STM32F工程移植注意事项 文档由来 最近项目用到STM32F429,参考的是正点原子的STM32F4开发板.本文主要说明一下代码移植过程中的注意事项,记录一下其中最基本的几个改动.方便后续再次做类 ...
- 跨平台工程移植:opencv_pnp + artoolkitplus :ubuntu qtcreator-- windows qtcreator/ VS
跨平台工程移植:源码编译的方式. 今天我要将一个ubuntu基于artoolkitplus库开发的qtcreator工程移植到widows版本下给其它同事开发. 鉴于在ubuntu下的开发都是基于cm ...
- 【STM32WLE5之LoRa# 系列2、易智联LM401 评估板PingPong工程移植】
STM32WLE5之LoRa# 系列2:易智联LM401 评估板PingPong工程移植 前言 一.开发环境 1.STM32CubeMX与STM32CubeIDE软件安装 2.下载STM32WL固件库 ...
- 单片机 STM32F103C8T6 cubeMX HAL库 从环境到开发 正点原子工程移植 freeRTOS
文章目录 0 准备材料 1 闪烁PC13的小灯 2 正点原子工程移植 注意点以及细节 3 freeRTOS 3.1 LED KEY 串口1 的一个实验 0 准备材料 1.需要正点原子的HAL介绍书籍可 ...
- 基于裸机工程移植内核
基于裸机工程移植内核 在TencentOS Tiny官方项目仓下载内核代码,下载地址: GITHUB:https://github.com/OpenAtomFoundation/TencentOS-t ...
- T5工程移植到 T5L 屏的步骤
不是原创 是在迪文客服拿的移植文件 ,作为分享给大家一起学习 首先,了解 K600+与 T5L 屏开发上的区别: 1,首先开发软件使用版本不一样,K600+使用软件版本 DGUS V5.08,T5L ...
最新文章
- 计算机考试批处理试题,2015计算机三级考试pc技术模拟试题及答案(八)
- web developer tips (69):vs中在浏览器中查看的快捷键
- 人脸识别屡遭非议,会成为“潘多拉魔盒”吗?
- POJ 1862 amp; ZOJ 1543 Stripies(贪心 | 优先队列)
- 桌面虚拟化之PCoIP访问协议硬卡介绍
- 阿里巴巴 CTO 首次分享技术战略
- 关于色域与BT.2020相关学习心得笔记
- 树莓派笔记8:UDP传输视频帧
- Echarts中调色盘的作用
- 【Swift】401状态处理流程
- 替换单词c语言程序,用c语言完成单词替换
- spring boot火车票售卖系统毕业设计代码211004
- react native 文本只显示两行
- 路由器带硬盘+文件服务器,还买什么NAS 一台带有USB3.0的路由器解决家庭存储共享...
- 英特尔前任 CEO 安迪·格鲁夫的传奇一生
- 推荐几个Sublime插件
- skip-gram模型理解
- 后发习得数据 机器学习_第1章 机器学习理论简述
- 北京迅为IMX6ULL开发板 DHT11网络编程实战练习
- 北京上海深圳,还缺广州
热门文章
- 如何解决(网页)粘贴数据到excel数据变换问题
- win7安装Android Studio
- 为什么公司宁愿花 15k 重招一个新人,也不愿加薪 5k 留住老程序员?
- 入手新吉他了--雅马哈F600
- 9700usb网卡 linux驱动,qf9700 USB网卡在x86 linux和arm linux上的驱动安装以及配置
- 计算机图形学的网络课程
- 大数据杀熟行为10月1日起明令禁止,作为开发的你怎么看?
- 计算机本地连接无internet访问权限,ipv4连接无internet访问权限怎么解决
- 笔记本WIFI无法上网(无Internet访问权限)
- IPv4无网络访问权限解决办法