ucos-ii是怎样移植到Keil C上的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ucos-ii是怎样移植到Keil C上的?相关的知识,希望对你有一定的参考价值。

现在学期末了,闲来无事看了一些ucos-ii的知识,想把ucos-ii系统移植到Keil C上,现在已经看了和处理器相关的三个文件还有移植时要注意的事项,可是具体怎么将ucos-ii系统移植到Keil C上呢?是不是直接将ucos-ii系统文件(该工程需要的文件)添加到用户工程?然后在对相关的文件进行剪裁?望哪位有才人细细到来,小生在此谢过了。。。。。

在移植的时候 尽量保证得到的源代码改动最少
并且调试方便 而且目录结构分类清晰

网上的各个项目都有如下特点:
1:一来就吭哧吭哧修改头文件,每个文件都#include "includes.h"
2: ucos和其他文件 或者放在一个文件夹 或者在项目里面不管3721都加上
跳来跳去头都是大的 而且调试的时候出些莫名其妙的问题:比如
设不了断点 或者调试无法进入c文件等等

我的设想:前提 得到ucos2.84
1: 改动尽量少 即不按常规修改里面的#include "includes.h"等
ucos说放哪里我们就放哪里
2: 项目结构和文件存放结构合理,该有的有 不该有的就没有
3: 调试时编译器不会出现怪问题
4: 文档尽量清楚 每处和每步小小的修改都要说明

建议最开始看完 杨屹 大虾的文章

[里面的os_cfg_r.h->改成os_cfg.h] 至此,是ucos里面的[第一处修改]

1: 建立项目文件 拷贝原始文件 整理文件夹
目录如下:
FirstVersion: 根目录 project.uv就放下面
-ucos : 拷贝ucos2.83源代码和os_cpu_a.a51 等凡是ucos相关的到下面 去掉只读和存档属性 自己加一个app_cfg.h(ucos2.83增

加的) 里面内容是#include <reg51.h>嘿嘿
-output:

项目设置:
-SourceGroup
->STARTUP.A51 main.c
--ucos
->os_task.c os_core.c

2: 设置
1: Target1 -> options->output和Listing里面点"Select Folder for Objects" 改为\output
2: Target1->options -> C51和A51里面的 Include Paths->加入ucos
4: Target1 -> options->Target的MemoryModel和CodeRomSize都用Large

编译: 有四个警告 'OSIntCtxSw': missing function-prototype
'OSStartHighRdy': missing function-prototype
'OSCtxSw': missing function-prototype
UCOS\OS_CORE.C(1356): warning C275: expression with possibly no effect
第四个警告是由于OS_TaskIdle()里面
(void)p_arg; /* Prevent compiler warning for not using 'parg' */
没有起到作用 改成p_arg = p_arg;即可。 至此,是在ucos里面的[第二处修改]

3:加入 OS_CPU_C.C 不要问这个文件哪里来的 地球人都知道
在不管它通不通前 还有修改
1: 最前面保持跟其他.c文件一致 加入
#ifndef OS_MASTER_FILE
#include <ucos_ii.h>
#endif

2:加入若干个函数的函数体 大体都是带"hook"的, 这些个函数只在ucos_ii.h有个声明,但由于只有头文件有定义没有函数体 ,keil会

把它编译成LJMP STARTUP1的语句。知道有什么后果了吧
注意#if的条件头文件和c文件要一致

在这里感觉ucos是不是搞了点”技术处理“?反正n个函数头文件和c文件的#if条件不一致
一不小心会造成LJMP STARTUP1! 注意把os_core.c ucos_ii.h和os_cpu_c里面都要改完
至此,是在ucos里面的[第三处修改] 要改的地方还不少

//in ucos_ii.h
#if OS_CPU_HOOKS_EN
void OSInitHookBegin (void);
void OSInitHookEnd (void);
void OSTCBInitHook (OS_TCB *ptcb);
void OSTaskCreateHook (OS_TCB *ptcb);
void OSTaskDelHook (OS_TCB *ptcb);
void OSTaskStatHook (void);
void OSTaskIdleHook (void);
#endif

#if OS_TASK_SW_HOOK_EN
void OSTaskSwHook (void);
#endif

#if OS_TIME_TICK_HOOK_EN
void OSTimeTickHook (void);
#endif

4: 现在开始改OS_CPU_C.C里面的函数
将OSTaskStkInit()改成跟ucos_ii.h里面一样。具体就是原来里面yy大虾的函数是
void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos, INT16U opt)
总之网上各个版本都是ppdata..呵呵 。ucos2.83里面用的是p_arg.我们把它修改成
OS_STK *OSTaskStkInit (void (*task)(void *p_arg) ,
void *p_arg,
OS_STK *ptos,
INT16U opt)
编译能通过 先不管运行起来对不对

5: 在ucos组里面加入os_cpu_a.a51 不要问这个文件哪里来的 地球人都知道
编译 会出现错误: *** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH
这是因为os_cpu_a.a51里面
EXTRN IDATA (OSTCBHighRdy)
EXTRN IDATA (OSRunning)
EXTRN IDATA (OSPrioCur)
EXTRN IDATA (OSPrioHighRdy)
对引用的外部变量作了idata的定义,而ucos_ii.h里面没有

在这里 os_cpu.h里面 先增加一个#define DATATYPE_1 idata
在ucos_ii.h找到这四个变量 增加idata定义 至此,是在ucos里面的[第三处修改]
编译能通过

6:在ucos_ii.h里面
#if 0
void OSStartHighRdy (void);
void OSIntCtxSw (void);
void OSCtxSw (void);
#endif

这就是造成上面的其中三个编译警告的原因 既然ucos2.83里面有说
* IMPORTANT: These prototypes MUST be placed in OS_CPU.H
那么我们就把它们placed in OS_CPU.H
不改动原来的代码 只copy
void OSStartHighRdy (void);
void OSIntCtxSw (void);
void OSCtxSw (void);
到os_cpu.h里面 再编译 现在就只有
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS的警告了
Program Size: data=84.0 xdata=2348 code=8721 //keil 8.06
至此 整个框架就搭起来了 下面就来慢慢对付OSTaskStkInit()这个函数

gogogo!!!!!!!!!!!!!!!!!!

1: os_cfg.h里面先 disable掉
OS_DEBUG_EN OS_FLAG_EN OS_MBOX_EN OS_MEM_EN OS_MUTEX_EN OS_Q_EN OS_SEM_EN
等等等等

题外话: 做一个Configuration Wizard的OS_CFG.H 这下方便多了 。这可是个体力活! 嘿嘿
也不违背了不改动原始文件的初衷

开始go了。建立最简单的一个东西

#include <ucos_ii.h>

void main(void)

OSInit();
OSStart();


发现走到os_cpu_a.a51里面的
OSStartHighRdy:
USING 0 ;上电后51自动关中断,此处不必用CLR EA指令,因为到此处还未开中断,本程序退出后,开中断。
LCALL _?OSTaskSwHook --》一call就call复位了 我靠

捣鼓了下建一个os_cpu_a.c 加入工程 且右键的options->Generate Assembleer SRC File打勾
内容为
#ifndef OS_MASTER_FILE
#include <ucos_ii.h>
#endif

void OSStartHighRdy(void)
OSTaskSwHook();
看了看 生成的东西是这样的
?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE
EXTRN CODE (OSTaskSwHook)
PUBLIC OSStartHighRdy

RSEG ?PR?OSStartHighRdy?OS_CPU_A
OSStartHighRdy:
USING 0

LJMP OSTaskSwHook

END

简直莫名其妙 于是 将os_cpu_a.a51改成

;EXTRN CODE (_?OSTaskSwHook)
EXTRN CODE (OSTaskSwHook) ;keil8.06 <-----改这里

;子程序
;-------------------------------------------------------------------------
RSEG ?PR?OSStartHighRdy?OS_CPU_A
OSStartHighRdy:
USING 0 ;上电后51自动关中断,此处不必用CLR EA指令,因为到此处还未开中断,本程序退出后,开中断。
;LCALL _?OSTaskSwHook
LCALL OSTaskSwHook <-----改这里

再测试 ok 能进入OSIdleStask 并在里面循环 看来是c和汇编连接的一些问题 先把它放一边以后解决 [待解决的问题2]继续测试

这里又想到个问题 万一#define OS_TASK_SW_HOOK_EN 0 那么OSTaskSwHook()就不被编译。
在汇编里面调用会不会又复位?keil这点太……[不知道哪里可以设置 待解决的问题2],
测试了下 果然复位 我靠!作个说明“如果用keil,那么OS_TASK_SW_HOOK_EN 一定要为1

好了 就算第一步测试搞定 现在来做个”笨活路“ 给所有的函数加上reentrant! 内部的static就不用了。

现在开始调试serial 将yy大虾的serial.c搞过来 加入工程
1: 看到汇编和c混合头都是大的 把
#pragma asm
push IE
EA = 0;
之类的东东全部改成 _push_(IE); EA = 0;嘿嘿 当然不要忘记在app_cfg.h加#include <intrins.h>

现在有:
#include <ucos_ii.h>

void Task1(void *p_arg) keilReentrant;
void Task2(void *p_arg) keilReentrant;
void Task3(void *p_arg) keilReentrant;

OS_STK Task1Stack[MaxStkSize];//注意:我在ASM文件中设置?STACK空间为40H即64。
OS_STK Task2Stack[MaxStkSize];
OS_STK Task3Stack[MaxStkSize];

void main(void)

unsigned char ucReturn;

OSInit();
OSInitTimer0(); //也就是原来的InitTimer0();
InitSerial();
InitSerialBuffer();

ucReturn = OSTaskCreate(Task1, (void *)0, &Task1Stack[0] ,2);
ucReturn = OSTaskCreate(Task2, (void *)0, &Task2Stack[0] ,3);
ucReturn = OSTaskCreate(Task3, (void *)0, &Task3Stack[0] ,4);

OSStart();


void Task1(void *p_arg) keilReentrant

p_arg = p_arg;

ET0=1;

for(;;)
//PrintStr("Task 1 is active. \n");
OSTimeDly(3*OS_TICKS_PER_SEC);



void Task2(void *p_arg) keilReentrant

p_arg = p_arg;

for(;;)
PrintStr("Task 2 is active. \n");
OSTimeDly(2*OS_TICKS_PER_SEC);



void Task3(void *p_arg) keilReentrant

p_arg = p_arg;

for(;;)
PrintStr("Task 3 is active. \n");
OSTimeDly(3*OS_TICKS_PER_SEC);



运行 我靠 怎么就显示"Task 1 is active" 任务不切换 ?为啥。
原来os_time.c还没有加到项目里面去(因为这个项目没有把
ucos_ii.c加入项目);OSTimeDly()哪里会工作

加进去,运行->OK

OS_timr 把OS_Timr.c加入 并打开en的开关编译的时候会出现err。原因是回调函数参数太多的问题
解决方法见 http://www.keil.com/support/docs/2066.htm
在ucos-ii.h里面
/* add keilReentrant to to solve the Error 212: Indirect call: Parameters do not fit within registers */
typedef void (*OS_TMR_CALLBACK)(void *ptmr, void *parg) reentrant ;

附加一点就是项目里面直接加如.a文件 不用在include c51L.lib

然后加入一个lcd的驱动 呵呵很简单1602的。前提就是尽量不修改ucos的变量 函数名称和调用方式等
详细见工程。调试通过 不过是在proteus里面。在这里感谢jjj www.proteus.com.cn
记得因为lcd.c里面用到了sempost函数 所以如果要用就必须把OS_MAX_EVENTS 算进去,在你原来的设定值加一

到此 新鲜的ucos2.84出炉了。奉献此身体给大家。想来想去 唯一的卖点就是写了点细节,二是改了个os_cfg.h...呵呵

打包文件在下 ! 只有文档的兄台也不用发mail给我 自己网上找去 应该有下

熊伟 于大年初一 深圳 xiongxiaowei@126.com jdsu光电

version2:
不知道怎么回事,一到 LCALL OSTaskSwHook --》一call就call复位了 我靠
又改回来 LCALL _?OSTaskSwHook 又好了
想了想 是不是我又加了.a文件的原因?
因为后来我又加了一个INT0Function.c 和INT0Function_a.a51

void Int0Function() keilReentrant
//中断在汇编中实现,去掉interrupt //INT0中断服务子程序



#include <include_a.h>

NAME INT0FUNCTION_A ;模块名

?PR?_?INTOFunction?INT0FUNCTION_A SEGMENT CODE

EXTRN CODE (_?INTOFunction)

;-------------------------------------------------------------------------
CSEG AT 0013H ;INT0中断
LJMP INT0ISR ;工作于系统态,无任务切换。
RSEG ?PR?_?INTOFunction?INT0FUNCTION_A

INT0ISR:

USING 0
CLR EA ;先关中断,以防中断嵌套。
PUSHALL
LCALL _?INTOFunction
POPALL
SETB EA
RETI

;-------------------------------------------------------------------------
END
;-------------------------------------------------------------------------

参考资料:http://bbs.21ic.com/icview-125696-1-1.html

参考技术A 首先概念你都没有搞清楚,uCOS-II是一个嵌入式操作系统,Keil C(MDK)是一个集成开发环境。所谓的移植,是把嵌入式操作系统移植到一个硬件平台,你不是在一个集成开发环境。

还是建议你先看uCOS_II(邵贝贝翻译的)这本书,在网上可以下到,百度一下就有了。在第八章是讲的移植过程,不过建议你还是要先去学习前面的章节。下面是在第八章讲的移植过程:

如果用户理解了处理器和 C 编译器的技术细节,移植µC/OS-Ⅱ的工作实际上是非常简
单的。前提是您的处理器和编译器满足了µC/OS-Ⅱ的要求,并且已经有了必要工具。移植
工作包括以下几个内容:

l 用#define设置一个常量的值(OS_CPU.H)
l 声明10个数据类型(OS_CPU.H)
l 用#define声明三个宏(OS_CPU.H)
l 用C 语言编写六个简单的函数(OS_CPU_C.C)
l 编写四个汇编语言函数(OS_CPU_A.ASM)

根据处理器的不同,一个移植实例可能需要编写或改写 50 至 300 行的代码,需要的时
间从几个小时到一星期不等。

一旦代码移植结束,下一步工作就是测试。测试一个象µC/OS-Ⅱ一样的多任务实时内
核并不复杂。 甚至可以在没有应用程序的情况下测试。 换句话说, 就是让内核自己测试自己。追问

是的是的,在我写上这个问题之后我就意识到我的问题本身就有问题,谢谢您在此写出来;但是你没理解我的题目的意思。。。

追答

内核文件你不用去改动的,你在KEIL下面直接建立一个工程项目,在加一个文件就可以了,就是uCOS-II.c,就这个文件里面通过#include " ",已经加入了头文件和内核C文件,你最好下载一个最新版(现在uCOS-III 09年就出来了)的uCOS-II(V2.91)的。在上网上有的,我这里也有,你找不到再让我发给你也可以。

追问

814574753@qq.com 谢谢了 很感谢

本回答被提问者采纳

1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤

I.说明

作者:WXP(翱翔云端的鸟)

联系方式:328452854@qq.com || 13100610853(联系请注明CSDN)

申明:个人原创,转载请先经过本人同意!

要说的话:个人水平有限,写之前也看过许多大神的博客,不足之处,还请指正!有疑问欢迎大家联系我交流探讨!

 

 

 

II.环境

软件环境:KEIL-MDK v-5.24a

硬件:STM32F103ZET6最小系统板

 

 

 

III.uCOS-II

 

1.uCOS简介

uCOS(也有人叫uC/OS)由美国人 Jean Labrosse1992年编写的一个实时操作系统

1998年更新到uCOS-II,并于2000年得到美国航天管理局(FAA)认证,可以用于飞行器中.

官方网站:www.micrium.com

 

2.uCOS-II的特点

1)可裁剪

uCOS-II源代码中有一个专门用来裁剪系统的配置文件,通过各种宏的来打开或者

 关闭那些不需要用到系统服务,这样可以大大减小平台移植uCOS-II所需要的存储空间

 

 (2) 便于移植

  uCOS-II基本全部是用C语言写的,只有和微处理器相关的那部分是用汇编写的,汇编

 所占比例极小,从而使得uCOS-II便于移植到各种微处理器上.事实上uCOS-II已经运用

 在了大部分的8位、16位、32位的MCU中了

 

 (3) 抢占式

  uCOS-II是支持抢占式,系统总是运行多个任务中优先级别最高的那个就绪任务,

 优先级会就绪任务会抢占正在运行的任务,实时性得以保证

 

 (4) 多任务

  uCOS-II同时支持255个任务,实际上不会用到这么多,看具体应用来决定

 

 (5) 稳定可靠

  uCOS-II已经被使用在很多的产品上,经过市场产品的实际检测,具有很好的稳定

 性和可靠性

 

3.uCOS-II的内核对象

 

  ⊙ 信号量

  ⊙ 互斥信号量

  ⊙ 事件标志

  ⊙ 消息邮箱

  ⊙ 消息队列

  ⊙ 内存管理

  ⊙ 时钟管理

  ⊙ 任务管理

 

4.uCOS-II的文件结构

  ⊙ 与处理器无关的代码

   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

   os_tmr.c

   ucos_ii.h

  ⊙ 与处理相关的代码(移植时需要修改)

   os_cpu_c.c

   os_cpu_a.asm

   os_cpu.h

  ⊙ 与应用程序相关的代码

   os_cfg.h

   includes.h

 

 

IV.移植uCOS-IISTM32F103

1. uCOS-II移植准备工作

准备好uCOS-II源码、uCOS-II官方移植到STM32F107DemoSTM32F103裸机Demo

下载地址:

CSDNhttp://download.csdn.net/download/wang328452854/10110946

百度云盘: http://pan.baidu.com/s/1eRHYeJo 密码:d1pj

当然也可以从官网或者论坛下载,然后用你自己的裸机历程也是可以的.

 

 

 

 

 

 

 

2. uCOS-II移植

(1) 若是按照我的代码,解压后如下图所示

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(2) 在裸机代码STM32F103_Demo中添加一个目录uCOS-II

 

 

 

(3)uCOS-II,并在uCOS-II目录下新建两个目录PortsSource

 

 

 

 

(4) 将准备目录下的Micrium\\uCOS-II\\Source下除os_cfg_c.hos_dbg_r.c全部复制到移植工程目录下的Source

 

 

 

 

 

 

 

 

 

 

 

(5) 将准备目录下Micrium_uC-Eval-STM32F107_uCOS-II\\Software\\uCOS-II\\Ports\\ARM-Cortex-M3\\Generic\\RealViem下的全部文件拷贝到移植目录的Ports

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(6) Micrium_uC-Eval-STM32F107_uCOS-II\\Software\\EvalBoards\\Micrium\\uC-Eval-STM32F107\\uCOS-下的三个文件拷贝到移植工程的App目录下

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(7) MDK打开移植工程,新建Group  uCOS-II_Source uCOS-II_Ports并添加对应文件如下

 

上图中比之前多了app_hooks.c,主要是一些钩子函数,若是需要从第6步中拷贝到App下添加即可

 

 

 

 

(8) 修改includes.h 如下

/*
*********************************************************************************************************
*                                              EXAMPLE CODE
*
*                          (c) Copyright 2003-2013; Micrium, Inc.; Weston, FL
*
*               All rights reserved.  Protected by international copyright laws.
*               Knowledge of the source code may NOT be used to develop a similar product.
*               Please help us continue to provide the Embedded community with the finest
*               software available.  Your honesty is greatly appreciated.
*********************************************************************************************************
*/
 
/*
*********************************************************************************************************
*
*                                           MASTER INCLUDES
*
*                                     ST Microelectronics STM32
*                                              on the
*
*                                     Micrium uC-Eval-STM32F107
*                                        Evaluation Board
*
* Filename      : includes.h
* Version       : V1.00
* Programmer(s) : EHS
*********************************************************************************************************
*/
 
#ifndef  INCLUDES_PRESENT
#define  INCLUDES_PRESENT
 
 
/*
*********************************************************************************************************
*                                         STANDARD LIBRARIES
*********************************************************************************************************
*/
 
#include  <stdarg.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <math.h>
 
 
/*
*********************************************************************************************************
*                                              LIBRARIES
*********************************************************************************************************
*/
 
//#include  <cpu.h>
//#include  <lib_def.h>
//#include  <lib_ascii.h>
//#include  <lib_math.h>
//#include  <lib_mem.h>
//#include  <lib_str.h>
 
 
/*
*********************************************************************************************************
*                                              APP / BSP
*********************************************************************************************************
*/
 
#include  "bsp.h"
 
/*
*********************************************************************************************************
*                                                 OS
*********************************************************************************************************
*/
 
#include <ucos_ii.h>
 
 
 
/*
*********************************************************************************************************
*                                                 ST
*********************************************************************************************************
*/
 
 
 
 
/*
*********************************************************************************************************
*                                            INCLUDES END
*********************************************************************************************************
*/
 
 
#endif


 

 

 

 

(9)修改main.c如下

/******************************************************************************
* File       : main.c
* Function   : 主文件
* Description: None          
* Version    : V1.00
* Author     : WXP
* Date       :
* History    :  
******************************************************************************/
 
#include "includes.h"
 
 
//START 任务
//设置任务优先级
#define START_TASK_PRIO      	10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE  	64
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);
 	   
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO       	7
//设置任务堆栈大小
#define LED0_STK_SIZE  	    	64
//任务堆栈
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);
 
 
//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO       	6
//设置任务堆栈大小
#define LED1_STK_SIZE  	64
//任务堆栈
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *pdata);
 
int main(void)

 
Bsp_Init();
OSInit();   
 	OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();	  	 
    
    while(1)

 
	 

 
  
//开始任务
void start_task(void *pdata)

    OS_CPU_SR cpu_sr=0;
pdata = pdata;
  	OS_ENTER_CRITICAL();	//进入临界区(无法被中断打断)    
 	OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);	   
 	OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);	 	   
OSTaskSuspend(START_TASK_PRIO);	//挂起起始任务.
OS_EXIT_CRITICAL();	//退出临界区(可以被中断打断)

 
 
 
 
//LED0任务
void led0_task(void *pdata)
	 
while(1)

LED2(ON);
OSTimeDlyHMSM(0,0,0,200);
LED2(OFF);
OSTimeDlyHMSM(0,0,0,200);


 
//LED1任务
void led1_task(void *pdata)
	  
while(1)

        LED3(ON);
OSTimeDlyHMSM(0,0,0,500);
LED3(OFF);
OSTimeDlyHMSM(0,0,0,500);



 

 

(10) 修改uCOS-II_Ports下的os_cpu_a.asm


 

 

 

 

 

(11) 编译会出现一个错误,重定义了PendSV_Handler

 

 

 

这个时候只需要把stm32f10x_it.c中的PendSV_Handler注释掉即可

 

 

 

此时编译不会报错但是并未修改完成

 

(12) 修改bsp_systick.c

 

 

 

 

(13) 修改os_cpu_c.c中的关于systick的配置初始化及中断处理部分

 



 

 

 

 

 

(14) 注释掉os_cpu.h中我们刚才修改过的函数部分

 

 

至此移植步骤完成了,main.c中两个LED任务,下载到开发板中可以看到两个灯以不同频率闪烁

以上是关于ucos-ii是怎样移植到Keil C上的?的主要内容,如果未能解决你的问题,请参考以下文章

1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤

1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤

ucos-ii在ti dsp 28377芯片上的运行过程和移植过程

uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤

(转载)uCOS-II的嵌入式串口通信模块设计

STM32+uCOS-II+uc/GUI移植 (uC/GUI API函数学习一)