1. 相对于UCOSII,UCOSIII的性能有了进一步提升,支持时间片轮转调度,极短的关中断事件等。移植的准备材料:STM32基础工程;UCOSIII源码。
2. 从uCOS的官网获取 uCOS III 的官方的源码包:http://micrium.com/
3. 打开下载好的UCOSIII源码,可以看到四个文件,分别是EvalBoards、 uC-CPU、 uC-LIB、 uCOS-III。
EvalBoards:文件夹里面包含评估板相关文件,在移植时我们只提取部分文件。
uC-CPU:和CPU紧密相关的文件,里面的一些文件很重要,都是我们需要使用的。
uC-LIB:Micrium公司提供的官方库,可用可不用。
uCOS-III:关键目录,我们下来着重分析的文件位于此目录下,包含了Source文件夹。
4. 从官方下载已近移植好的uCOS-III工程(基于STM32F107版本的),我们要和UCOSII移植一样从该工程中复制一些需要的文件。
5. 将UCOSIII目录下的app_cfg.h、cpu_cfg.h、includes.h、lib_cfg.h、os_app_hooks.c、os_app_hooks.h、os_cfg.h、os_cfg_app.h文件添加到我们的工程文件中。
6. 在基础工程中添加相应的文件夹UCOSIII,将下载的UCOSIII源码中的uC-CPU、 uC-LIB、 uCOS-III这三个文件复制到工程中。
7. 在UCOSIII文件夹中还需要再添加两个文件夹,uC-CONFIG、uC-BSP两个文件夹。
8. 向uC-CONFIG添加文件,从移植好的F107工程下的UCOSIII目录下复制下面8个文件到uC-CONFIG文件夹中。
9. uC-CONFIG文件下,复制后的8个文件。
10. 向uC-BSP添加文件,同样是从移植好的F107工程下的BSP目录下,只需要复制bsp.c和bsp.h两个文件。
11. uC-BSP文件下,复制后的2个文件。
12. 在keil工程中添加UCOSIII六个分组,分别是UCOSIII-CORE、UCOSIII-CPU、UCOSIII-PORT、UCOSIII-BSP、UCOSIII-COBFIG、UCOSIII-LIB。
13. 向UCOSIII-CORE添加文件,从工程文件夹下的uCOS-III\Source路径下添加。
14. 向UCOSIII- CPU添加文件,从工程文件夹下的UCOSIII\uC-CPU路径下添加,不要忘记uC-CPU\\ARM-Cortex-M3\RealView下的cpu_c.c与cpu_a.asm文件。
15. 向UCOSIII-BSP添加文件,从工程文件夹下的UCOSIII\uC-BSP路径下添加。
16. 向UCOSIII-PORT添加文件,从工程文件夹下的
UCOSIII\uC-LIBuCOS-III\Ports\ARM-Cortex-M3\Generic\RealView路径下添加。
17. 向UCOSIII-LIB添加文件,从工程文件夹下的UCOSIII\uC-LIB路径下添加,不要忘记UCOSIII\uC-LIB\Ports\ARM-Cortex-M3\RealView 的lib_mem_a.asm文件。
18. 向UCOSIII-CONFIG添加文件,从工程文件夹下的UCOSIII\uC-CONFIG路径下添加。
19. 向各个分组添加完文件后不要忘记添加对应的头文件。
20. 编译一下,观察是否会出错,这里需要修改bsp文件,该文件是与板级相关的文件,uCOS III 源码的bsp 肯定是与我们的板子不一样,所以就需要进行修改,而且以后我们的板级文件都在bsp.c 文件进行初始化,所以按照我们修改好的源码进行修改即可。
21. bsp.c文件修改后如下:
#define BSP_MODULE #include <bsp.h> CPU_INT32U BSP_CPU_ClkFreq_MHz; static void BSP_LED_Init (void); static void BSP_StatusInit (void); #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 DBGMCU_CR_TRACE_IOEN_MASK 0x10 #define DBGMCU_CR_TRACE_MODE_ASYNC 0x00 #define DBGMCU_CR_TRACE_MODE_SYNC_01 0x40 #define DBGMCU_CR_TRACE_MODE_SYNC_02 0x80 #define DBGMCU_CR_TRACE_MODE_SYNC_04 0xC0 #define DBGMCU_CR_TRACE_MODE_MASK 0xC0 #define DEM_CR_TRCENA (1 << 24) #define DWT_CR_CYCCNTENA (1 << 0) void BSP_Init (void) { LED_Init(); } CPU_INT32U BSP_CPU_ClkFreq (void) { RCC_ClocksTypeDef rcc_clocks; RCC_GetClocksFreq(&rcc_clocks); return ((CPU_INT32U)rcc_clocks.HCLK_Frequency); } #if ((APP_CFG_PROBE_OS_PLUGIN_EN == DEF_ENABLED) && \ (OS_PROBE_HOOKS_EN == 1)) void OSProbe_TmrInit (void) { } #endif #if ((APP_CFG_PROBE_OS_PLUGIN_EN == DEF_ENABLED) && \ (OS_PROBE_HOOKS_EN == 1)) CPU_INT32U OSProbe_TmrRd (void) { return ((CPU_INT32U)DWT_CYCCNT); } #endif #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; 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
22. bsp.h文件修改后如下:
#ifndef BSP_PRESENT #define BSP_PRESENT #ifdef BSP_MODULE #define BSP_EXT #else #define BSP_EXT extern #endif #include <stdio.h> #include <stdarg.h> #include <cpu.h> #include <cpu_core.h> #include <lib_def.h> #include <lib_ascii.h> #include <stm32f10x_conf.h> #endif
23. 对该工程进行第一次编译,编译是没有错误的,并且工程模板也是可用的,但是此时还不是我们最适合使用的工程模板,最适合的工程往往是根据需要进行配置的,而 uCOS 提供裁剪的功能,我们可以按需对系统进行裁剪。
24. os_cfg.h文件,os_cfg.h 文件是系统的配置文件,主要是让用户自己配置一些系统默认的功能,用户可以选择某些或者全部的功能,比如消息队列、信号量、互斥量、事件标志位等,系统默认全部使用的,如果如果用户不需要的话,则可以直接关闭, 在对应的宏定义中设置为 0即可, 这样子就不会占用系统的 SRAM,以节省系统资源。
25. cpu_cfg.h 文件主要是配置 CPU 相关的一些宏定义,我们可以选择对不同的 CPU 进行配置,当然,如果我们没有对 CPU 很熟悉的话,就直接忽略这个文件即可,在这里我们只需要注意关于时间戳与前导零指令相关的内容,我们使用的 CPU 是 STM32,是 32 位的CPU,那么时间戳我们使用 32 位的变量即可,而且 STM32 支持前导零指令,可以使用它让系统进行寻找最高优先级的任务更加快捷。
26. os_cfg_app.h 是系统应用配置的头文件,简单来说就是系统默认的任务配置,如任务的优先级、堆栈大小等基本信息,但是有两个任务是必须开启的,一个就是空闲任务,另一个就是时钟节拍任务,这两个是让系统正常运行的最基本任务,而其他任务我们自己按需配置即可。
至此,我们的uCOS III在STM32上的移植已经全部进行完了~大家可以愉快地开启uCOSIII之旅了~