求这个的C语言程序,可以接在c8051f340串口程序上的

C8051F单片机C程序精确延时的方法
A Precision Delay Method on C8051F
通过分析C语言的3种循环语句在Keil C51编译器下的编译特点,研究C8051F单片机C程序延时时间的手工计算和程序调试获取的通用方法,并对C延时程序软件仿真调试过程和延时精度进行了详细分析.该方法实现的程序延时精度高,简单易用,也很容易移植到其他8051内核的单片机中.
Xue Xiaoling
Liu Zhiqun
Jia Junrong
年,卷(期)
机标分类号
福建省教育厅科研项目
本文读者也读过
加载中,请稍候
.客服电话
&&8:00-11:30,13:00-17:00(工作日)怎么没人顶呢?
UID180893&帖子144&精华0&积分23268&资产23268 信元&发贴收入820 信元&推广收入0 信元&附件收入25225 信元&下载支出2827 信元&阅读权限80&在线时间69 小时&注册时间&最后登录&
正在找呢,谢谢啊......
UID371166&帖子17&精华0&积分1&资产1 信元&发贴收入85 信元&推广收入0 信元&附件收入0 信元&下载支出134 信元&阅读权限10&在线时间1 小时&注册时间&最后登录&
UID382241&帖子7&精华0&积分5&资产5 信元&发贴收入35 信元&推广收入0 信元&附件收入0 信元&下载支出80 信元&阅读权限10&在线时间0 小时&注册时间&最后登录&
UID382852&帖子146&精华0&积分45&资产45 信元&发贴收入850 信元&推广收入0 信元&附件收入52 信元&下载支出911 信元&阅读权限10&在线时间53 小时&注册时间&最后登录&
顶,顶!!!!
UID368756&帖子244&精华0&积分67230&资产67230 信元&发贴收入1620 信元&推广收入0 信元&附件收入73093 信元&下载支出7533 信元&阅读权限90&在线时间231 小时&注册时间&最后登录&
学习单片机的好资料.
UID368756&帖子244&精华0&积分67230&资产67230 信元&发贴收入1620 信元&推广收入0 信元&附件收入73093 信元&下载支出7533 信元&阅读权限90&在线时间231 小时&注册时间&最后登录&
UID466929&帖子35&精华0&积分60&资产60 信元&发贴收入175 信元&推广收入0 信元&附件收入0 信元&下载支出165 信元&阅读权限10&在线时间5 小时&注册时间&最后登录&
顶了, 好东西.
UID230410&帖子4&精华0&积分0&资产0 信元&发贴收入25 信元&推广收入0 信元&附件收入0 信元&下载支出75 信元&阅读权限10&在线时间1 小时&注册时间&最后登录&
xiexie&&好资料& && &哈
[通过 QQ、MSN 分享给朋友]
欢迎访问 TI SLL(信号链)专区实时操纵系统μC/OSII在C上的移植_工业自动化_中国百科网
实时操纵系统μC/OSII在C上的移植
    
摘要&本文先容了实时操纵系统μC/OS-II的特点,讨论了其在51系列单片机上移植的必要性。并选择8位单片机C作为移植目标,分析了μC/OS-II的具体移植过程。最后设计例程验证了移植的正确性。 关键词&C;μC/OS-II;移植&&&&&&&& The&Porting&of&Real-Time&Operation&System&μC/OS-II&on&C Taiyuan&University&of&Technology&&&&Tian&Juan&&&&&&&& Abstract&The&paper&introduces&the&characteristic&of&real-time&operation&system&μC/OS-II,&and&discusses&the&necessity&of&porting&μC/OS-II&on&51&series&MCU.&Then&the&specific&process&of&porting&μC/OS-II&on&C&which&is&selected&as&porting&target&is&analyzed.&The&paper&ends&with&designing&test&program&to&prove&the&success&of&the&porting. Keywords&C;&μC/OS-II;&porting&&&&&&&& 引言&&&&&&&& &&&&传统的嵌进式系统设计往往采用前/后台系统。应用程序是一个无穷的循环,在循环中调用相应的函数完成对应的操纵,这部分可以看成后台行为。中断服务程序处理异步事件,这部分可以看成前台行为[1]。在大多数对实时性要求较高的场合中,这种系统结构就无法满足应用的要求,实时内核逐步成为嵌进式系统设计的主流。μC/OS-II是一个完整的,可移植、固化、裁减的占先式实时多任务内核,不仅结构简单,尽大部分采用C语言,而且可移植性好,很轻易被移植到各种微处理器上,在移植过程中,只需要做少量的修改工作即可。目前μC/OS-II最多支持64个任务,总是在执行处于停当态的优先级最高的任务。并且因其源代码的完全公然和优越性能而得到了广泛的应用。&&&&&&&& &&&&51系列单片机是美国Intel公司在1980年推出的高性能8位单片机,目前仍然是我国使用最广泛的单片机系列之一,有非常大的应用环境与远景。假如开发一套基于51系列单片机的操纵系统,那么用户只需要编写各个任务的程序,不必同时将所有任务运行的各种情况记在心中,不但大大减少了程序编写的工作量,而且减少了出错的可能性[2]。&&&&&&&& &&&&所以,在51系列单片机上移植实时操纵系统μC/OS-II是很有必要的。&&&&&&&& 1&μC/OS-II的移植条件&&&&&&&& &&&&要使μC/OS-II移植到处理器后能正常运行,处理器必须满足以下条件:&&&&&&&& &&&&●&处理器的C编译器能产生可重进代码。μC/OS-II是可剥夺型内核,总是让停当态的高优先级的任务先运行,中断服务程序可以抢占CPU,所以只能通过C编译器产生可重进代码。可重进函数可以被一个以上的任务调用,而不必担心数据被破坏。 &&&&●&处理器的C编译器能在C语言中开中断和关中断。由于μC/OS-II在处理临界段的时候,须关中断,处理完毕后,再开中断。 &&&&●&处理器支持中断,并且能产生定时中断。由于μC/OS-II是通过硬件中断来实现系统时钟,并在时钟中断服务程序中来处理与时间相关的题目,实现任务之间的调度。 &&&&●&处理用具有一定数目的硬件堆栈,并且有将堆栈指针和其他CPU寄存器内容读出、并存储到堆栈或内存中的指令。由于μC/OS-II为每一个任务分配任务堆栈,在任务切换时,需要先保存当前任务堆栈内容,再恢复最高优先级任务堆栈内容。&&&&&&&& 2&CPU芯片的选择&&&&&&&& &&&&随着现代通讯技术的发展,智能化系统对DSP需求的增长要求不断进步单片机运算速度[3]。C8051F系列单片机就是在这样的情况下由Silabs公司推出的,它是完全集成的混合信号系统级芯片,具有与8051兼容的微控制器内核,在不扩展8位数据总线的情况下,使单周期指令速度进步到原8051的12倍。而C作为C8051F系列中的高端产品就被选择为系统移植的对象。&&&&&&&& &&&&C的内部资源有:64个I/O引脚,5个16位通用计数器/定时器,6个捕捉/比较模块,硬件实现的SPI,SMBus/IIC和两个UART串行接口,片内看门狗定时器,2个比较器,真正12位100ksps的8通道ADC,8位500ksps的8通道ADC,128KB的FLASH存储器,8448B的内部数据RAM[4]。&&&&&&&&& &&&&由于C处理器和使用的Keil编译器都能够很好的满足上述移植条件,所以可以把μC/OS-II移植到C上。在实际开发系统中,使用外部晶体振荡器,晶振频率为22.1184MHZ,并外扩256KB的RAM。&&&&&&&& 3&移植过程&&&&&&&& &&&&μC/OS-II的移植可以看作是对μC/OS-II代码的修改。μC/OS-II的代码分为与处理器无关的代码,与处理器相关的代码和与应用相关的代码。与处理器无关的代码原则上是不用修改可以直接添加,但由于Keil编译器的特殊性,必须在需要可重进的函数声明的后面标注reentant关键字,即加上重进属性;又由于pdata既是Keil的关键字又是μC/OS-II的一些函数的形参,会导致编译错误,所以把pdata改为pdat。与处理器相关的代码包括3个文件:OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM,需要大量的修改后才能添加,这是移植工作的重点。另外,与应用相关的代码包括2个头文件:INCLUDES.H和OS_CFG.H。INCLUDES.H是一个主头文件,出现在每个.C文件的第一行。INCLUDES.H文件使得工程项目中的每个.C文件无需分别考虑它实际上需要哪些头文件。还可以在头文件列表的最后添加自己的头文件。OS_CFG.H是系统配置文件,μC/OS-II的裁减过程是通过对OS_CFG.H中的相关常量进行设置来完成[5]。可以分为任务治理功能的裁减,节省代码存储空间;数据结构的裁减,节省数据存储空间;系统节拍频率设置和任务堆栈大小设置。&&&&&&&& 3.1&OS_CPU.H&&&&&&&& &&&&OS_CPU.H包括了用#define语句定义的、与处理器相关的常数、宏以及类型。&&&&&&&& &&&&数据类型的定义是为了保证可移植性。而且必须把任务堆栈的数据类型告诉μC/OS-II,通过为OS_STK声明恰当的C数据类型来实现的。C的堆栈是8位的,所以声明OS_STK:&&&&&&&&& &&&&typedef&&INT8U&&OS_STK;&&&&&&&&//堆栈的宽度为8位&&&&&&&& &&&&μC/OS-II为了处理临界段代码,须关中断,处理完毕后,再开中断。所以定义2个宏来关中断和开中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。这2个宏可以用3种方法实现,具体用哪种方法,取决于使用的处理器类型和C编译器。C使用方法1来处理临界段,即直接开关中断。这样定义既减少了程序行数,又避免了退出临界区后关中断造成的死机。根据中断答应寄存器&IE的第7位EA为中断答应总控制位,EA=0屏蔽所有中断,EA=1答应所有中断,所以定义语句为: &&&&#define&&OS_ENTER_CRITICAL()&&EA=0&&&//关中断 &&&&#define&&OS_EXIT_CRITICAL()&&EA=1&&&&&//开中断 &&&&C堆栈从下向上增长(0=向上,1=向下),通过配置常数OS_STK_GROWTH指定堆栈的方向。所以定义语句为: &&&&#define&&OS_STK_GROWTH&&0&&&&//堆栈从下向上增长,1=向下增长 &&&&μC/OS-II的任务切换是通过模仿中断动作完成的,但C没有软中断指令,所以用函数调用的方式实现任务切换,定义语句为:& &&&&#define&&OS_TASK_SW()&&OSCtxSw()&&&&//&OSCtxSw()是用于实现任务切换的函数&&&&&&&& 3.2&OS_CPU_C.C&&&&&&&& &&&&OS_CPU_C.C包括10个C函数:OSTaskStkInit()函数和9个Hook函数。OSTaskStkInit()函数在任务创建时被调用,用来初始化任务堆栈。Hook函数用来扩展μC/OS-II的功能,可以不包含任何代码,但必须声明。最后添加Timer0初始化函数,包括选择工作模式,设定初值和使能中断,由于要使用C的Timer0实现时钟中断。&&&&&&&& &&&&在修改OSTaskStkInit()函数之前,需要先知道任务堆栈的结构。μC/OS-II为每一个任务都分配了任务堆栈,任务堆栈由系统堆栈和仿真堆栈两部分组成。由于C要求堆栈设置在片内RAM中,而片内RAM空间又非常有限,因此所有任务的任务堆栈设置在片内RAM中是几乎不可能的。只能把任务堆栈存放在片外RAM,并在片内RAM设置一个公共堆栈,即系统堆栈,栈底地址为?STACK。在任务切换时,需先保存当前任务堆栈内容,再恢复最高优先级任务堆栈内容,即进行任务堆栈和系统堆栈的复制。仿真堆栈是用来为可重进函数完成参数传递和存放局部变量的,设置在片外RAM,增长方向由上向下,栈指针为?C_XBP。&&&&&&&& &&&&所以,任务堆栈初始化可以看作是把处于停当态的最高优先级任务的任务堆栈内容复制到系统堆栈的过程。首先要获得任务堆栈最低地址和长度,由于需要从任务堆栈中恢复15个寄存器内容到系统堆栈,所以堆栈长度为15。然后从下向上依次复制寄存器内容,复制顺序是:PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7。最后保存仿真堆栈地址,并返回任务堆栈最低地址。这样就完成了任务堆栈初始化。&&&&&&&& 3.3&OS_CPU_A.ASM&&&&&&&& &&&&OS_CPU_A.ASM包括4个汇编语言函数,这4个函数都是不可重进的,并且定义了系统堆栈空间大小。&&&&&&&& &&&&OSStartHighRdy&()函数,用来使停当态任务中优先级最高的任务开始运行。OSCtxSw()函数,实现CPU正常运行时任务间的切换,即对当前任务堆栈的保存和对最高优先级任务堆栈的弹出,使最高优先级任务获取CPU的控制权。OSIntCtxSw()函数,作用是在中断服务程序中执行中断级别任务切换。它的尽大多数代码和OSCtxSw()函数是一样的,区别在于中断服务函数已经保存了寄存器内容,则不需要再在OSIntCtxSw()函数中保存。OSTickISR()函数,是系统时钟的中断服务程序,主要功能是检查是否有由于延时而被挂起的任务成为停当任务。假如有,就调用OSIntCtxSw()函数进行任务切换,从而运行最高优先级任务。由于μC/OS-II在每一个节拍都要检查有没有更高优先级的任务在等待执行,假如有,就要进行任务切换。所以,时钟节拍率越高,系统的额外负荷就越重。&&&&&&&& 4&系统测试 &&&&按照上述移植步骤,作者在Keil编译环境下实现了μC/OS-II在C上的具体移植。为了防止在编译时出现段过大的错误,需要选择内存模式为大模式,并相应的在STARTUP.A51&文件中设置XBPSTACK=1。创建2个任务来验证μC/OS-II移植的成功: &&&&OSTaskCreate&(TaskLed,&(void&*)0,&TaskStartStkLed,2); &&&&OSTaskCreate&(TaskSmg,&(void&*)0,&TaskStartStkSmg,3);& &&&&程序流程图如图1所示。任务TaskLed闪烁1次后,向任务TaskSmg发送消息并等待回复,任务TaskSmg得到消息后显示闪烁次数,并进行回复。终极效果为P4.0连接的LED闪烁1次,则P5口连接的数码管显示数字加1,最大显示为9,之后自动清零。经过4小时的连续实验,一切运行正常,这就验证了移植代码的正确性。&&&&&&&&
图1&程序流程图&&&&&&&& &&&&需要留意的是,C的使用涉及到SFRPAGR的保护,由于C拥有太多的模拟和数字资源,它们都需要相应的SFR控制,而标准8051保存的SFR空间不能满足所需的SFR寄存器,所以C另外安排了SFRPAGE来扩展更多的SFR寄存器空间。同一个SFR地址配合不同的SFRPAGE值,控制不同的资源。但假如是非中断情况下发生任务切换,并且在新任务中改变了SFRPAGE,那么回到以前的任务后很可能SFRPAGE已经改变,从而无法控制正确的资源,还有可能使程序跑飞。由于不同的资源往往需要不同的SFRPAGE,为了解决这一题目,在所有出现SFRPAGE赋值的地方都应当作临界代码保护起来,这样就可以完全避免因SFRPAGE值的错误而引出的题目[6]。&&&&&&&& 5&结论 &&&&μC/OS-II是一种实时性好、代码量小的多任务实时操纵系统,具有很好的稳定性与可靠性,可广泛移植到不同构架的微处理器上。本文完整的阐述了μC/OS-II的移植过程,并在C上实现了双任务同步通讯。论文对51系列单片机的μC/OS-II移植具有普遍的指导意义。
Copyright by ;All rights reserved.&C8051F系列单片机开发与C语言编程
秒后自动跳转到登录页
快捷登录:
举报类型:
不规范:上传重复资源
不规范:标题与实际内容不符
不规范:资源无法下载或使用
其他不规范行为
违规:资源涉及侵权
违规:含有危害国家安全等内容
违规:含有反动/色情等内容
违规:广告内容
详细原因:
任何违反下载中心规定的资源,欢迎Down友监督举报,第一举报人可获5-10下载豆奖励。
视频课程推荐
C8051F系列单片机开发与C语言编程
上传时间:
技术分类:
资源评价:
(8位用户参与评价)
已被下载&185&次
学习c8051f系列单片机语言的一本书,整体来说不错,_C程序编写
本资料共包含以下附件:
C8051F系列单片机开发与C语言编程.pdf
(8位用户参与评价)
down友评价
51CTO下载中心常见问题:
1.如何获得下载豆?
1)上传资料
2)评论资料
3)每天在首页签到领取
4)购买VIP会员服务,无需下载豆下载资源
5)更多途径:点击此处
2.如何删除自己的资料?
下载资料意味着您已同意遵守以下协议:
1.资料的所有权益归上传用户所有
2.未经权益所有人同意,不得将资料中的内容挪作商业或盈利用途
3.51CTO下载中心仅提供资料交流平台,并不对任何资料负责
4.本站资料中如有侵权或不适当内容,请邮件与我们联系()
5.本站不保证资源的准确性、安全性和完整性, 同时也不承担用户因使用这些资料对自己和他人造成任何形式的伤害或损失
相关专题推荐
本专题收录Java经典编程的实例源码,
在国内的开发语言中,java凭借这简单
本套视频教程是韩顺平老师,循序渐进
北京圣思园张龙(风中叶)老师的Java
讲述Arm嵌入式Linux系统下的C语言编程
这段视频是从尚学堂科技的教学课堂上
本套视频共78集,是由郝斌老师根据多
本视频专题共180集涵盖了C语言概述中
本视频专题共107集涵盖了Java概述、数
由传智播客毕向东老师讲解的Java基础
本专题为spring视频教程,共31集。教
本专题为C语言黑客编程系列视频教程,
本专题为韩顺平讲解的Java从入门到精
本专题为Java Web项目开发案例精粹视
SSH为struts+spring+hibernate的一个
本专题为疯狂Java李刚老师讲解的Stru
意见或建议:
联系方式:
您已提交成功!感谢您的宝贵意见,我们会尽快处理

我要回帖

更多关于 c8051f310程序例程 的文章

 

随机推荐