51单片机成功运行UCOSII实时操作系统


怀着好奇的心情在网上搜索关于UCOSII移植到51单片机的资料,步骤都是一样的,好多都是转载、转载,但是具体的内容并没有说清楚,好不容易搜到一个把移植过程说的很清楚的帖子,但是后面又说编译和运行过程中出现很多问题,我又绝望了 。因为之前对51单片机只是简单的学了一下,对于移植UCOSII系统,还是得花点功夫的 。由于我快毕业了,如果专研于UCOSII移植到51单片机,又得花上我一周的时间,想想那我的移动机器人得多久才能成功啊,于是,在CSDN上下载已经移植到51单片机上的源代码,起初我只是试着下来学习一下,学习怎样编写那些与cpu有关的函数的,我下载的那个源代码是将UCOSII移植到AT91系列上的,我果断编译了一下,成功编译,看一下输出的hex文件,才19kb 。果然我又对源代码产生兴趣 。我从始至终还是没有靠自己一步一步的将原版的UCOSII移植到51单片机上 。我下面说说移植UCOSII需要做哪些工作吧,也是看书知道的 。


一、准备工作


1. 开发环境: Keil C集成开发环境


2. 源代码:UCOSII的源代码,网上可以自己下载


3. 文件分析:


1)UCOSII文件中与处理器无关的文件:


OS_CORE.C


OS_FLAG.C


OS_MBOX.C


OS_MEM.C


OS_MUTEX.C


OS_Q.C


OS_SEM.C


OS_TASK.C


OS_TIME.C


UCOS_II.C


UCOS_II.H


以上这些文件在c51移植过程中只需给函数加上可重入性即可,即在每个函数后面添加关键字:reentrant


2)与应用相关的文件:


INCLUDES.H——其中包含51单片机头文件和相关应用头文件


OS_CFG.H——这个文件对于要应用系统中的相关工具,如邮箱,信号等,都要在这个头文件中把相关宏设置为1


3)与处理器相关的文件:


OS_CPU.H——相关的数据类型、关中断、任务堆栈方向、任务切换宏定义等


OS_CPU_A.ASM——一堆的汇编和伪指令,我表示没去深究,但是是整个移植的关键所在
【51单片机成功运行UCOSII实时操作系统】

OS_CPU_C.C——OSTaskStkInit()函数和系统中断定时器的编写 。


还有一个重要的思想就是c51堆栈的设计,我对于这个有点头大,不清楚 。


二、开始修改和编写代码移植 。


我没有经历过移植的过程,所以我没有发言权,我只参考51单片机牛人的代码,学着应用就行


由于在CSDN上忘记移植者是谁了,我在这将重要文件中的代码贴出参考参考,只做交流使用 。


includes.h


#ifndef __INCLUDES__
#define __INCLUDES__


#include"uCosiios_cpu.h"
#include"uCosiios_cfg.h"
#include"uCosiiucos_ii.h"
#include"reg51.h"


#endif


OS_CFG.H


#ifndef __OS_CFG_H
#define __OS_CFG_H


#define MaxStkSize64/*根据修改,每个任务使用同样大小的堆栈,这就是每个堆栈的大小*/


#define OS_MAX_EVENTS1/* Max. number of event control blocks in your application ... */
/* ... MUST be > 0*/
#define OS_MAX_FLAGS1/* Max. number of Event Flag Groupsin your application ... */
/* ... MUST be > 0*/
#define OS_MAX_MEM_PART1/* Max. number of memory partitions ...*/
/* ... MUST be > 0*/
#define OS_MAX_QS1/* Max. number of queue control blocks in your application ... */
/* ... MUST be > 0*/
#define OS_MAX_TASKS3/* Max. number of tasks in your application ...*/
/* ... MUST be >= 2*/


#define OS_LOWEST_PRIO4/* Defines the lowest priority that can be assigned ...*/
/* ... MUST NEVER be higher than 63!*/


#define OS_TASK_IDLE_STK_SIZEMaxStkSize/* Idle task stack size (# of OS_STK wide entries),使用相同的栈大小*/


#define OS_TASK_STAT_EN0/* Enable (1) or Disable(0) the statistics task*/
#define OS_TASK_STAT_STK_SIZEMaxStkSize/* Statistics task stack size (# of OS_STK wide entries),使用相同的栈大小*/


#define OS_ARG_CHK_EN0/* Enable (1) or Disable (0) argument checking*/
#define OS_CPU_HOOKS_EN1/* uC/OS-II hooks are found in the processor port files*/




/* ----------------------- EVENT FLAGS ------------------------ */
#define OS_FLAG_EN0/* Enable (1) or Disable (0) code generation for EVENT FLAGS*/
#define OS_FLAG_WAIT_CLR_EN0/* Include code for Wait on Clear EVENT FLAGS*/
#define OS_FLAG_ACCEPT_EN0/*Include code for OSFlagAccept()*/
#define OS_FLAG_DEL_EN0/*Include code for OSFlagDel()*/
#define OS_FLAG_QUERY_EN0/*Include code for OSFlagQuery()*/




/* -------------------- MESSAGE MAILBOXES --------------------- */
#define OS_MBOX_EN1/* Enable (1) or Disable (0) code generation for MAILBOXES*/
#define OS_MBOX_ACCEPT_EN0/*Include code for OSMboxAccept()*/
#define OS_MBOX_DEL_EN0/*Include code for OSMboxDel()*/
#define OS_MBOX_POST_EN1/*Include code for OSMboxPost()*/
#define OS_MBOX_POST_OPT_EN0/*Include code for OSMboxPostOpt()*/
#define OS_MBOX_QUERY_EN0/*Include code for OSMboxQuery()*/




/* --------------------- MEMORY MANAGEMENT -------------------- */
#define OS_MEM_EN0/* Enable (1) or Disable (0) code generation for MEMORY MANAGER */
#define OS_MEM_QUERY_EN0/*Include code for OSMemQuery()*/





    推荐阅读