完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
给裸机移植printf功能 一.可变参数函数的原型声明 typeVAFunction(type arg1, type arg2, … ); 参数可以分为两部分:个数确定的固定参数和个数可变的可选参数。函数至少需 要一个固定参数,固定参数的声明和普通函数一样;可选参数由于个数不确定, 声明时用"..."表示。固定参数和可选参数公同构成一个函数的参数列表。 二.具体分析 下面是分析c库中的printf函数,但完全适用与内核printk的分析 三个关键宏:
复制代码 在这些宏中,va就是variableargument(可变参数)的意思; arg_ptr是指向可变参数表的指针; prev_param指可变参数表的前一个固定参数; type为可变参数的类型。 va_list也是一个宏,其定义为typedefchar * va_list,实质上是一char型指针。 char型指针的特点操作对其作用的结果是增1和减1(因为sizeof(char)为1)。 <1>va_start宏 (1)定义:
复制代码 (2)作用: 根据v取得可变参数表的首指针并赋值给ap,方法:最后一个固定参数v的地址+第一个变参对v的偏移地址,然后赋值给ap,这样ap就是可变参数表的首地址。 (3)举例: 如果有一 va函数的声明是voidva_test(char a, char b,char c, …),则它的固定参数依次是a,b,c,最后一个固定参数argN为c,因此就是va_start(arg_ptr,c)。 <2>va_arg宏 (1)定义:
复制代码 (2)作用: 指取出当前 arg_ptr所指的可变参数并将ap指针指向下一可变参数 <3>va_end宏 (1)定义为: #defineva_end ( list ) (2)作用: 结束可变参数的获取。va_end( list )实际上被定义为空,没有任何真实对应的代码,用于代码对称,与va_start对应。 三.实践 <1>怎样得到可变参数个数?归纳起来有三种办法: (1)函数的第一个参数,指定后续的参数个数,如func(intnum,...) (2)根据隐含参数,判断参数个数,如printf系列的,通过字符串中%的个数判断 (3)特殊情况下(如参数都是不大于0xFFFF的int), 可以一直向低处访问堆栈,直到 返回地址。 <2>举例说明三种情况: (1)情况1
复制代码 (2)情况2
复制代码 (3)情况3
复制代码 四.最简单的移植步骤 <1>我们许多选择: (1)移植linux的printf,版本越新越难移植,但是功能也越强大 (2)移植uboot的printf,实际uboot也是移植到内核的 (3)完全自己编写,但是功能比较弱 在保证整个裸机其他代码部分没有任何问题,且编译器也没有任何问题的情况下,上述三种方法都是可行的。 下面我们只是直接采用韦东山老师移植好的printf相关的库文件,他的办法是移植2.4内核版本的printf功能 <2>拷贝附件里相关库文件到裸机代码根目录 <3>修改makefile如附件所示,必须严格按照makefile里的相关设置 <4>make 编译并测试 测试代码如下:
复制代码 |
|
相关推荐
2个回答
|
|
内核太多东西可以让我们借鉴了,建议大家直接去移植内核的printk
|
|
|
|
你好,师兄,问一下我裸机编译printf出来这种提示
arm-linux-gcc -Wall -O2 -c -o main.o main.c arm-linux-ld -Tuart.lds -o uart_elf head.o init.o shoufa.o main.o main.o(.text+0xc): In function `main': : undefined reference to `printf' make: *** [uart.bin] Error 1 这是我的代码,请问我该怎么改,才能用printf #include int main() { char c= 'a'; printf("%cn", c); while(1) { ; } return 0; } |
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2161 浏览 6 评论
1968 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4524 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 22:42 , Processed in 0.589730 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号