天嵌 ARM开发社区

 找回密码
 注册
查看: 5026|回复: 2

[原创]在vs2008下使用的UCOSII---想要研究UCOSII的一起交流

[复制链接]
zengraoli 发表于 2012-3-11 00:56:21 | 显示全部楼层 |阅读模式
本帖最后由 zengraoli 于 2012-3-11 00:59 编辑

前言终于有一天不玩自己了,玩玩传说中最小的os吧。。^_^
题记:当年老师上课,曾演示过UCOS-II,不过当时貌似是远程Telnet打开综合楼的linux来使用的,然后使用任务调度啥的。反正当时睡着了,醒过来发现好神秘,我果断被吓懵了。。我擦,当时我就想他妈的要在windows下使用,不过貌似回去打打魔兽又忘了,偶尔找找资料也是在arm上面移植的。你妹的,趁现在还没这方面的资料,遂在windows下面使用之 ^_^ 看看啥是实时系统,咱们也来时尚一把。

首先上官网http://www.micrium.com/把小巧的内核down下来。
这里用的是V2.83(要选择kernel,别选错了GUI、TCP、FS等的),下windows版本的,我擦,如果你可以玩转GW,那也行,直接拿tar版本的编译吧。
解压之后目录是这样的:

打开vs,新建一个console工程,名字叫ucosII


整理工程(个人习惯而已,亲。那不是癖好)




属性----常规----输出目录----$(SolutionDir)Bin\$(ProjectName)
属性----常规----中间目录---- $(SolutionDir)Obj\$(ProjectName)\$(ConfigurationName)

属性----链接器----输出文件----$(OutDir)\$(ProjectName)Debug.exe
此时src\Main目录下应该是这样的:



尝试编译:
出现
1>os_cpu_c.c
      d:\我的文档\visual studio2008\projects\ucosii\src\main\ports\os_cpu_c.c : fatal error C1853: “d:\我的文档\Visual Studio2008\Projects\ucosII\Obj\ucosII\Debug\ucosIIDebug.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在 C 中使用它(或相反)
很显然,更改为c代码就行。
解决:属性----C/C++----高级----编译为:将默认的“编译为 C++ 代码(/TP)”改成“编译为 C 代码(/TC)”


再编译
出现
os_cpu_c.c(798): fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?
将提示的,未使用预编译头的.c文件加上编译头。一个是三个。

再编译
出现
fatalerror C1083: 无法打开包括文件:“includes.h”: Nosuch file or directory
分析:少了几个head文件,也就是UCOSII源代码中Other_Headers的两个文件
解决:直接引入到Main下面,设置属性---- C/C++----常规----附加包含目录---- Other_Headers;Ports;Source

再编译
出现
1>正在链接...
1>os_cpu_c.obj : error LNK2019: 无法解析的外部符号__imp__timeEndPeriod@4,该符号在函数_OSStartHighRdy 中被引用
1>os_cpu_c.obj : error LNK2019: 无法解析的外部符号__imp__timeKillEvent@4,该符号在函数_OSStartHighRdy 中被引用
1>os_cpu_c.obj : error LNK2019: 无法解析的外部符号__imp__timeSetEvent@20,该符号在函数_OSStartHighRdy 中被引用
1>os_cpu_c.obj : error LNK2019: 无法解析的外部符号__imp__timeBeginPeriod@4,该符号在函数_OSStartHighRdy 中被引用
      os_cpu_c.obj : error LNK2019: 无法解析的外部符号__imp__timeGetDevCaps@8,该符号在函数_OSStartHighRdy 中被引用

分析:一般少了链接都是缺少lib库,查看都是少timeXXX
解决:在os_cpu_c文件中加入“#pragma comment(lib, "winMM.lib")

再来编译
出现
1>正在链接...
      ucos_ii.obj : error LNK2019: 无法解析的外部符号_OSDebugInit,该符号在函数_OSInit 中被引用
分析:找到os_core.c,发现有一下代码段
#if OS_VERSION >= 270&& OS_DEBUG_EN > 0
    OSDebugInit();
#endif
解决:在main文件中加入一个函数
void OSDebugInit()
{

}
返回值是啥无所谓,只是一个形式。

最后。终于编译成功了。
1>------ 已启动生成: 项目: ucosII, 配置:Debug Win32 ------
1>正在编译...
1>ucosII.cpp
1>正在链接...
1>正在嵌入清单...
1>生成日志保存在“file://d:\我的文档\Visual Studio2008\Projects\ucosII\Obj\ucosII\Debug\BuildLog.htm”
1>ucosII - 0 个错误,个警告
==========生成: 成功1 个,失败0 个,最新0 个,跳过0 个==========



用线程输出,I willgo back home
在ucosII中,创建一个任务很简单,多个任务也很简单。还能根据优先级进行调度,主要的函数如下:
OSInit()、OSTaskCreate()、OSStart()、OSTimeDlyHMSM()
简单解释如下:
      OSInit()是OS的第一个函数,完成各初始量的初始化、建立任务空闲键表OSTCBFreeList、建立事件空闲键表OSEventFreeList、创建一个空闲任务OS_TaskIdle等
       OSTaskCreate()是创建任务的一个函数,同样的还是OSTaskCreateExt(),创建任务的增强版 ^_^。OSTaskCreate()有四个参数,第一个是要创建的任务函数,第二个是传递任务的指针,第三个是任务堆栈的栈顶指针,第四个有关调度算法---任务的优先级,当OSTaskCreate()调用成功之后,返回OS_NO_ERR
       OSStart(),当完成了第二步之后,边已经有了一个任务,此时执行OSStart(),它能够调用更加底层的函数OSStartHighRdy()来完成最初的任务切换。如果只有一个任务,便一直执行下去。
     OSTimeDlyHMSM(),仅仅是一个延迟函数,执行此函数,OS会进行一次任务调度,并且执行下一个处于就绪态的优先级最高的任务。


测试程序如下:
#include "stdafx.h"
#include "SystemConfig.h"

OS_STK myStartTaskSize[512];    /* 定义堆栈大小*/

void OSDebugInit()
{

}

/* 创建任务函数*/
void myStartTask(void *param)
{
    OSStatInit();
    while(1)
    {
       printf_s("I will go back home ! \n");
        OSTimeDlyHMSM(0,0, 3, 0);
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    OSInit();

    /* 创建一个任务*/
    OSTaskCreate(myStartTask, (void*)0, (OS_STK *)&myStartTaskSize[512],4);

    /* 开始任务调度*/
    OSStart();

    return0;
}



下次任务:
完成调度算法的分析。反正也不知道啥时候有时间,继续完善捏。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| zengraoli 发表于 2012-3-11 00:57:51 | 显示全部楼层
欢迎大家交流。。也希望大家多和我分享经验,呵呵。

原文章地址---------http://user.qzone.qq.com/125308501/infocenter#
itfan 发表于 2012-3-12 23:00:30 | 显示全部楼层
牛人总是那么多 顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 21:38 , Processed in 1.031257 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表