文章目录

  • 一、用CubeMX建立工程
  • 二、uCOSIII移植
    • 一、下载uCOSIII源码
    • 二、移植前准备工作
    • 三、开始移植
  • 三、实现功能
    • 一、任务描述
    • 二、代码
  • 四、效果展示
  • 总结

一、用CubeMX建立工程

1、选择芯片型号stm32c8t6
2、配置RCC如图:

3、配置SYS

4、选择自己想用的引脚。

5、最后在Connectivity中配置USART1

7、工程配置
此处注意选择使用的IDE与版本号即可。

然后选择Code Generator,进行如下设置。

到了此处就可以生成工程并打开了

二、uCOSIII移植

一、下载uCOSIII源码

官网地址:http://micrium.com/downloadcenter/

二、移植前准备工作

为便于后续的进行,在生成的keil工程文件夹中新建一个 UCOSIII 的文件夹,并将下载的源代码中的三个文件夹: Uc-CPU、 uC-LIB、 Ucos-III 复制到我们新建的文件夹中,如下图:

在src文件夹中建立os文件

将下载的源码中的uCOS-III中的文件复制到新建的os文件中如图:

同时在os文件中新建三个空白文件: bsp.c、bsp.h、app.h

三、开始移植

1、添加工程分组,打开工程,按如图方法添加新的组。先点击红框处,再点击黄框处进行添加绿框中的组。

2、在新建的组中添加文件。
点击 Add Files…按钮,将文件目录跳转至: UCOSIII/uC-CPU, 选择 ALL files 文件类型,将其中的三个文件点击 Add 添加, 然后再打开: ARM-Cortex-M3\RealView, 同样选择 ALL files 文件类型,将三个文件添加进 CPU 组,添加后如下:

同刚才一样将LIB打开,选择uCLIB,将其中的九个文件及Realview中的文件加入进来如下图:

选择PORT,将RealView中的三个文件添加进来。

选择SOURCE,打开UCOSIII/UcosIII/Source,将其中20个文件添加进来,如下图:

选择CONFIG进行添加,将os文件夹中的八个文件添加进来,如下:

最后添加BSP,将创建的空的bsp.c与bsp.h添加进来即可。

3、添加头文件路径。
点击魔术棒,选择c/c++中的include paths。

添加如下路径:

4、修改文件内容
a.选中处进行如下修改。


b.修改app_cfg.h


c.修改includes.h

#include <bsp.h>
修改为
#include <bsp.h>
#include “gpio.h”
#include “app_cfg.h”
#include “app.h”


#include <stm32f10x_lib.h>
修改为
#include “stm32f1xx_hal.h”

d.在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

bsp.h

// bsp.h
#ifndef  __BSP_H__
#define  __BSP_H__#include "stm32f1xx_hal.h"void BSP_Init(void);#endif

e.将app文件删掉。

f.在lib_cfg.h中将进行如下更改:

#define LIB_MEM_CFG_HEAP_SIZE 27u * 1024u
改为
#define LIB_MEM_CFG_HEAP_SIZE 5u * 1024u

g.最后进行printf重定向,直接在main函数中添加如下代码即可

/* 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 */

三、实现功能

一、任务描述

1、要求:对不同的两个灯进行一秒和三秒的周期明灭变化。
2、已2s为一个周期,通过串口发送“hello us/OS!欢迎来到RTOS多任务环境!”

二、代码

1、初始化GPIO_PA3,在gpio.c文件中进行如下更改,仅改该函数即可。

void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);/*Configure GPIO pin : PC13|PA3 */GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}

2.更改main函数。

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "usart.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <includes.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* 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 *//* 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_pc13(void *p_arg);
static  void  send_msg(void *p_arg);
static  void  led_pa3(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_pc13",        (OS_TASK_PTR )led_pc13,             (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_pa3",         (OS_TASK_PTR )led_pa3,          (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_pc13 (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(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);OSTimeDlyHMSM(0, 0, 1, 0,OS_OPT_TIME_HMSM_STRICT,&err);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,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_pa3 (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(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);OSTimeDlyHMSM(0, 0, 3, 0,OS_OPT_TIME_HMSM_STRICT,&err);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,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! 欢迎来到RTOS多任务环境! \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****/

四、效果展示

led灯闪烁

串口通信

总结

uCOSIII按照各种大佬的方法抄还是能移植进入stm32c8t6中,只是多多少少会存在各种问题,不知道是什么原因,然后到处找问题,查漏补缺总算是拼出来了,在解决问题的过程中多少还是有些收获。
参考链接:
https://blog.csdn.net/qq_45659777/article/details/121570886
https://blog.csdn.net/weixin_43116606/article/details/105532222

uCOSIII移植stm32c8t6相关推荐

  1. mysql 移植ucos_基于STM32F767的UCOSIII移植学习

    (一)移植前的准备 1.HAL库基本工程模板 新建一个工程模块,其中包含LED驱动和串口驱动程序即可,用于验证UCOS-III系统能够正常工作. 2.UCOS-III源码准备 去Micrium官网下载 ...

  2. UCOSIII移植STM32(Cotex-M4)HAL库相关问题

    作者的开发板:        STM32L431(Cotex-M4) 开发环境:                Keil5 MDK+ STM32CubeMX 官方例程+源码:        UCOSI ...

  3. UCOSIII移植问题说明

    在进行UCOSIII一致的过程中 在进入Systick中断的过程中一定要确保系统已经开始运行才能够进入中断,否则容易出错 void SysTick_Handler(void) {if(delay_os ...

  4. uCOS-III应用开发笔记之一:uCOS-III在STM32的移植

    uCOS-III实时操作系统在MCU平台被广泛使用,在这里我们将简单的记录如何将uCOS-III实时操作系统移植到目标平台上并运行. 1.必要的准备 在开始uCOS-III实时操作系统的移植前,我们还 ...

  5. 【UCOSIII】UCOSIII基础知识和STM32F103的移植

    前后台系统和RTOS系统 前后台系统 早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念.通常把程序分为两部分:前台系统和后台系统. 简单 ...

  6. 在UCOSIII基础上对STM32F407ZGT6移植LWIP2.1.3

    在UCOSIII基础上对STM32F407ZGT6移植LWIP2.1.3 1.移植的准备工作 1.1 基础工程 1.2 ST 以太网库下载 1.3 LWIP 文件下载 2 添加及修改ST 以太网库 2 ...

  7. tensorflow2.0 图像处理项目_UCOSIII移植——STM32F769I 图像处理能力评测之五

    硬件平台:STM32F769IDISCOVERY 软件平台:KEIL5.1 UCOSIII简介: uC/OS-III是一个可扩展的,可固化的,抢占式的实时内核,它管理的任务个数不受限制.它是第三代内核 ...

  8. 【第3版emWin教程】第8章 emWin6.x的带OS方式移植(STM32H7之RGB接口)

    教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第8章   emWin6.x的带OS方式移植(STM32H7之R ...

  9. 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告

    <基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方 ...

最新文章

  1. 利用Gephi软件绘制网络图
  2. Java动态代理与Cglib代理
  3. python绘制3d图-Python绘制3D图形
  4. 【暴力】UVALive - 4882 - Parenthesis
  5. numpy.lib.stride_tricks.as_strided() 高效切分数组
  6. Solr 搭建搜索服务器
  7. php web 目录遍历,php的目录遍历操作
  8. bootstrap项目实例_精选开源SpringBoot项目:涵盖权限、搜索、秒杀、支付!
  9. Kafka简介与消息队列
  10. 小项目也可以学习到很多东西
  11. ajax怎么添加表单,使用Ajax动态地将表单添加到Django表单集
  12. CRMEB制作docker-compose
  13. 1097: 计算平均成绩(函数专题)
  14. a标签去下划线或文字添加下修饰_a标签去掉下划线_百度经验
  15. Android之JNI① AS3.0以下DNK下载配置和第一个JNI程序
  16. JavaScript中的call(),apply(),伪数组转化为数组
  17. 如何用markdown排版公众号,使用排版神器Markdown Nice
  18. 解决laytpl.js模板引擎插件加载模板后无法获取模板中的元素id等内容
  19. 手机群控软件免root
  20. 阿维塔6000+交付量再创新高,持续聚焦“悦己”诉求

热门文章

  1. 程序员须知!IT界含金量高的认证考试有哪些?
  2. deflate树与deflate编码
  3. (转)ANDROID强制锁定竖屏_APP固定设置竖屏或横屏
  4. Messaging短信源码导入AndroidStudio
  5. C++行为型模式-实现观察者模式
  6. 刘韧:和人物共同创作人物故事
  7. 你还在用notifyDataSetChanged? 你已经out了
  8. python 实例 cadu_求CAD实例
  9. Python运维常用的脚本,提高工作效率就靠它了
  10. 三峡大学计算机与信息工程学院,三峡大学计算机与信息学院.doc