uC/OS-II在C51上的移植步骤

发布者:名字太长了吗最新更新时间:2016-11-22 来源: eefocus关键字:OS-II  C51  移植步骤 手机看文章 扫描二维码
随时随地手机看文章

这段时间已成功把uC/OS-II 2.52移植到51单片机上,现总结移植步骤:

1.在main函数只包括
void main(void)
{
     OSInit();
   
     OSStart();
}
看是否能编译通过,可以通过后继续下一步。
2.验证OSTaskStkInit()和OSStartHighRdy()函数
这 里首先要修改OS_CFG.H文件,设置OS_TASK_STAT_EN 为0,以禁止统计任务。只让空闲任务工作,并单步执行,直到uC/OS-II切换到OS_TaskIdle()。单步时跳过OSInit()函数,单步进 入OSStart()函数。 一直单步运行到调用OSStartHighRdy()(这是OSStart()函数的最后一句),然后单步进入OSStartHighRdy()。这时, 编译器应该切换到汇编语言模式下,因为OSStartHighRdy()是用汇编语句实现的。OSStartRdy()会开始运行第1个任务;而此时并没 有任何应用任务.只有OS_TaskIdle()可以运行。如果调试器在OS_TaskIdle()循环中运行,且在无限循环中已经执行几次,那么就已经 验证了OSTaskStkInit()和OSStartHighRdy()函数是成功的。

3.验证OSCtxSw()函数 (注这是中断是关着的,见OS_CORE.C的OS_Sched())
如果上一步测试成功,这一步代码验 证就比较容易了.因为已经知道由OSTaskStkInit()初始化的堆栈结构是正确的。在这一步测试中,添加了一个应用程序.并不断切换到空闲任务。 在这之前,应该保证已经正确设置了软中断向量或指令陷阱TRAP向量,使之指向OSCtxSw()函数。这里uC/OS-II应该将TestTask() (假设刚建立的任务名为它)作为第1个任务开始执行,而不再是空闲任务。可以单步执行,一直到TestTask()函数的开始.注这时并没有允许中断,也 没有打开时钟节拍,所以OSTimeDly(1)不会返回到TestTask(). 并经调度后由OSCtxSw()返回到OS_TaskIdle()任务中。这样的说明OSCtxSw()函数移植成功。

#i nclude "includes.h"
OS_STK TestTaskStk[100];


void TestTask(void *ptrdata)
{
    ptrdata=ptrdata;
    while(1)
    {
        OSTimeDly(1);
     }
}

void main(void)
{
   OSInit();
   
   OSTaskCreate(TestTask,(void *)0,&TestTaskStk[99],0);  //51仿真堆栈?C_XBP递增
   OSStart();
}

3.验证OSIntCtxSw()和OSTickISR()函数
OSIntCtxSw()很像OSCtxSw(),且比OSCtxSw()简单。
在此测试之前,应该保证时钟中断向量指向了时钟节拍中断服务子程序,然后,初始化时钟节拍并开中断。我这里测试使用100Hz的节拍,节拍的速度应该与在OS_CFG.H中设置的OS_TICKS_PER_SEC吻合。
测试代码如下:
#i nclude "includes.h"
sbit LedBlink=P1^0;

OS_STK TestTaskStk[100];


void TestTask(void *ptrdata)
{
    ptrdata=ptrdata;
 
    OS_ENTER_CRITICAL();

    TMOD=0x01;
    TH0=0xdc;                       //10ms,100hz
    TL0=0x00;
    TR0=1;
    ET0=1;                         

     OS_EXIT_CRITICAL();   

     while(1)
    {
        OSTimeDly(1);
        if (LedBlink==FALSE)
        {
              LedBlink=TRUE;    

         }else
         { 
            LedBlink=FALSE;   

          }
     }
}

void main(void)
{
   OSInit();
   
   OSTaskCreate(TestTask,(void *)0,&TestTaskStk[99],0);  //51仿真堆栈?C_XBP递增
   OSStart();
}

时钟节拍中断调用OSTickISR(),继而调用OSTimeTick。
说明:OSTickISR中一定要有中断调度程序,否则的话,空闲任务无法再切换到其它应用任务,因为空闲任务没有任务延时函数.

编译成功后,点Run,然后在TestTask任务OSTimeDly(1);处设置断点,并单步进入,看能否正确任务调度到 OSTaskIdle()即空闲任务,空闲任务一直到运行,直到接收到时钟节拍中断(即Timer0),时钟节拍中断调用OSTickISR(),继而调 用OSTimerTick().OSTimerTick()将TestTask()的.OSTCBDly计数器递减到0,使该任务进入就绪态;而当 OSTickISR()完成并调用OSIntExit()函数时,OSIntExit()将会注意到有更重要的任务,TestTask()已处于就绪态等 待运行。这时ISR就不会再返回到空闲任务,而是做任务切换,回到TestTask()任务。当然,以上是假设OSIntCtxSw()和 OSTickISR()这2个函数都能正常工作.如果OSIntCtxSw()正常工作,而且已经将时钟节拍频率设置为100Hz(10ms),这里可以 看到LED即P1.0在来回闪烁.

4.然后再写其它中断服务函数的入口处程序,可以参考OSTickISR()。

5.至此,uC/OS-II的移植工作就OK了,可以添加更多的应用程序了,真正的项目工作可以开始了。


关键字:OS-II  C51  移植步骤 引用地址:uC/OS-II在C51上的移植步骤

上一篇:HT1621驱动段式液晶的C51程序
下一篇:如何在KEIL C51(v6.21) 中调用汇编函数的一个示例

推荐阅读最新更新时间:2024-03-16 15:21

Keil C51对C语言的关键词扩展之八: far
far的出现,是Keil 编译器为了支持新出现的8051家族增强型MCU,这些增强型MCU可能拥有大于64KB的存储器。使用far可访问扩展的RAM,使用const far可访问扩展的ROM。 NXP 51MX架构51单片机提供通过通用指针访问多达8MB的code和xdata存储空间。Dallas 390架构的51单片机通过24位的DPTR寄存器结合传统MOVX 、MOVC指令来访问扩展的RAM和ROM。
[单片机]
C51自学笔记】LCD1602
LCD1602: (16*2字符 A:当前显示 B:当前无法显示 初始化: #include reg52.h #define uchar unsigned char #define uint unsigned int sbit rs=P2^4; sbit rw=P2^5; sbit e=P2^6; uchar table1 = www.tlxmcu.com ; uchar table2 = LCD1602 test ok! ; //************************************************ //延时函数,在12MHz的晶振频率下 //大约50us的
[单片机]
【<font color='red'>C51</font>自学笔记】LCD1602
C51中断函数格式
C51 Keil 编译器中断函数语法定义: void 函数名() interrupt n using m C51编译器允许0~31个中断,C51控制器所提供的中断及中断地址如下: 中断号 中断源 中断地址 0 EXTERNAL 0 0003H 1 TIMER/COUNTER 0 000BH 2 EXTERNAL 1 0013H 3 TIMER/COUNTER 1 001BH 4 SERIAL PORT 0023H 中断函数编写规则: 不能进行参数传递 无返回值 在任何情况,不能直接调用中断函数 可以在中断函数定义中用using指定当前使用的寄存器组 void 函数名 () i
[单片机]
c51中的intrins.h库函数
#ifndef __INTRINS_H__ #define __INTRINS_H__ extern void _nop_ (void); extern bit _testbit_ (bit); extern unsigned char _cror_ (unsigned char, unsigned char); extern unsigned int _iror_ (unsigned int, unsigned char); extern unsigned long _lror_ (unsigned long, unsigned char); extern unsigned char _crol_ (unsigned char,
[单片机]
Keil C51 中使用Printf()进行串口输出
如何使用printf在串口显示信息,有两种办法,因为在keil C51中 printf函数是调用putchar进行数据传送的,而putchar应该是先判断TI是否为1,不为1则等待为1。 如果为1则清0,然后送出一个字符。因此如果你直接使用printf函数,你的程序就会在putchar函数中等待TI为1。这时你的程序就相当于直接死掉了。你可以通过改写putchar函数实现自己的目的。TI相当于是初始化不给赋初值就不干活。 所以第一种办法就是在初始化的时候,给TI赋值为1,比如 void uart_init() { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率
[单片机]
μC/OS-II实时性能测试与研究
实时性是指系统能够在限定的时间内完成任务并对外部的异步事件作出及时响应。在大多数工业控制中,对实时性的要求非常高。 实时操作系统是能够满足实时系统中实时任务的处理响应时间要求的操作系统。实时操作系统是事件驱动(event-driven)的,能对来自外界的作用和信号在限定的时间范围内作出响应。它强调的是实时性、可靠性和灵活性,与实时应用软件相结合成为有机的整体,起着核心作用;由它来管理和协调各项工作,为应用软件提供良好的运行软件环境及开发环境。在多任务实时系统中,必然由实时操作系统来对实时任务进行管理。 μC/OS-II是一种结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管
[测试测量]
μC/<font color='red'>OS-II</font>实时性能测试与研究
c51实现万年历、温度与闹钟功能程序
#include reg51.h sbit Bell_Out = P1 ^ 7;//闹钟管脚输出 sbit DQ = P2 ^ 1;//ds1820data sbit clock_clk = P1 ^ 0;//ds1302_clk sbit clock_dat = P1 ^ 1;//ds1302_dat sbit clock_Rst = P1 ^ 2;//ds1302_Rst #define Disp_On 0x3f //定义管脚的指令值 #define Disp_Off 0x3e #define Col_Add 0x40 #define Page_Add 0xb8 #define Start_Line 0xc0 #de
[单片机]
基于μC/OS-II嵌入式系统的低功耗开发
随着嵌入式系统应用的日益广泛,如何实现嵌入式系统的低功耗开发已经成为嵌入式应用发展的关键技术之一,是近几年来人们在嵌入式系统的设计中普遍关注的难点与热点。嵌入式系统正被广泛应用于移动性较强的产品中去,而这些产品不是一直有充足的电源供应,往往需要电池来供电,因此,设计人员需要从每一个细节来考虑降低系统的功率消耗,从各个方面去实现降低系统的功耗。同时功耗对终端设备的成本及体积大小有显著影响。 本文结合FM电台手持式测试仪这一实例,从系统硬件设计、系统软件设计、利用内核扩展接口和产品应用特点这四个方面深入地讨论了基于μC/OS-II嵌入式系统丌发中低功耗系统的设计。 1、嵌入式系统概述 1.1 嵌入式系统的定义 根据IEEE(国
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved