最近在看任哲的《嵌入式实时操作系统原理及应用》,看了前面8章,虽然能看懂书上的代码,但因为没有动手写过,心里没有底,所以还是得动手写点代码测试。书上推荐的编译平台是Borland C 3.1,但因为Win10不知道什么原因,安装不了,就放弃了。uCOSII既然是用C写的可移植实时操作系统,能不能移植到PC上用VS编译呢。于是就在网上搜索了一下,果然有前辈开路。
下面开始讲述怎么把uCOSII移植到VS2013上还有我的几个疑问。
1、下载uCOSII源码
http://download.csdn.net/detail/zx3517288/9665021 (V2.91)
源码目录很简单,Source下存的就是uCOSII源文件。
2、新建VS2013工程
为了目录结构清晰,在工程目录下新建3个文件夹App,Ports,Source。将下载的源文件拷贝到工程目录的Source中,App用于存放用户代码,Ports用于存放与移植平台相关的代码。工程目录如下:
3、添加项目文件
Ports下的与移植平台相关解决方案目录
首先其中App存放的是用户代码,uCOSII中存的是uCOSII源文件,Ports存放的是与移植平台相关的代码,其中
include 是自己编写的
os_cpu.h 定义了和处理器及编译器相关的定义及一些全局函数声明。
os_cpu_c.c 任务堆栈和时钟节拍中断服务相关代码。这两个文件移植的时候都是需要修改的,因为移植到不同的机器上这三个文件有所不同所以,可以到官网下载已经移植好的程序或者从UCOS II官网提供的移植范例里面找,UCOSII源码中没有包含这些文件。
为
了方便大家移植,附上App和Ports文件的下载地址:
http://download.csdn.net/detail/zx3517288/9665116
4、项目配置
设置编译平台
添加头文件包含目录
5、编译
编译后发现还很多错误
uCOSII.h源码中头文件包含了os_cfg,但在源文件中没有找到os_cfg,但能找到一个相似的os_cfg_r.h,去网上搜索一下os_cfg_r.h,原来os_cfg_r.h是一个系统配置文件,可以设置打开或者关闭系统功能,暂时不管它,先修改为os_cfg.h。
继续编译还是有错
错误定位到创建OSTmr_Task的任务优先级,系统提示这个任务优先级没有宏定义。先Ctrl+F搜索一下OS_TASK_TMR_PRIO,果然又有新发现
OSTmr_Task是系统定时器的时候用到,解决的办法有两种,
1、关闭系统定时功能OS_TMR_EN定义成0u。
2、自己定义一个OS_TASK_TMR_PRIO
修改提示写保护,覆盖即可。
修改后继续编译
有错误,而且还不少,但都是些重复定义,打开ucosii.c看看
原来uc/OS的作者为了方便,将所有的代码都包括到ucosii.c文件中了,即
#include <os_core.c>
#include <os_flag.c>
#include <os_mbox.c>
#include <os_mem.c>
#include <os_mutex.c>
#include <os_q.c>
#include <os_sem.c>
#include <os_task.c>
#include <os_time.c>
#include <os_tmr.c>
如果再将所有的os_代码进行编译链接,当然会出现重复。问题找到了解决方法是:
1.移除ucosii.c
2.移除ucosii.c中包含的.c文件。
我这里选择移除ucosii.c中包含的.c文件,两种我都试过,因为这样项目看起来简洁一些,其实无所谓。
继续编译,还是报错
定位到OSStartHighRdy函数
错误都是些与时间相关的函数,此事必有蹊跷
看到这种错误心里就放心多了,每天都要遇到一万次,error LNK2019链接出错,肯定是少了链接库,想是想不出的,去网上找找。缺少链接库winmm.lib
winmm.lib是Windows多媒体相关应用程序接口
timeBeginPeriod 设置应用程序或驱动程序使用的最小定时器分辨率
timeEndPeriod 清除应用程序或驱动程序使用的最小定时器分辨率
timeGetDevCaps 查询定时器设备以确定其性能
timeGetSystemTime 检取从WINDOWS开始已逝去的毫秒数
timeGetTime 检取从WINDOWS开始已逝去的毫秒数,此函数比上一条函数开销小
timeKillEvent 毁掉指定的定时器回调事件
timeSetEvent 设置一个定时器回调事件
到此编译已经成功:
另附工程下载地址:http://download.csdn.net/detail/zx3517288/9665137
最后感谢前辈开路!