赞
踩
这部分内容为转载内容简单记录,原文链接:https://blog.csdn.net/ybhuangfugui
先说明一下,UCOSII移植需要修改的文件:
os_cfg.h
它就是系统配置的意思,它位于工程App目录结构下面,主要是系统上层配置和应用。
对于我们常说的系统可裁剪,其实就是对系统某些功能打开和关闭,使用到的功能才打开,不使用的功能就关闭(即使能和失能),这个文件就集中在os_cfg.h文件里面。
os_cpu_a.asm
文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的一部分汇编代码。
该文件主要对外部引用(全局变量、函数)做了一个申明,及部分系统相关源代码(汇编)做了一个定义。
os_cpu_c.c
文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的一部分C语言接口代码。
该文件有许多HOOK函数,也就是所谓的钩子函数,主要用于系统初始化、与任务相关等,如:系统初始化时OSInitHookBegin()、OSInitHookEnd(); 创建任务时OSTaskCreateHook等。其实我们自己移植,有很多HOOK函数是不需要使用,或者不用去实现函数体里面的代码。
os_cpu.h
文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的某些定义(堆栈、数据类型)、申明(函数)等。
Ⅰ、概述
该文写针对初学µC/OS的朋友,基于以下平台来一步一步移植µC/OS嵌入式操作系统。UCOS移植相关平台:
系统平台:µC/OS-II (最新V2.92版)
硬件平台:STM32F1 (适合F1所以系列)
开发平台:Keil(MDK-ARM) V5
1.为什么是µC/OS-II?
原因在于µC/OS-II是一个比较成熟、稳定的系统,与µC/OS-III比较有些机制相对简单很多。但你掌握了µC/OS-II,µC/OS-III很容易就理解了。
2.为什么是STM32F1?
硬件平台是在移植的过程中比较重要的一点,也就是说,不同的硬件平台,移植过程中的端口(uCOS-II\Ports下源文件)存在一定的差异性。
但是同一内核的芯片,在系统移植的过程中基本上类似,也就是说,你掌握这一种内核(如:Cortex-M3),你移植相关的芯片就很容易了。
还有就是,你掌握了移植的原理,不管在什么芯片上移植你都会觉得不是那么难,笔者在51、430、ST等众多芯片上移植过µC/OS,问题都不是很大,只要用心,相信都会没问题。
3.为什么是MDK-ARM V5?
这里没什么好说的,个人爱好,喜欢使用最新的开发平台。其他平台(如:IAR)与系统软件关联性不是很大,你也可以试着用其他平台进行移植。
Ⅱ、ST芯片配置
配置ST型号的方法有两种:使用标准库源代码配置和工程配置
1.源代码配置
打开工程 -> 打开源代码“stm32f10x.h”文件。
使用F103大容量的芯片:取消第68行STM32F10X_MD的注释,这里需要和我们的启动代码匹配startup_stm32f10x_hd.s。
使用标准外设库:取消第105行USE_STDPERIPH_DRIVER的注释,使用标准外设库,我们使用stm32f10x_conf.h文件来配置使用到的外设库。
2.工程配置
打开工程 -> Project -> Options for Target -> C/C++,在该选项预定义里面添加STM32F10X_MD,USE_STDPERIPH_DRIVER这两个宏定义即可。
注意:两种方法用一种即可。
Ⅲ、配置系统滴答时钟
系统的运行离不开系统滴答,就像我前面说过的:系统滴答的作用,就是驱动整个系统工作的心脏,如果没有了它,就等于人没有了心跳。
1.初始化滴答
我们使用ST的滴答SysTick来配置作为操作系统的滴答时钟,芯片SysTick是属于内核(Cortex-M3)的一部分,所以,在初始化的时候是调用CM3里面的源代码(SysTick_Config函数)。
这里说明一下,只要使用Cortex-M3内核的芯片都有这个功能,可以说SysTick是专门为系统而设计的。
系统滴答配置如上图,位于app_cfg.c源文件下面。
2.滴答中断配置
中断函数需要调用系统相关的函数,也就是系统进行滴答相关的函数,这里是规定这么调用的。
Ⅳ、裁剪系统(配置os_cfg.h)
对于我们常说的系统可裁剪,其实就是对系统某些功能打开和关闭,使用到的功能才打开,不使用的功能就关闭(即使能和失能),这个文件就集中在os_cfg.h文件里面。
这里先说一下重要的几个选项:
1.最低优先级OS_LOWEST_PRIO
这个与我们配置任务优先级有关系,最低优先级任务配置的最大值。我们所说的任务优先级关系是:优先级越小,数值越大; 相反,优先级越大,数值越小。
位于os_cfg.h文件第39行:
#define OS_LOWEST_PRIO 63
2.系统每秒滴答数OS_TICKS_PER_SEC
这个宏定义的意思就是说,系统每秒钟滴答多少次,它与系统延时(OSTimeDly)关系比较重要,我们的例子中OS_TICKS_PER_SEC等于100,调用OSTimeDly(100);相当于的延时100个滴答,即延时1秒的意思。
位于os_cfg.h文件第51行:
#define OS_TICKS_PER_SEC 100
3.任务堆栈大小OS_TASK_xxx_STK_SIZE
这个几个宏定义在使用相应功能的时候有用,如果RAM资源有限,这个任务堆栈的大小最好根据任务来评估一下,资源有限时不要太大,当然也不能小于程序正常运行。
位于os_cfg.h文件第55 - 57行:
#define OS_TASK_TMR_STK_SIZE 128
#define OS_TASK_STAT_STK_SIZE 128
#define OS_TASK_IDLE_STK_SIZE 128
4.其他
还有很多与系统其他资源相关的配置,正常的情况下是需要的时候才开启,不用尽量关闭。一是节约资源,二是减少编译时间。后期我会将中文注释在后面。
Ⅳ、配置os_cpu_a.asm文件
os_cpu_a.asm文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的一部分汇编代码。
该文件主要对外部引用(全局变量、函数)做了一个申明,及部分系统相关源代码(汇编)做了一个定义。
下面我将定义的几个源代码做一个描述,移植过程需要修改的我会重点提示出来。
8.总结os_cpu_a.asm
对于UCOS的移植,os_cpu_a.asm文件主要就是修改OS_CPU_PendSVHandler的名称,包含申明时的名称和定义源代码时的名称,其他源代码保持不变。
Ⅴ、配置os_cpu_c.c文件
os_cpu_c.c文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的一部分C语言接口代码。
该文件有许多HOOK函数,也就是所谓的钩子函数,主要用于系统初始化、与任务相关等,如:系统初始化时OSInitHookBegin()、OSInitHookEnd(); 创建任务时OSTaskCreateHook等。其实我们自己移植,有很多HOOK函数是不需要使用,或者不用去实现函数体里面的代码。下面我将讲述几个重要的函数,有些不重要的HOOK函数不再讲述。
下面我将定义的几个源代码做一个描述,移植过程需要修改的我会重点提示出来。
Ⅶ、配置os_cpu.h文件
os_cpu.h文件位于工程uC/OS-II Ports结构下面,主要是系统底层相关的某些定义(堆栈、数据类型)、申明(函数)等。
该文件下面源代码比较简单,有些不使用,即移植过程需要修改的我会重点提示出来。
Ⅳ、配置os_cfg.h文件
os_cfg顾名思义,它就是系统配置的意思,它位于工程App目录结构下面,主要是系统上层配置和应用。
各项参数里面针对初学者,主要有三个重要的参数,其他参数暂时可以不用深入理解。
三个重要的参数:
#define OS_LOWEST_PRIO 63u
#define OS_MAX_TASKS 10u
#define OS_TICKS_PER_SEC 100u
这三个参数需要重点理解,详情可参看中文注释。
对于HOOKS函数是我们上一篇文章讲述os_cpu_c.c里面相关的函数,这里OS_CPU_HOOKS_EN会被系统调用,将其定义为使能。
关于OS_DEBUG_EN,我们不使用系统自带的调试功能,就不使能。
任务管理主要是针对uC/OS-II Source结构下os_task.c文件里面的源代码,os_task.c文件里面就包含了任务建立、删除、挂起等关于任务的一些函数接口,我们需要使用那些功能,这里就需要打开。
如创建任务:
#define OS_TASK_CREATE_EN 0u
#define OS_TASK_CREATE_EXT_EN 1u
我们使用扩展方式创建任务,也就是升级版本创建任务的函数。
了解过UOCS系统的人可能知道,UCOS系统有多种功能,也就是可以建立多任务之间通信的功能,每一种功能对应一个源代码文件。
从上图可以看得出来,每一种功能够有使能全局的宏定义,只有使能了全局宏定义才可以使用里面的功能,里面各个模块(函数接口)也是配置了使用和不使用的的宏定义。
Ⅴ、配置app_cfg.h、.c文件
app_cfg.c文件位于工程App目录结构下面,主要用于系统应用的配置。
我们建立任务需要对任务优先级和堆栈进行一个定义,它位于app_cfg.h文件下面。
这里任务数和最小优先级数值需要和os_cfg.h文件的宏定义对应才行。
我们在前两篇文章讲述过关于系统滴答的,但讲的是屏蔽Micrium官网提供的OS_CPU_SysTick配置(位于os_cpu_c.c文件下)。
这里是兼容ST(也是M3内核标准的)的函数接口,所以就不使用Micrium官网提供的OS_CPU_SysTick配置。
我们建立任务就是在系统里面分配一定的空间,给我们的应用提供一个函数接口(AppTask1、AppTask2、AppTask3)。我们一旦启动了系统(开始任务),相关的函数就会逐步执行。
我们使用操作系统的最终目的还是需要执行我们的应用,我们这里简历了3个简单的应用(任务),位于app_task.c源文件下面。
应用比较简单,就是变化LED,至于OSTimeDly(50)函数,可能初学者不是很理解,其实就是延时50个滴答。
我们在os_cfg.h文件中定义#define OS_TICKS_PER_SEC 100u,也就是每秒100个滴答,OSTimeDly(50)就是延时了0.5秒的意思。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。