原文来源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16616&highlight=RTX%B2%D9%D7%F7%CF%B5%CD%B3%BD%CC%B3%CC

第6章      RTX操作系统源码方式移植

本章教程为大家将介绍RTX操作系统源码方式移植,移植工作比较简单,只需要用户添加需要的源码文件即可,不需要做任何的底层工作,也不需要用户做任何修改。
     本章教程含Cortex-M3内核的STM32F103的移植和Cortex-M4内核的STM32F407移植。
    6.1 移植前准备工作说明
    6.2 STM32F103源码方式移植RTX系统
    6.3 STM32F407源码方式移植RTX系统
    6.4     总结

6.1  植前准备工作说明

1.  RTX系统软件开发平台仅支持MDK,建议使用MDK4.74,因为后面的例子都是以MDK4.74为平台。
1.     找一个简单的工程,最好是跑马灯之类的,越简单越好,我们就在这个简单的工程上面移植即可。
2.     大家使用的简单工程里面不能有SysTick,PendSV和SVC三个系统中断的使用,因为RTX系统要使用这三个中断。

6.2   STM32F103源码方式移植RTX系统

6.2.1      RTX操作系统移植

首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图6.1所示(大家也可以制作其它任意的工程模板,不限制):

图6.1 工程模板

准备好工程模板后,就可以开始移植了。首先要做的就是将所有需要的源码文件放到工程模板里面。下面分五步跟大家进行说明,当然,不限制必须使用下面的方法添加源码到工程,只要将需要的文件添加到工程模板即可。
u 第1步:在工程模板创建RTX文件夹

再在RTX文件夹中创建如下三个文件夹

inc文件夹用于存放头文件。
    portable文件夹用于存放移植接口文件。
    src文件夹用于存放源码文件。
u 第2步:添加源码文件到相应文件夹
l  文件夹inc中需要添加的文件如下:

文件RTL.h和RTX_Config.h在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RV31\\INC
   其余文件在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RL\\RTX\\SRC\\CM
l  文件夹portable中需要添加的文件如下:

这5个文件在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RL\\RTX\\SRC\\CM,其实HAL_CM1和HAL_CM4可以不必添加,因为这两个文件是分别用于CM1内核和CM4内核的芯片。
l  文件夹src中需要添加的文件如下:

这11个文件在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RL\\RTX\\SRC\\CM
l  文件夹User中还需要添加如下两个文件:

文件RTX_Conf_CM.c在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RL\\RTX\\Config
     文件RTX_Lib.c在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RV31\\INC
u 第3步:将源码文件添加到MDK的工程项目中
    添加后的效果如下:

u 第4步:新创建一个includes.h文件,将所有的头文件都集中到这个头文件下。
    这样做的好处是引用头文件的时候,只添加这个头文件就可以了。includes.h文件放在了User文件夹中。然后再将这个文件也添加到MDK工程项目中

Includes.h文件中的内容如下:

  1. /*
  2. *********************************************************************************************************
  3. *
  4. *    模块名称 : 头文件汇总
  5. *    文件名称 : includes.h
  6. *    版    本 : V1.0
  7. *    说    明 : 当前使用头文件汇总
  8. *
  9. *    修改记录 :
  10. *        版本号    日期        作者     说明
  11. *        V1.0    2015-08-02  Eric2013   首次发布
  12. *
  13. *    Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
  14. *
  15. *********************************************************************************************************
  16. */
  17. #ifndef  __INCLUDES_H__
  18. #define  __INCLUDES_H__
  19. /*
  20. *********************************************************************************************************
  21. *                                         标准库
  22. *********************************************************************************************************
  23. */
  24. #include  <stdarg.h>
  25. #include  <stdio.h>
  26. #include  <stdlib.h>
  27. #include  <math.h>
  28. /*
  29. *********************************************************************************************************
  30. *                                         其它库
  31. *********************************************************************************************************
  32. */
  33. /*
  34. *********************************************************************************************************
  35. *                                           OS
  36. *********************************************************************************************************
  37. */
  38. #include "RTL.h"
  39. /*
  40. *********************************************************************************************************
  41. *                                           宏定义
  42. *********************************************************************************************************
  43. */
  44. /*
  45. *********************************************************************************************************
  46. *                                        APP / BSP
  47. *********************************************************************************************************
  48. */
  49. #include  <bsp.h>
  50. #endif
  51. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

复制代码u 第5步:也是最后一步,添加相应的头文件路径:
    在原来工程模板的基础上面新添加的两个路径:

至此,RTX的移植工作就完成了,剩下就是系统配置和应用了

6.2.2     RTX操作系统配置说明

RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图6.2所示的工程配置向导:

图6.2 RTX配置向导

u  Task Configuration
l Number of concurrent running tasks
      参数范围0 – 250 
      表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。
l Number of tasks with user-provided stack
      参数范围0 – 250 
      表示自定义任务堆栈的任务数,如果这个参数定义为0的话,表示所有的任务都是使用的配置向导里面第三个参数Task statck size大小。比如:
        Numberof concurrent running tasks = 6
        Numberof tasks with user-provided stack = 0
      表示允许用户创建6个任务,所有的6个任务都是分配第三个参数Task statck size大小的任务堆栈空间。
        Numberof concurrent running tasks = 6
        Numberof tasks with user-provided stack = 3
      表示允许用户创建6个任务,其中3个任务是用户自定义任务堆栈大小,另外3个任务是用的第三个参数Task statck size大小的任务堆栈空间。
l Task statck size
      表示系统分配的任务堆栈大小,单位字节。
l Check for the stack overflow
      选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
l Run in privileged mode
       选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。
u Tick Timer Configuration
l Hardware timer
      CoreSysTick 表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。
      PeripheralTimer 表示使用外设定时器。
l Timer clock value
      表示定时器主频,单位Hz。
l Timer tick value
      表示系统时钟节拍周期,单位us。
u System Configuration
l Round-Robin Task switching
      选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。
l Round-Robin Timeout [ticks]
      范围1 – 1000。
      表示时间片的大小,单位是系统时钟节拍个数。
l Number of user timers
      范围1 – 250。
      表示用户定时器个数,即软定时器个数。
l ISR FIFO Queue size
      表示ISR FIFO队列大小。中断服务程序中调用以isr_ 开头的函数时,会将请求类型存到此缓冲中。

6.2.3     RTX操作系统应用实例

通过上面对RTX操作系统的配置讲解,这里将其修改为如下图6.3所示配置:

图6.3 RTX配置向导

相对默认配置,修改了上图红色箭头所示的三个地方:
1.     任务运行在特权级模式。
2.     滴答定时器主频72MHz,这个也是STM32F103的主频。
3.     系统时钟节拍周期1ms。
修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:
AppTaskLED任务 :LED闪烁。
AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。

  1. #include "includes.h"            /* 底层硬件驱动 */
  2. /*
  3. **********************************************************************************************************
  4. 函数声明
  5. **********************************************************************************************************
  6. */
  7. static void AppTaskCreate (void);
  8. __task void AppTaskLED(void);
  9. __task void AppTaskStart(void);
  10. /*
  11. **********************************************************************************************************
  12. 变量
  13. **********************************************************************************************************
  14. */
  15. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */
  16. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */
  17. /* 任务句柄 */
  18. OS_TID HandleTaskLED = NULL;
  19. /*
  20. *********************************************************************************************************
  21. *    函 数 名: main
  22. *    功能说明: 标准c程序入口。
  23. *    形    参: 无
  24. *    返 回 值: 无
  25. *********************************************************************************************************
  26. */
  27. int main (void)
  28. {
  29. /* 初始化外设 */
  30. bsp_Init();
  31. /* 创建启动任务 */
  32. os_sys_init_user (AppTaskStart,             /* 任务函数 */
  33. 2,                        /* 任务优先级 */
  34. &AppTaskStartStk,         /* 任务栈 */
  35. sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
  36. while(1);
  37. }
  38. /*
  39. *********************************************************************************************************
  40. *    函 数 名: AppTaskLED
  41. *    功能说明: LED闪烁
  42. *    形    参: 无
  43. *    返 回 值: 无
  44. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
  45. *********************************************************************************************************
  46. */
  47. __task void AppTaskLED(void)
  48. {
  49. while(1)
  50. {
  51. bsp_LedToggle(2);
  52. bsp_LedToggle(3);
  53. os_dly_wait(200);
  54. }
  55. }
  56. /*
  57. *********************************************************************************************************
  58. *    函 数 名: AppTaskStart
  59. *    功能说明: 启动任务,也就是最高优先级任务。
  60. *    形    参: 无
  61. *    返 回 值: 无
  62. *    优 先 级: 2
  63. *********************************************************************************************************
  64. */
  65. __task void AppTaskStart(void)
  66. {
  67. AppTaskCreate();
  68. while(1)
  69. {
  70. bsp_LedToggle(1);
  71. bsp_LedToggle(4);
  72. os_dly_wait(500);
  73. }
  74. }
  75. /*
  76. *********************************************************************************************************
  77. *    函 数 名: AppTaskCreate
  78. *    功能说明: 创建应用任务
  79. *    形    参: 无
  80. *    返 回 值: 无
  81. *********************************************************************************************************
  82. */
  83. static void AppTaskCreate (void)
  84. {
  85. HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
  86. 1,                       /* 任务优先级 */
  87. &AppTaskLEDStk,          /* 任务栈 */
  88. sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
  89. }

复制代码按照第三章的3.4小节中介绍的调试方法,可以看到如下图6.4所示任务执行状态:

图6.4 RTX的调试信息组件

除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。

6.3  STM32F407源码方式移植RTX系统

6.3.1     RTX操作系统移植

首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图6.5所示(大家也可以制作其它任意的工程模板,不限制):

图6.5 工程模板

准备好工程模板后,就可以开始移植了。首先要做的就是将所有需要的源码文件放到工程模板里面。下面分五步跟大家进行说明,当然,不限制必须使用下面的方法添加源码到工程,只要将需要的文件添加到工程模板即可。
u 第1步:在工程模板创建RTX文件夹

再在RTX文件夹中创建如下三个文件夹

inc文件夹用于存放头文件。
    portable文件夹用于存放移植接口文件。
    src文件夹用于存放源码文件。
u 第2步:添加源码文件到相应文件夹
l  文件夹inc中需要添加的文件如下:

文件RTL.h和RTX_Config.h在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RV31\\INC
其余文件在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RL\\RTX\\SRC\\CM
l  文件夹portable中需要添加的文件如下:

这5个文件在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RL\\RTX\\SRC\\CM,其实HAL_CM1和HAL_CM3可以不必添加,因为这两个文件是分别用于CM1内核和CM3内核的芯片。
l  文件夹src中需要添加的文件如下:

这11个文件在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RL\\RTX\\SRC\\CM
l  文件夹User中还需要添加如下两个文件:

文件RTX_Conf_CM.c在MDK安装目录中的路径C:\\Keil_v474\\ARM\\RL\\RTX\\Config
文件RTX_Lib.c在MDK 安装目录中的路径C:\\Keil_v474\\ARM\\RV31\\INC
u 第3步:将源码文件添加到MDK的工程项目中
添加后的效果如下:

u 第4步:新创建一个includes.h文件,将所有的头文件都集中到这个头文件下。
这样做的好处是引用头文件的时候,只添加这个头文件就可以了。includes.h文件放在了User文件夹中。然后再将这个文件也添加到MDK工程项目中

Includes.h文件中的内容如下:

  1. /*
  2. *********************************************************************************************************
  3. *
  4. *    模块名称 : 头文件汇总
  5. *    文件名称 : includes.h
  6. *    版    本 : V1.0
  7. *    说    明 : 当前使用头文件汇总
  8. *
  9. *    修改记录 :
  10. *        版本号    日期        作者     说明
  11. *        V1.0    2015-08-02  Eric2013   首次发布
  12. *
  13. *    Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
  14. *
  15. *********************************************************************************************************
  16. */
  17. #ifndef  __INCLUDES_H__
  18. #define  __INCLUDES_H__
  19. /*
  20. *********************************************************************************************************
  21. *                                         标准库
  22. *********************************************************************************************************
  23. */
  24. #include  <stdarg.h>
  25. #include  <stdio.h>
  26. #include  <stdlib.h>
  27. #include  <math.h>
  28. /*
  29. *********************************************************************************************************
  30. *                                         其它库
  31. *********************************************************************************************************
  32. */
  33. /*
  34. *********************************************************************************************************
  35. *                                           OS
  36. *********************************************************************************************************
  37. */
  38. #include "RTL.h"
  39. /*
  40. *********************************************************************************************************
  41. *                                           宏定义
  42. *********************************************************************************************************
  43. */
  44. /*
  45. *********************************************************************************************************
  46. *                                        APP / BSP
  47. *********************************************************************************************************
  48. */
  49. #include  <bsp.h>
  50. #endif
  51. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

复制代码u 第5步:也是最后一步,添加相应的头文件路径:
    在原来工程模板的基础上面新添加的两个路径:

至此,RTX的移植工作就完成了,剩下就是系统配置和应用了

6.3.2     RTX操作系统配置说明

RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图6.6所示的工程配置向导:

图6.6 RTX配置向导

u  Task Configuration
l Number of concurrent running tasks
    参数范围0 – 250 
    表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。
l Number of tasks with user-provided stack
    参数范围0 – 250 
    表示自定义任务堆栈的任务数,如果这个参数定义为0的话,表示所有的任务都是使用的配置向导里面第三个参数Task statck size大小。比如:
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 0
      表示允许用户创建6个任务,所有的6个任务都是分配第三个参数Task statck size大小的任务堆栈空间。
Numberof concurrent running tasks = 6
Numberof tasks with user-provided stack = 3
      表示允许用户创建6个任务,其中3个任务是用户自定义任务堆栈大小,另外3个任务是用的第三个参数Task statck size大小的任务堆栈空间。
l Task statck size
    表示系统分配的任务堆栈大小,单位字节。
l Check for the stack overflow
    选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
l Run in privileged mode
    选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。
u Tick Timer Configuration
l Hardware timer
    CoreSysTick 表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。
    PeripheralTimer 表示使用外设定时器。
l Timer clock value
    表示定时器主频,单位Hz。
l Timer tick value
    表示系统时钟节拍周期,单位us。
u System Configuration
l Round-Robin Task switching
    选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。
l Round-Robin Timeout [ticks]
    范围1 – 1000。
    表示时间片的大小,单位是系统时钟节拍个数。
l Number of user timers
    范围1 – 250。
    表示用户定时器个数,即软定时器个数。
l ISR FIFO Queue size
    表示ISR FIFO队列大小。中断服务程序中调用以isr_ 开头的函数时,会将请求类型存到此缓冲中。

6.3.3     RTX操作系统应用实例

通过上面对RTX操作系统的配置讲解,这里将其修改为如下图6.7所示配置:

图6.7 RTX配置向导

相对默认配置,修改了上图红色箭头所示的三个地方:
1.     任务运行在特权级模式。
2.     滴答定时器主频168MHz,这个也是STM32F407的主频。
3.     系统时钟节拍周期1ms。
修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:
AppTaskLED任务 :LED闪烁。
AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。

  1. #include "includes.h"            /* 底层硬件驱动 */
  2. /*
  3. **********************************************************************************************************
  4. 函数声明
  5. **********************************************************************************************************
  6. */
  7. static void AppTaskCreate (void);
  8. __task void AppTaskLED(void);
  9. __task void AppTaskStart(void);
  10. /*
  11. **********************************************************************************************************
  12. 变量
  13. **********************************************************************************************************
  14. */
  15. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */
  16. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */
  17. /* 任务句柄 */
  18. OS_TID HandleTaskLED = NULL;
  19. /*
  20. *********************************************************************************************************
  21. *    函 数 名: main
  22. *    功能说明: 标准c程序入口。
  23. *    形    参: 无
  24. *    返 回 值: 无
  25. *********************************************************************************************************
  26. */
  27. int main (void)
  28. {
  29. /* 初始化外设 */
  30. bsp_Init();
  31. /* 创建启动任务 */
  32. os_sys_init_user (AppTaskStart,             /* 任务函数 */
  33. 2,                        /* 任务优先级 */
  34. &AppTaskStartStk,         /* 任务栈 */
  35. sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
  36. while(1);
  37. }
  38. /*
  39. *********************************************************************************************************
  40. *    函 数 名: AppTaskLED
  41. *    功能说明: LED闪烁
  42. *    形    参: 无
  43. *    返 回 值: 无
  44. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
  45. *********************************************************************************************************
  46. */
  47. __task void AppTaskLED(void)
  48. {
  49. while(1)
  50. {
  51. bsp_LedToggle(2);
  52. bsp_LedToggle(3);
  53. os_dly_wait(200);
  54. }
  55. }
  56. /*
  57. *********************************************************************************************************
  58. *    函 数 名: AppTaskStart
  59. *    功能说明: 启动任务,也就是最高优先级任务。
  60. *    形    参: 无
  61. *    返 回 值: 无
  62. *    优 先 级: 2
  63. *********************************************************************************************************
  64. */
  65. __task void AppTaskStart(void)
  66. {
  67. AppTaskCreate();
  68. while(1)
  69. {
  70. bsp_LedToggle(1);
  71. bsp_LedToggle(4);
  72. os_dly_wait(500);
  73. }
  74. }
  75. /*
  76. *********************************************************************************************************
  77. *    函 数 名: AppTaskCreate
  78. *    功能说明: 创建应用任务
  79. *    形    参: 无
  80. *    返 回 值: 无
  81. *********************************************************************************************************
  82. */
  83. static void AppTaskCreate (void)
  84. {
  85. HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
  86. 1,                       /* 任务优先级 */
  87. &AppTaskLEDStk,          /* 任务栈 */
  88. sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
  89. }

复制代码按照第三章的3.5小节中介绍的调试方法,可以看到如下图6.8所示任务执行状态:

图6.8 RTX的调试信息组件

除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。

6.4    总结
本章节为大家讲解了RTX的源码移植方法,移植比较简单。另一个重要内容是系统配置向导文件的说明,这个比较重要,初学者要好好熟悉下。

【RTX操作系统教程】第6章 RTX操作系统源码方式移植相关推荐

  1. 第6章 RTX 操作系统源码方式移植

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家将介绍 RTX 操作系统源码方式移植,移植工作比较简单,只需要用户添加需要的源码文件即可, ...

  2. 【STM32F429的DSP教程】第6章 ARM DSP源码和库移植方法(MDK5的AC5和AC6)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第6章   ARM DSP源码和库移植方法(MDK5的AC5 ...

  3. 老男孩GO语言线下培训班1期整套教程(完整18天含源码)

    老男孩GO语言线下培训班1期整套教程(完整18天含源码) 老男孩教育-Go语言第一期(共18天 含课程源码) 课程详细目录: ├─L001-Go语言-mp4 │      01 Go开发1期 day1 ...

  4. android修改原生代码,【ROM教程】安卓原生ROM修改源码消除WIFI叹号教程

    [ROM教程]安卓原生ROM修改源码消除WIFI叹号教程.Android为了对网络状态进行检测,采用了一种叫做captive detection的方式进行网络状态检测.其实说起来很简单,每当连接到一个 ...

  5. 四千GB电脑技术高清视频教程和23万套各类源码模板

    四千GB电脑技术高清视频教程和23万套各类源码模板 1.二千多GB各类电脑技术高清视频教程 2.17万本电脑技术相关的电子书籍 3.23万套各类VIP源码.商业源码.泄密源码.破解源码 4.一万多套淘 ...

  6. 计算机操作系统学习笔记 第一章、操作系统概论

    文章目录 1 操作系统的基本概念 1.1 操作系统的概念 1.2 操作系统的特征 1.3 操作系统的目标和功能 1.4 综合应用题 2 操作系统发展历程 2.1 手工操作阶段(此阶段无操作系统) 2. ...

  7. .NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

    写在前面 上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它,接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的mvc项目,同时又通过一个实战 ...

  8. c++贪吃蛇_细致的C语言写贪吃蛇教程+详细思路-适合新手附源码

    在有用C写贪吃蛇的一个想法之后,上网查了几个教程,觉得不是很能看懂.恩...或者说不是一下子就能看出来思路+具体怎么实现.所以,我花了早自习的时间想了想如何用最简单的方法实现,晚上大约两个小时写了出来 ...

  9. ajax资料收集-Ajax文章(教程和实例)---Ajax资源下载(源码和教程)---Ajax规范标准

    CSDN Blog Ajax文章搜索: http://search.csdn.net/search/ajax/1/blog/ 专题:Ajax技术应用开发 http://www.51cto.com/ht ...

最新文章

  1. 自定义状态栏notification布局
  2. struts2的核心和工作原理
  3. 克服拖延的11种方法
  4. 又拍云上传文件后,如何访问?
  5. 7.10.7740.16
  6. vc mysql封装类_Oracle OCI API封装类VC数据库源码下载-华软网
  7. [周赛][Leetcode][第5457题][JAVA][动态规划][和为奇数的子数组数目]
  8. 机器学习硕士、博士如何自救?
  9. 【faebdc的模拟赛】T1错位
  10. 自学前端1年,靠着这份面试题和答案,我找到了20K工作
  11. 产品的缺点要不要提前告诉客户?
  12. doceker模拟数据的生成
  13. matlab_exercise(2)----输入一个三位数,依次输出其个位数字,十位数字,百位数字...
  14. linux cron 定时任务
  15. 用RichEditableText做的一个代码编辑器
  16. Java毕设项目在线购书商城系统计算机(附源码+系统+数据库+LW)
  17. MLX90614系列 ——红外温度计
  18. iPad 变身做电脑显示器
  19. 阿里云CentOS8_x86_64_Haproxy代理gitlab及mantis
  20. 三大战略分析方法——SWOT、PEST、波特五力模型

热门文章

  1. sleep的睡眠机制
  2. SOUI总结之盒子模型
  3. 解决pytest运行时报错ModuleNotFoundError
  4. Visual Studio2015产品密钥
  5. vs2013(所有版本)-产品密钥
  6. 北大软微一年ABCD
  7. 在maven中创建jsp依赖
  8. [黑科技] WPS通过VB宏函数实现自编号功能
  9. MAC下的Sublime Text关闭自动更新提示,关闭更新检查,适用于Sublime 3和Sublime 4
  10. Action Recognition(行为识别)