| | 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 所有产品 | 留言 | 论坛 | 购买指南 | 网络协议 | 驱动设计 | | |
![]() |
![]() |
| 您现在的位置: 21嵌入式控制研究室 >> 嵌入式操作系统 >> ucOSII >> 文章正文 |
|
|||||
| uC/OS-Ⅱ在C167CR单片机上的移植 | |||||
| 作者:嵌入式资… 文章来源:21control 点击数: 更新时间:2006-3-19 | |||||
|
μC/OS-II是一个著名的源码免费的嵌入式RTOS,具有源码公开、可移植、可固化、可裁减、稳定性和可靠性高的特点。μC/OS-II是基于优先级的占先式(Preemptive)实时多任务内核,最多可支持64个任务(其中系统保留8个自用)。由于μC/OS-II是为嵌入式应用编写的通用软件,故在具体应用时需根据不同单片机的特点进行移植。μC/OS-II的大部分代码是用ANSI C编写的,只有与处理器相关的一部分代码用汇编语言编写,所以具有很强的可移植性,可以在大多数8位、16位、32位单片机及数字信号处理器上运行。本文介绍μC/OS-II在Infineon C167CR单片机上的移植技术。 1 Infineon C167CR单片机简介 C167CR单片机是Infineon公司80C166系列单片机中的一款高性能16位微处理器,其最高时钟频率可达25 MHz,片内ROM最多达128K,寻址能力16M。C167CR单片机集成度高,具有丰富的片内资源:111个I/O引脚、16级56个中断、32个捕捉/比较通道、16个A/D转换通道、4个PMW通道、两组通用定时器单元、8通道外围事件控制器、同步/异步串行接口和高速同步串行接口、CAN模块等。C167CR单片机的内部资源及其C编译器满足μC/OS-II的移植条件。 2 μC/OS-II在C167CR单片机上的移植 在μC/OS-II的移植中需要修改五个文件:主头文件INCLUDES.H、系统配置文件OS_CFG.H以及与CPU相关的三个文件(OS_CPU.H、OS_CPU_A.ASM以及OS_CPU_C.C)。移植中使用的编译器是Keil公司的Keil C166编译器。五个文件具体内容请见本刊网络补充版(http://www.dpj.com.cn)。 3 移植示例 示例中,共创建了二个任务,其中发送任务SenderTask()以发送消息的形式连续地向发送邮箱中传送0~9这10个数,当收到接收邮箱的消息之后,就开始发送下一个数字;接收任务ReceiverTask()从发送邮箱中取出数字,从P2口输出,再延时5 s,而后向接收信箱回送消息。程序清单如下: #include "includes.h"" #define TASK_STK_SIZE 512 /*任务堆栈为1KB*/ #define N_TASKS 2 /*任务数*/ OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /*任务堆栈*/ OS_EVENT pReceiverMailBox; /*接收邮箱*/ OS_EVENT pSenderMailBox; /*发送邮箱*/ void ReceiverTask(void *data); void SenderTask(void *data); /*主程序*/ void main (void){ DP2 = 0xffff; /*设置P2口为输出*/ OSInit(); /*系统初始化*/ pReceiverMailBox = OSMboxCreate((void*)0); /*创建接收邮箱*/ pSenderMailBox = OSMboxCreate((void*)0); /*创建发送邮箱*/ OSTaskCreate(ReceiverTask, (void *)0, (void *)&TaskStk[0][TASK_STK_SIZE - 1], 3); /*创建接收任务*/ OSTaskCreate(SenderTask, (void *)0, (void *)&TaskStk[1][TASK_STK_SIZE - 1], 4); /*创建发送任务*/ OSStart(); /*启动系统*/ } /*发送任务*/ void SenderTask (void *data){ INT8U count = 0; INT8U error; data = data; while (1){ for (count=0;count<10;count++){ OSMboxPost(pSenderMailBox, (void*)&count); OSMboxPend(pReceiverMailBox, 0, &error); } } } /*接收任务*/ void ReceiverTask (void *data){ INT8U *count; INT8U error; data = data; OSTickISRInit(); while (1) { count = (INT8U*)OSMboxPend(pSenderMailBox, 0, &error); P2 = *count; OSTimeDlyHMSM(0, 0, 5, 0); OSMboxPost(pReceiverMailBox, (void*)1); } } |
|||||
| 文章录入:fengfeiyi 责任编辑:fengfeiyi | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | | |
![]() |
站长:康草科技 |