1 / 12
文档名称:

printf在uCOS51上的移植和浮点数显示.txt

格式:txt   页数:12
下载后只包含 1 个 TXT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

printf在uCOS51上的移植和浮点数显示.txt

上传人:策划大师 2011/12/29 文件大小:0 KB

下载得到文件列表

printf在uCOS51上的移植和浮点数显示.txt

文档介绍

文档介绍:printf在uCOS51上的移植和浮点数显示
asdjf@ 2003/10/20
printf函数是C语言里应用最为广泛的函数之一,我们初学C语言时实现的第一个程序《Hello the world》,就包含printf语句。它的应用十分灵活,可以打印各种类型数据,可变数量的变量,表达式,是非常理想的输出函数,广泛用于结果输出,中间变量显示,调试等。然而,编译器将其作为标准库函数,不提供源代码,其本身代码量也偏大,无法实现嵌入式系统按需裁减的要求,并且有些printf库代码不支持重入。
解决方法是把Linux里的相关源码简化后移植到C51里。关键点在于理解变参函数、参数传递规则、浮点数存储格式。
C编译器一般将函数参数按从右至左的顺序依次压入堆栈(C51在使用reentrant关键字后也这么处理),函数内部处理参数变量时直接在堆栈上寻址,局部变量紧跟在参数后面存放,函数返回时出栈,参数和局部变量所占用空间自动释放。例如:
fun(char *fmt,char a,int b long c,float d) reentrant
的堆栈结构如图1所示:
------------------
|float d 4 bytes |
+10 ------------------
|long c 4 bytes |
+6 ------------------
|int b 2 bytes |
+4 ------------------
|char a 1 bytes |
+3 ------------------
|char *fmt 3bytes|
SP+0-->------------------
| 局部变量|
------------------

C51编译器从右向左依次将float/long/int/char/char *压入仿真堆栈,各种数据类型所占空间大小如图1,例如char占1字节,float占4字节等。值得一提的是,常数压栈的格式:0-255按1字节压栈,256-32767压成2字节,32768(8000H)或以上压成4字节,带有l/L结尾的常数占4字节。
上面的函数fun内部可以通过函数名称访问各个变量,C编译器自动把函数名转换成地址,如:访问long c转换成访问SP+6,访问char a转换成访问SP+3等。写成表达式为:
c=0x12345678;======>(SP+6)=0x12345678
a='y';=============>(SP+3)='y'
总之,上面的函数通过显式地指定函数名和数据类型完成参数的传递和访问,内部细节由C编译器完成,对用户透明。
这种方式的好处是表达清晰,结构严谨,屏蔽底层细节;坏处是不够灵活,参数必须在处理前显式确定并固定不变,这给我们用同一函数处理不同情况带来了困难,C的解决方案是引入“变参函数”(详见C语言大全),如下:
fun(char *fmt,...) reentrant
...表示有0到N个可变数量参数,C编译器此时不检查参数匹配,传递参数规律与一般函数相同。如果我们用这个函数取代前一个函数,但仍按前一函数的调用方式调用,那么,参数在堆栈里的位置仍如图1所示。此时,函数形参只有“...”没有具体变量名,如何引用形参变量呢?观察图1堆栈结构可知,如果知道堆栈内第一个参数的起址和每个参数的数据类型及他们的排列顺序,就可以通过指针访问指定的变量。例如:
知道堆栈内第一个参数的起址SP和每个参数的数据类型及排列顺序(char*/char/int/long/float),就可以通过SP,SP+3,SP+4,SP+6,SP+10访问原来必须通过参数名访问的fmt,a,b,c,d变量。写成C语言就是:
fun("yy",'y',(int)2,5L,-);
fun(char *fmt,...) reentrant
{
void *p;
p=&fmt;
//此时*p指向字符串"yy"首址,**p是字符串第一个字符'y'。
p=(char **)p+1;
//此时*((char *)p)为字符'y'。
p=(char *)p+1;
//此时*((int *)p)为0x0002。
p=(int *)p+1;
//此时*((long *)p)为0xC1480000,即--754标准格式。
p=(float *)p+1;
}
测试代码:
void fun(char *fmt,...) reentrant
{
void *p;
p=&fmt;
PrintChar(**((char **)p));
p=((char **)p)

最近更新

2025黄石西塞山区住房保障局招聘公益性岗2人备.. 36页

2026中国农业科学院第一批统一招聘(郑州果树.. 46页

2026中国能源建设集团云南省电力设计院有限公.. 44页

2026云南省面向南昌大学选调优秀毕业生笔试备.. 36页

2026年廉政准则竞赛试题精选答案 14页

2026天津市南开区招聘事业单位工作人员(含高.. 47页

2026年1月时事政治题库(基础题) 13页

2026年党建理论知识试题(必刷) 25页

2026年武汉民政职业学院单招职业适应性测试模.. 46页

2026年江西电力职业技术学院单招职业倾向性测.. 44页

2026年注册税务师考试题库【综合题】 47页

2026年注册造价工程师考试题库200道及完整答案.. 86页

2026年反恐知识竞赛试题附参考答案(b卷) 13页

2026年口腔正畸测试题200道学生专用 56页

2026年吉安职业技术学院单招职业适应性考试题.. 44页

2026年国家公务员考试题库500道【培优】 278页

基于项目的温室气体减排量评估技术规范 建筑.. 21页

2026年地方病控制题库含完整答案【典优】 40页

2026年自考专业(会计)考试题库200道含答案(预.. 84页

2026年学院党务组织员笔试题库必考题 42页

2026年安全员考试题库300道(突破训练) 85页

2026年锅炉操作工考试题库200道含答案【典型题.. 74页

2026年青少年学法用法网上知识竞赛试题库(考.. 43页

2026年安徽城市管理职业学院单招职业适应性考.. 37页

2025年湖南省建设工程工程量清单计价办法(新).. 51页

2025年江西信息应用职业技术学院单招职业适应.. 127页

2025年江西信息应用职业技术学院单招职业倾向.. 73页

喝酒给老婆的检讨书 6页

vae乳液低温发泡工艺 29页

隧道工程课后习题答案-中南大学-彭立敏 6页