C51编译器中mysql不支持存储过程的存储模式是

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
51单片机C编程概要二编程,概述,C,C51,51单片机,程序设计,单片机,单片机编程
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
51单片机C编程概要二
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口您现在的位置:&>&&>&&>&
育龙网&WWW.CHINA-B.C0M&& 日&&来源:互联网
核心提示:
深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类:8051
深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类:8051存储类型及存储区域,存储模式,存储器类型声明,变量类型声明,位变量与位寻址,特殊功能寄存器(SFR),C51指针l函数属性具体说明如下(8031为缺省CPU)。第一节KeilC51扩展关键字C51V4.0版本有以下扩展关键字(共19个):_at_idatasfr16alieninterruptsmallbdatalarge_task_Codebitpdatausingreentrantxdatacompactsbitdatasfr第二节内存区域(MemoryAreas):1.PragramArea:由Code说明可有多达64kBytes的程序存储器2.InternalDataMemory:内部数据存储器可用以下关键字说明:data:直接寻址区,为内部RAM的低128字节00H~7FHidata:间接寻址区,包括整个内部RAM区00H~FFHbdata:可位寻址区,20H~2FH3.ExternalDataMemory外部RAM视使用情况可由以下关键字标识:xdata:可指定多达64KB的外部直接寻址区,地址范围0000H~0FFFFHpdata:能访问1页(25bBytes)的外部RAM,主要用于紧凑模式(CompactModel)。4.SpeciacFunctionRegisterMemory8051提供128Bytes的SFR寻址区,这区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、I/O及其它部件,可由以下几种关键字说明:sfr:字节寻址比如sfrP0=0x80;为PO口地址为80H,“=”后H~FFH之间的常数。sfr16:字寻址,如sfr16T2=0xcc;指定Timer2口地址T2L=0xccT2H=0xCDsbit:位寻址,如sbitEA=0xAF;指定第0xAF位为EA,即中断允许
还可以有如下定义方法:sbit0V=PSW^2;(定义0V为PSW的第2位)sbit0V=0XDO^2;(同上)或bit0V-=0xD2(同上)。第三节存储模式存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:1.Small模式所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。2.Compact模式所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。3.large模式所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。提示:存储模式在C51编译器选项中选择。第四节存储类型声明变量或参数的存储类型可由存储模式指定缺省类型,也可由关键字直接声明指定。各类型分别用:code,data,idata,xdata,pdata说明,例:datauar1charcodearray[]=“hello!”;unsignedcharxdataarr[10];第五节变量或数据类型C51提供以下几种扩展数据类型:bit位变量值为0或1sbit从字节中定义的位变量0或1sfrsfr字节地址0~255sfr16sfr字地址0~65535其余数据类型如:char,enum,short,int,long,float等与ANSIC相同。第六节位变量与声明1.bit型变量bit型变量可用变量类型,函数声明、函数返回值等,存贮于内部RAM20H~2FH.注意:(1)用#pragmadISAble说明函数和用“usign”指定的函数,不能返回bit值。
(2)一个bit变量不能声明为指针,如bit*ptr;是错误的(3)不能有bit数组如:bitarr;错误。2.可位寻址区说明20H-2FH可作如下定义:intbdatai;charbdataarr,然后:sbitbito=in0;sbitbit15=I^15;sbitarr07=arr[0]^7;sbitarr15=arr[i]^7;第七节KeilC51指针C51支持一般指针(GenericPointer)和存储器指针(Memory_SpecificPointer)。1.一般指针一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型,例如:long*state;为一个指向long型整数的指针,而state本身则依存储模式存放。char*xdataptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。2.存储器指针基于存储器的指针说明时即指定了存贮类型,例如:chardata*str;str指向data区中char型数据intxdata*pow;pow指向外部RAM的int型整数。这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。3.指针转换即指针在上两种类型之间转化:l当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。l如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。l可以强行改变指针类型。第八节KeilC51函数C51函数声明对ANSIC作了扩展,具体包括:1.中断函数声明:中断声明方法如下:
voidserial_ISR()interrupt4[using1]{/*ISR*/}为提高代码的容错能力,在没用到的中断入口处生成iret语句,定义没用到的中断。/*definenotusedinterrupt,sogenerate"IRET"intheirentrance*/voidextern0_ISR()interrupt0{}/*notused*/voidtimer0_ISR()interrupt1{}/*notused*/voidextern1_ISR()interrupt2{}/*notused*/voidtimer1_ISR()interrupt3{}/*notused*/voidserial_ISR()interrupt4{}/*notused*/2.通用存储工作区3.选通用存储工作区由usingx声明,见上例。4.指定存储模式由smallcompact及large说明,例如:voidfun1(void)small{}提示:small说明的函数内部变量全部使用内部RAM.关键的经常性的耗时的地方可以这样声明,以提高运行速度。5.#pragmadISAble在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。6.递归或可重入函数指定在主程序和中断中都可调用的函数,容易产生问题。因为51和PC不同,PC使用堆栈传递参数,且静态变量以外的内部变量都在堆栈中;而51一般使用寄存器传递参数,内部变量一般在RAM中,函数重入时会破坏上次调用的数据。可以用以下两种方法解决函数重入:a、在相应的函数前使用前述“#pragmadISAble”声明,即只允许主程序或中断之一调用该函数;b、将该函数说明为可重入的。如下:voidfunc(param……)reentrant;KeilC51编译后将生成一个可重入变量堆栈,然后就可以模拟通过堆栈传递变量的方法。由于一般可重入函数由主程序和中断调用,所以通常中断使用与主程序不同的R寄存器组。另外,对可重入函数,在相应的函数前面加上开关“#pragmanoaregs”,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。7.指定PL/M-51函数由alien指定。
相关热词搜索:
-- 本站部分信息来源于互联网,不代表本站观点或立场,如有侵权,请来电告知,我们将及时处理STC89C52在Keil C51中找不到芯片组啊_百度知道
STC89C52在Keil C51中找不到芯片组啊
Project菜单,在弹出的下拉菜单中选中New Project选项但是CPU里没有STC的选项,怎么办?只有SST的,但是我的单片机是STC89C52的
我有更好的答案
我来回答你的问题吧:
在KEIL中,选择芯片的时候,是不能选STC系列的。不过,对于STC的任何一个系列,你都可以选择AT89S52系列。STC系列兼容51系列的单片机,也就是说,51系列的单片机有的功能STC一般都有。在书写程序的时候,编译器的检错,是不会具体针对你新建工作程时所选某一块芯片来检错的。虽STC系列兼容AT89S52的功能。但,有也不同之处,因为现在STC系列的大部分单片机都对其功能进行了增强。就连STC系列很普通的单片机都扩展了外部RAM使其数据存储器达到了1280byte
如果你要用到其增强的功能,那就是学会定义头文件。 万变不离其宗,学会了定义头文件,这个问题解决了。以下是我这一阵子,对头文件的学习及一些体会。可以让你少走很多弯路。:
二, reg51.头文件剖析
我们平时写单片机应用程序的时候,所使用的头文件大多都是用的的reg51.h或是用reg52.h。会写C51的人都会用,但对其头文件内部的定义有所了解的人确并不多。下面对其内部做详细解释,方便读者作进一步的了解,并能运用各类型号的单片机。因为增强型号的单片机的增强功能都是通过特殊功能寄存器控制。 打开
头文件,会发现是由大量的 sfr ,sbit的声明组成,甚至于还有sfr16.其实这样的声明都是与单片机内部功能寄存器(特殊功能寄存器)联系起来的,下面对其做出详细解释sfr:
声明变量 SFR 声明一个变量,它的声明与其它的C变量声明基本相同,唯一的区别,SFR在声明的同时为其指定特殊功能寄存器作为存储地址,而不同于C变量声明的整型,字符型等等由编译器自动分配存储空间。
如reg52.h头文件,第一条声明就是sfr P0
= 0x80; 此处声明一个变量P0,并指定其存储地址为特殊功能寄存器0x80;,在加入reg52.h头文件后。编写应用程序时P0就可以直接使用而无需定义,对P0的操作就是,对内部特殊功能寄存器(0x80对应用MCU的P0口)的操作,可进行读写操作。如果将第一条声明改为sfr K0
= 0x80; 那么,如果要把单片机的P0口全部拉低,则不能写P0=0x00;而应保存后再在应用程序中写成K0=0x00;否则编译器会提示“P0为未定义标识符”
使用方法:
[variable]
//为变量分配一个特殊功能寄存器。
等号右边,只能是十进制,十六进制整型的数据常量,,不允许带操作符的表达式
经典的8051内核支持的SFR地址从0x80H~0xFF 飞利浦80C51MX系列0x180H~0x1FF
SFR不能声明于任何函数内部,包括main函数。只能声明于函数外。
用SFR声明一个变量后,不能用取地址运算符&获取其地址, 编译无法通过,编译器会提示非法操作。
有一点须特别注意,51内核0x80~0xff,为特殊功能寄存器地址区间,但并不是所有的地址都有定义,如果说你所用的MCU芯片上对于某个地址没有定义,那么用sfr在定义变量的时候,不要把变量的地址分配到未定义的特殊功能寄存器上,虽然编译时能通过,用KEIL仿真时貌似是没有问题,但下载到芯片里运行时,是会出问题的。比如说,向一个未定义的特殊功能寄存器执行读操作,读出来的就是一个未知的数。(读者可自行测试,先把串口通信调通,然后做一个简单的人机交互。读出一个数后,再发给计算机,用串口调试助手或是串口监控查看。这用方法在仿真的时候很有用。)所以具体那些特殊功能寄存器能够用,就要查看你使用的芯片手册。5 若遇到增强性的单片机,只要知道其扩展的特殊功能寄存器的地址,用SFR定就可以很方便进行编程。sbit:
sbit 同样是声明一个变量,和SFR 使用方法类似,但是SBIT是用来声明一个位变量,因为,在51系列的应用中,非常有必要对SFR的单个位进行存取,而通过bit 数据类型,使其具备位寻址功能。
如,在reg52.h中有如下声明
= IE^7;sbit ET2
= IE^5; //8052 onlysbit ES
= IE^4;sbit ET1
= IE^3;sbit EX1
= IE^2;sbit ET0
= IE^1;sbit EX0
所以,对EA的操作即是对IE最高位的操作。但如果想让 SP
SBUF这些特殊功能寄存器具备位寻址,采用上述如IE类似的定义,是不行的,虽然修改后,在编译的时候不会出现错误,但只要用到你定义的位变量名时就会出错。原因是,只有特殊功能寄存器的地址是8的倍数(十六进制以0或8结尾)才能进行位寻址。 打开reg52.h头文件可以看到,所有用sbit声明了的特殊功能寄存器的地址均是以0或8结尾如硬要达到上述要求,可用带参的宏定义来完成。此处不做详细说明(意义并不大)。下面对sbit的使用做详细介绍:随着8051的应用,非常有必要对特殊功能寄存器的单个bit位进行存取,C51编译器通过sbit 数据类型,提供了对特殊功能寄存器的位操作。
以下是sbit的三种应用形式:一, sbit
name = sfr-name^bit-
PSW =0xD0;
OV= PSW^2;
EA= IE^7;二, sbit
name= sft-address^bit-
OV =0xD0^2;
CY =0xD0^7;
EA =0xA8^7;三, sbit
name= sbit-
EA =0xAF;现对上述三种形式的声明做必要的说明
第一种形式sbit
name = sfr-name^bit-如sbit
OV= PSW^2;
当中的这个特殊功能寄存器必须在此之前已经用sfr 定义,否则编译会出错。bit-position范围从0~7;
第二种形式
name= sft-address^bit-position如sbit
OV =0xD0^2;
与第一种形式不同之外在于,此处直接使用PSW的地址.第一种形式须先定义PSW
第三种形式.
name= sbit-address
OV =0xD2 是直接用的OV的地址OV的地址计算方式,是OV所在的寄存器地址加上OV的bit-position
不是所有的SFR都可位寻址。只有特殊功能寄存器的地址是8的倍数(十六进制以0或8结尾)才能进行位寻址,并且sbit声明的变量名,虽可以是任意取,但是最好不要以下划线开头,因为以下划线开头的都保留给了C51的头文件做保留字。sfr16: 声明变量
许多8051的派生型单片机,用两个连续地址的特殊功能寄存器,来存储一个16bit的值。例如,8052就用了0xCC和0xCD来保存定时/计数寄存器2的高字节和低字节。编译器提供sfr16这种数据类型,来保存两个字节的数据。虚拟出一个16bit的寄存器。
sfr16 T2 = 0xCC
存储方面为小端存储方式,低字节在前,高字节在后。定义时,只写低字节地址,如上,则定义T2为一个16位的特殊功能寄存器。 T2L= 0CCh, T2H= 0CDh
使用方法:
[variable]
[low_address]
等号右边,只写两个特殊功能寄存器的低地址,且只能是十进制,十六进制的整型数据常量,不允许带操作符的表达式
SFR不能声明于任何函数内部,包括main函数。只能声明于函数外。
用SFR声明一个变量后,不能用取地址运算符&获取其地址, 编译无法通过,编译器会提示非法操作。
4 当你向一个sfr16写入数据的时候,KEIL CX51 编译器生成的代码,是先写高字节,后写低字节,(可通过返汇编窗口查看)在有些情况下,这并非我们所想要的操作顺序。使用时,须注意。
5 当你所要写入sfr16的数据,当是高字节先写还是低字节先写非常重要的时候,就只能用sfr 这个关键字来定义,并且任意时刻只保存一个字节,这样操作才能保证写入正确。
采纳率:55%
Atmel-----
AT89C52--确认就行了
同意一楼。不过可以看看第三版里有没有或什么插件之类的,stc没用过
用AT89S52就行 如果用C语言 那头文件就加载reg52.h
对于STC新增加的一些特殊功能寄存器 在使用时可以自己定义
参考资料:
其他1条回答
为您推荐:
其他类似问题
keil的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(343)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_083071',
blogTitle:'c51 编译时致命的324个错误提醒',
blogAbstract:'& c51 编译时致命的324个错误提醒,与大家分享 收藏 致命错误
致命错误立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不
能访问一个特定的源包含文件时也产生致命错误
致命错误信息采用下面的格式
C51 FATAL-ERROR -
ACTION :&current action&
LINE: &line in which the error is detected&
ERROR: &corresponding error message&
C51 TERMIANTED.
C51 FATAL-ERROR -
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:6,
publishTime:1,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}我在51上移植ucosii的心得,希望能给朋友起到点点作用
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
我在51上移植ucosii的心得,希望能给朋友起到点点作用
  自嵌进式系统开发以来,很长时间都采用前后台系统软件设计模式:主程序为一个无穷循环,单任务顺序执行。通过设置一个或多个中断来处理异步事件。
  这种系统对于简单的应用是可以的,但对于实时性要求比较高的、处理任务较多的应用,就会暴露出实时性差、系统可靠性低、稳定性差等缺点。
   &C/OS-II 是一种基于优先级的抢占式多
任务实时操纵系统,包含了实时内核、任务治理、时间治理、任务间通讯同步(信号量,邮箱,消息队列)和内存治理等功能。它可以使各个任务独立工作,互不干 涉,很轻易实现准时而且无误执行,使实时应用程序的设计和扩展变得轻易,使应用程序的设计过程大为减化。而且它内核源代码公然,可移植性强,为编程职员提 供了很好的一个软件平台。通过&C/OS-II在VRS51 上的移植,可以把握移植和测试&C/OS-II
的实质内容,很轻易将其移植到其它的CPU平台上。
  &C/OS-II 先容
/OS-II是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。&C/OS-II尽大部分的代码是用ANSI的C语言编写的,包含一小部分汇 编代码,使之可供不同架构的微处理器使用。至今,从8位到*位,&C/OS-II已在超过40种不同架构上的微处理器上运行。&C/OS-II已经在世界 范围内得到广泛应用,包括很 多领域, 如手机、路由器、集线器、不中断电源、飞行器、医疗设备及产业控制
上。实际上,&C/OS-II已经通过了非常严格的 测试,并且得到了美国航空治理局(Federal Aviation
AdminiSTration)的认证,可以用在飞行器上。这说明&C/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety
critical)系统。除此以外,&C/OS-II 的鲜明特点就是源码公然,便于移植和维护。
  &C/OS-II 内核结构
   多任务系统中,内核负责治理各个任务 ,或者说为每个任务分配CPU 时间 ,并且负责任务之间的通讯。内核提供的基本服务是任务切换。
&C/OS-II可以治理多达64个任务。由于它的作者占用和保存了8个任务,所以留给用户应用程序最多可有56个任务。赋予各个任务的优先级必须是不相 同的。这意味着&C/OS-II不支持时间片轮转调度法 (round-robin scheduli ng)。&C/OS-II为每个任务设置独立的
堆栈空间,可以快速实现任务切换。&C/OS-II近似地每时每刻总是让优先级最高的停当任务处于运行状态,为了保证这一点,它在调用系统API
函数、中断结束、定时中断结束时总是执行调度算法,&C/OS-II通过事先计算好数据简化了运算量,通过精心设计停当表结构使得延时可预知。
  &C/OS-II 的移植
   移植就是使&C/OS-II能在VRS51上运行。为了方便移植,大部分的&C/OS-II的代码是用C语言编写的;但是仍需要用C语言和汇编语言编写 一些处理器硬件相关的代码,这是由于&C/OS-II在读/写处理器寄存器时,只能通过汇编语言来实现。由于&C/OS-II在设计时就已经充分考虑了可 移植性,所以&C/OS-II的移植相对来说是比较轻易的。
  硬件平台构成
  由于VRS51是一款80C51微控制器,片内包含了64KB的FLASH程序存储器,并且支持串行在线编程(ISP)。使它在ROM 空间上很适合做&C/OS-II的移植。
  编译器的选择
   由于&C/OS-II尽大部分代码是用标准的C语言编写的,所以C语言开发工具对于&C/OS-II是必不可少的。由于&C/OS-II是一个可剥夺行 的占先式内核,所以要求C编译器可以产生可重进型代码。笔者选择Keil
C51集成开发环境作为开发工具。该开发工具有C编译器,汇编器和链接定位器等工具构成。链接器用来将不同模块(编译过或汇编过的文件)链接成目标文件, 定位器则答应将代码和数据放置在目标处理器的指定内存中。Keil C51
还可以天生HEX格式的编程文件用于编程EPROM或是FLASH,同时可以实现完整软件仿真支持。Keil
C51支持所有8051变种的微控制器。通过设置编译控制选项,它完全可以满足编译&C/OS-II源代码的要求。
  可重进函数题目
   可重进函数可以被一个以上的任务调用,而不必担心数据被破坏。可重进函数任何时候都可以被中断,一段时间后又可以继续运行,而相应的数据不会丢失。由于 &C/OS-II是抢占式的实时多任务内核,同一个函数可能会被不同的任务调用,也可能会被中断,因此,移植&C/OS-II要求C语言编译器可以产生可 重进函数。但是正常情况下Keil
C51编译器中的函数不能重进。原因是由于8051系列微控制器的硬件堆栈很小,硬件堆栈指针SP最多只能在内部256字节的RAM内移动,不能够指向 64K的外部RA M空间。所以编译器使用固定的RAM地址来存储函数的参数和局部变量,而不是使用堆栈来存储。为了在Keil
C51中实现可重进函数,可以使用&reentrant&关键字声明该函数是可重进的。编译器可根据编译模式为可重进函数在内部RAM或外部RAM空间开 辟一个模拟堆栈来存储可重进函数的参数和局部变量。可重进函数的返回地址仍然保存在硬件堆栈中。Cx51编译手册不推荐使用模拟堆栈,原因是受8051寻 址方式的限制,模拟堆栈访问的效率很低。但是这是在Keil
C51中实现可重进函数的唯一方法。可重进函数模拟堆栈拥有独立于硬件堆栈指针的模拟堆栈指针。模拟堆栈及其指针在启动代码文件
&STARTUP.A51&中定义和初始化。
  &C/OS-II源文件移植
  在了解了P89V51RD2微处理器和Keil C51 编译器的技术细节的基础上,就可以开始&C/OS-II源文件移植的工作了。真正编写移植代码的工作就相对比较简单了。
& & 我相信很多学习RTOS的朋友也和我一样,能够掌握一个外面比较流行的RTOS;拥有一个属于自己的RTOS。我没有学习过操作系统的课程,我对计算机操作系统一点也不熟悉,所以我开始学习rtos没有选择linux而是选择了比较简单的ucosii.我上班的时候学习时间还是比较多的,我在网上下载了邵贝贝翻译的译本介绍ucosii的电子书,看了好几片吧,把ucosii的原理弄清楚了,就想能在51上移植一下,一是加深对ucosii的理解,二是学习移植ucosii的方法。下面就详细介绍我在51下的移植方法。
一.确定编译模式
& & 由于mcs-51芯片RAM太小,不可能不扩展外部RAM,反正是要扩展外部RAM所以我选择在大模式下编译,这样做有2个好处:1).不要修改原内核中ucosii.h这个文件。2.不要管数据的存取类型。
二.选择ucosii的版本
& & ucosii的版本现在有很多了,在我手里的就有2.00,2.52,2.76这三个版本,选择合适的版本很重要,我是选择了2.52这个版本,因为2.00比较老了,我就不说了,2.76我看了下文件结构好象和外面的资料讲的不一样,而2.52的资料到处都是,更重要的是网上有很多移植的资料。
三.处理OS_CFG.h文件
& &在开始移植时尽量把这个文件中多设置几个0,因为编译的代码越少出错的机会就少,当然要足够了解这个文件中的每个宏的意义。
四.编写OS_CPU.h和includes.h文件
& &这个我就不多说了,随便找个这样的文件改两下就可以了。
五.编写OS_CPU.C和OS_CPU_A.asm文件
& &我是这么来做的,我首先在OS_CPU.C和OS_CPU_A.asm文件中写上需要的几个函数,但全部是空函数,这样在编译的时候就不会报错了。
六.把整个项目统一管理起来
& &在做好上面的准备工作后,把文件按照书上的说明和其他的例子统一管理起来,然后就编译了,也许在这个时候还会有错误,不要紧,根据你对ucosii的理解一个一个到把他排除,我在做的时候在这个地方也出了错,我后来没有用ucosii.c这个文件了,我直接在工程中把ucosii.c中列出的文件加上去。
在这个时候可以写两个简单的任务去测试程序,并软件反真一下,看程序是否会跑到你想要的地方去。
七.编写需要的函数
& &如果上面在第6步编译的时候再也没有错误和警告了,那么说恭喜你了,你已经成功一半了,你只要写少量的代码和修改一点点原内核就大功告成了。
& &移植ucosii到51上也不是一件容易的事情,如何使你的程序跑的快和占用资源少是关键,我在51上的移植我只是我学习ucosii而已,给大家也只是想起个抛砖引玉的作用,希望能给想学ucosii的和正在想移植ucosii的朋友提供一点点参考的作用。我在移植完ucosii后自己也开始写一个小的rtos,我的目标是能在小的RAM的单片机上运行,现在已经完成了,我习惯模组化程序设计,虽然我这个小的RTOS只能管理8个模块,每个模块16个事件,但对我来说基本够了,我认为更重要的一点是,我的rtos能自动调整每个模块运行时间,换句话说哪个模块任务更重,则这个模块的运行时间就会更多。现在我也把我做的这个rtos成功地移植到了MOTOROLA MCU MC68HC908GP32上,感觉效果还不错的。
& &我愿意把我移植的ucosii和我自己的rtos共享给大家,我是给大家交流的,请大家也不要把他用到商业上,因为这有很多潜在的bug和危险,对你的一切使用后果我概不负责。
我扩展我的rots功能了.
现在我这个小的RTOS能管理36个任务,其中4个保留,1个空闲任务,还剩下31个可用,每个任务能管理16个事件,现在我也把我做的这个rtos成功地移植到了一个16位cpu上,其中这个项目上程序代码超过3万行,产品以经卖到了美国,在下一个产品将卖到德国和日本了。从开始量产到现在还没有出现过由于是rtos而引起bug,感觉效果很不错的了。
其中任务程序形式为
void Task(void)
& & INT16U wE
& & for(; ;)
& & &wEvent = OSEventPend(); &// 如果有事件则执行下面的程序,没有则任务切换.
  if(wEvent &(1&&TASKTM)) & & & &// 对应发生的时间事件
& & & // do something
  if(wEvent &(1&&X)) & & & & & &//对应其他事件
   // do something
}我的这个rtos非常适合控制类程序.
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved}

我要回帖

更多关于 该存储卡不支持xavc s 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信