转载一篇写得不错的UCOS-II移植文章.doc

上传人:M****1 文档编号:551747184 上传时间:2024-01-27 格式:DOC 页数:8 大小:67KB
返回 下载 相关 举报
转载一篇写得不错的UCOS-II移植文章.doc_第1页
第1页 / 共8页
转载一篇写得不错的UCOS-II移植文章.doc_第2页
第2页 / 共8页
转载一篇写得不错的UCOS-II移植文章.doc_第3页
第3页 / 共8页
转载一篇写得不错的UCOS-II移植文章.doc_第4页
第4页 / 共8页
转载一篇写得不错的UCOS-II移植文章.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《转载一篇写得不错的UCOS-II移植文章.doc》由会员分享,可在线阅读,更多相关《转载一篇写得不错的UCOS-II移植文章.doc(8页珍藏版)》请在金锄头文库上搜索。

1、今天突然有个想法,是否在其他结构比较简单的平台上移植比较容易一点,正好同学有一个凌阳的精简板,反正今天是星期天,就当是休息了。首先肯定是去熟悉SPCE061A的结构和IDE了。主要是存储器结构、指令系统和中断这几个部分。本来不是做这个的,没有必要深究,总体看看,知道在哪些地方查就行,所以看到很快。于是摆好uCOS系统的资料,按照移植步骤,一个个文件、函数地写好,其他没有什么,就是时间节拍比较难一点,用了不少时间写,主要是去熟悉凌阳的中断系统,了解几个寄存器的用法。按照标准移植函数步骤写下来,代码也就10来行。在这里我想说的不是如何移植,而是编译。凌阳的IDE说实话肯定是不太完善的。因为我同学本

2、科的时候做过,那个时候似乎听他提到过这个问题。不过我今天算是感受到了。写好文件,编译我的错,有一个函数写错了,编译没有通过。然后我改了。编译,?怎么回事,还是这个错误?大体是这样的,我写了一个OSTaskSw函数(原本想写OSCtxSw的),结果,这个IDE居然还真的认出来一个OSTaskSw,我当时就晕了,我好像在内核里没有看到过这个函数嘛。我赶紧去内核查找一下,没有嘛。我把OSTaskSw函数改成OSCtxSw(OS_CPU.H里),再编译,还是有。更晕了这个错误是这样报的:Error L0080: The external symbol _memset has not a public

3、definition.Error L0080: The external symbol _OSTaskSw has not a public definition.memset嘛好说,这应该是我没有包含某个库文件,我只是知道这是个字符串处理函数,应该在string.h里面,但是包含了它,还是有这个错误(现在还没有解决,惭愧),但是OSTaskSw都没有了还给我报什么?后来我想,这个IDE是GCC的,是不是因为增量编译,链接的时候用了以前的文件?干脆把所有以前编译生成的文件删除了(用clear没有用),再编译,嘿嘿,还真的没有这个错误了。I服了HIM。确实没有用过,问题都不好找。今天比较晚了,明

4、天来解决另一个问题吧!我怀疑最大的可能是在工程文件的组织上有问题,应该好好梳理一下。因为我发现,编译应用程序文件是没有错的,Build的时候才出现。心头憋得慌,一大早就跑到实验室来调试。弄了半天,把include文件夹中的memset搜索了一遍,就只有一个string.h里面有嘛。哪里还有其他的哩?难道我包含的地方不对?“SPCE061A.h”包含在includes.h中,能够使用,按说所有.c文件都包含includes.h,放在这里是没有问题的嘛。不过上天要它说不行,我也没辙啊没办法,上网查查吧。一说是版本问题!我意识到,好像以前看过一个版本,在OSTask.c中好像是没有用到memset函

5、数。那下载一个老版本的来实验一下,总不能让我去改内核吧,改出来更多问题,得不偿失。我下的是2.00的。经过一番挣扎一般的调试(很久都没有怎么用过凌阳的IDE,很多功能不会用了,又不知道其Bug,出了问题就只好老老实实重新编译等等,确实很累),总算调通了。经过记录下来为了系统化,把uCOS标准移植伪码加上对比。移植准备:ucOS-II的移植主要涉及以下三个文件:OS_CPU.HOS_CPU_A.ASMOS_CPU_C.C移植的工作包括以下几个内容:1.在OS_CPU.H文件中声明10个数据类型BOOLEANINT8UINT8SINT16UINT16SINT32UINT32SFP32FP64OS_

6、STK声明三个宏OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()OS_TASK_SW()设置一个常量的值OS_STK_GROWTH2.编写四个汇编语言函数(OS_CPU_A.ASM)OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()3.用C语言编写六个简单的函数(OS_CPU_C.C)OSTaskStkInit()OSTaskCreateHook()OSTaskDelHook()OSTaskSwHook()OSTaskStatHook()OSTimeTickHook()4.一般认为上面几个方面就构成了整个移植要做的工作,其

7、实我认为还应该包含对Includes.h和OS_CFG.H的配置,因为这些决定了操作系统的功能和编译的环境。移植工作:1、OS_CPU.H根据凌阳的数据结构特点,定义如下:typedef unsigned charBOOLEAN;typedef unsigned charINT8U;typedef signedcharINT8S;typedef unsigned intINT16U;typedef signedintINT16S;typedef unsigned longINT32U;typedef signedlongINT32S;typedef floatFP32;typedef doub

8、leFP64;typedef unsigned intOS_STK;#defineOS_CRITICAL_METHOD2#ifOS_CRITICAL_METHOD = 2/*一般都使用第二种方法*/#defineOS_ENTER_CRITICAL()_asm_(INT OFF /n/t)/*关中断*/#defineOS_EXIT_CRITICAL()_asm_(INT IRQ /n/t INT FIQ /n/t)/*开中断*/#endif#defineOS_STK_GROWTH1/*堆栈增长方式,凌阳是从高向低增长*/#defineOS_TASK_SW()OSCtxSw()/*任务切换函数*/

9、*这里需要说明的是,很多编译器由于支持软中断,所以,这里通常使用的是软中断进入管理模式,然后进行任务切换(例如在ARM7中)。但是凌阳没有软中断,只好通过函数调用的方式进行,而不是让某个中断向量指向OSCtxSw()。到这里,OS_CPU.H的工作大体就是这么多了。2、OS_CPU_C.C在这个文件中,最重要的是OSTaskStkInit()函数的编写,其他Hook函数用来扩展内核功能而不去修改内核结构。先来看看一般堆栈需要初始化成什么样子:l保存参数(这个视情况而定,因为有些处理器的参数是通过寄存器传递的;如ARM7)l保存任务地址,用于保存当前任务(由于凌阳的段寄存器没用,为0,保存tas

10、k+1)l处理器状态字(凌阳应该是SR吧,反正我保存的是SR)l中断返回地址保存(这个好像不太重要,我看ARM7里面就没有保存)l寄存器组按照这个步骤,编写如下:这里注意,版本不同,声明的类型也有不同,在2.52中是OS_STK。void*OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos, INT16U opt)OS_STK *stk;opt= opt;stk= (OS_STK *)ptos;*stk- = *(INT16U*)pdata);/*stk- = *(INT16U*)task);/为0,不需要保存*stk-

11、 = *(INT16U*)task + 1);*stk- = (INT16U)0x0000;/SR不能乱放东西的,因为这个是程序执行用到的*stk- = (INT16U)0x5555;/这些就可以随便放了为了调试方便,可以放一些有意义的数值*stk- = (INT16U)0x4444;*stk- = (INT16U)0x3333;*stk- = (INT16U)0x2222;*stk- = (INT16U)0x1111;return (void*)stk);*说明:在标准伪码里面提到一个模拟ISR的压栈,暂时没有明白是什么意思。(就是说每次任务的调度都是一次中断)3、OS_CPU_A.ASM首

12、先声明需要的外部变量和要输出的变量:.external _OSTCBCur.external _OSTCBHighRdy.external _OSRunning.external _OSPrioCur.external _OSPrioHighRdy.external _OSIntNesting.external _OSTaskSwHook.external _OSIntEnter.external _OSIntExit.external _OSTimeTick.public _OSStartHighRdy.public _OSIntCtxSw.public _OSCtxSw.public _OSTickISR大概就这些吧1)函数_OSStartHighRdy标准函数伪码:void OSStartHighRdy(void)调用用户定义的OSTaskSwHook();OSRunning = TRUE;得到将要恢复运行的任务的堆栈指针:Stack Pointer = OSTCBHighRdyOSTCBStkPtr;从新任务堆栈中恢复处理器的所有寄存器;执行中断返回指令;按这个标准函数,编写函数如下:_OSStartHighRdy:CALL_OSTaskSwHookR1 = 1_OSRunning = R1;R1 = _OSTCBHighRdy

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号